From 55c2ee9990e05c2dd93b77e3f51f600d08cdc433 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 24 Aug 2024 14:30:54 -0700 Subject: [PATCH 01/18] more documentation --- include/kangaskhan_storage1.h | 13 ++++- include/kangaskhan_storage2.h | 9 +++- src/kangaskhan_storage1.c | 94 +++++++++++++++++------------------ src/kangaskhan_storage2.c | 76 ++++++++++++++-------------- 4 files changed, 105 insertions(+), 87 deletions(-) diff --git a/include/kangaskhan_storage1.h b/include/kangaskhan_storage1.h index e8425dea6..4d61010c7 100644 --- a/include/kangaskhan_storage1.h +++ b/include/kangaskhan_storage1.h @@ -18,6 +18,17 @@ enum KangaskhanStorageStates KANGASKHAN_STORAGE_IS_MONEY_USED_TM = 9, }; +enum KangaskhanStorageMenuActions +{ + MENU_CANCEL = 1, + MENU_STORE = 2, + MENU_TAKE = 3, + MENU_YES = 4, + MENU_NO = 5, + MENU_INFO = 6, + +}; + // size: 0x14C struct KangaskhanStorageWork { @@ -49,4 +60,4 @@ bool8 CreateKangaskhanStorage(u32 mode); void DeleteKangaskhanStorage(void); u32 KangaskhanStorageCallback(void); -#endif // GUARD_KANGASKHAN_STORAGE1_H \ No newline at end of file +#endif // GUARD_KANGASKHAN_STORAGE1_H diff --git a/include/kangaskhan_storage2.h b/include/kangaskhan_storage2.h index f7f92cb9e..24238ba41 100644 --- a/include/kangaskhan_storage2.h +++ b/include/kangaskhan_storage2.h @@ -5,6 +5,13 @@ #include "structs/menu.h" #include "structs/str_text.h" +enum KangaskhanStorage2States +{ + KANGASKHAN_STORAGE_2_INIT = 0, + KANGASKHAN_STORAGE_2_MAIN = 1, + KANGASKHAN_STORAGE_2_EXIT = 3 +}; + // size: 0x150 typedef struct unkStruct_203B20C { @@ -27,4 +34,4 @@ bool8 sub_8017E1C(void); u32 sub_8017E54(void); void sub_8017EF4(void); -#endif // GUARD_KANGASKHAN_STORAGE2_H \ No newline at end of file +#endif // GUARD_KANGASKHAN_STORAGE2_H diff --git a/src/kangaskhan_storage1.c b/src/kangaskhan_storage1.c index adb839eab..472b68028 100644 --- a/src/kangaskhan_storage1.c +++ b/src/kangaskhan_storage1.c @@ -28,11 +28,11 @@ static void UpdateKangaskhanStorageState(u32); static void sub_8016E80(void); static void sub_8016FF8(void); static void sub_8017598(void); -static void sub_80175FC(void); +static void BuildKangaskhanMainMenu(void); static void sub_80176B8(void); static void sub_8017758(void); static void sub_80177F8(void); -static void sub_8017828(void); +static void HandleKangaskhanMainMenu(void); static void sub_80178D0(void); static void sub_8017928(void); static void sub_80179A8(void); @@ -84,7 +84,7 @@ u32 KangaskhanStorageCallback(void) switch (gKangaskhanStorageWork->currState) { case KANGASKHAN_STORAGE_INIT: case KANGASKHAN_STORAGE_MAIN_MENU: - sub_8017828(); + HandleKangaskhanMainMenu(); break; case 13: case 14: @@ -188,13 +188,13 @@ static void sub_8016FF8(void) { switch (gKangaskhanStorageWork->currState) { case KANGASKHAN_STORAGE_INIT: - sub_80175FC(); + BuildKangaskhanMainMenu(); gKangaskhanStorageWork->unkE4 = TRUE; sub_8014248(gCommonKangStorage[gKangaskhanStorageWork->mode][KANG_DLG_WELCOME], 0, gKangaskhanStorageWork->menuAction1, gKangaskhanStorageWork->unk24, gKangaskhanStorageWork->unk4C, 4, 0, gKangaskhanStorageWork->unkE8, 12); break; case KANGASKHAN_STORAGE_MAIN_MENU: - sub_80175FC(); + BuildKangaskhanMainMenu(); gKangaskhanStorageWork->unkE4 = FALSE; sub_8014248(gCommonKangStorage[gKangaskhanStorageWork->mode][KANG_DLG_ANYTHING_ELSE], 0, gKangaskhanStorageWork->menuAction1, gKangaskhanStorageWork->unk24, gKangaskhanStorageWork->unk4C, 4, 0, gKangaskhanStorageWork->unkE8, 12); @@ -369,7 +369,7 @@ static void sub_8017598(void) sub_8012EA4(&gKangaskhanStorageWork->unk58, 0); } -static void sub_80175FC(void) +static void BuildKangaskhanMainMenu(void) { s32 index; s32 loopMax; @@ -377,23 +377,23 @@ static void sub_80175FC(void) MemoryFill16(gKangaskhanStorageWork->unk4C,0, sizeof(gKangaskhanStorageWork->unk4C)); loopMax = 0; gKangaskhanStorageWork->unk24[loopMax].text = gCommonStore[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 2; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_STORE; loopMax += 1; gKangaskhanStorageWork->unk24[loopMax].text = gCommonTake[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 3; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_TAKE; loopMax += 1; gKangaskhanStorageWork->unk24[loopMax].text = gCommonInfo[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 6; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_INFO; loopMax += 1; gKangaskhanStorageWork->unk24[loopMax].text = gCommonCancel[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 1; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_CANCEL; loopMax += 1; gKangaskhanStorageWork->unk24[loopMax].text = NULL; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 1; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_CANCEL; for (index = 0; index < loopMax; index++) { if (gKangaskhanStorageWork->unk4C[index] == 0) { @@ -418,15 +418,15 @@ static void sub_80176B8(void) MemoryFill16(gKangaskhanStorageWork->unk4C, 0, sizeof(gKangaskhanStorageWork->unk4C)); loopMax = 0; gKangaskhanStorageWork->unk24[loopMax].text = gCommonStore[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 2; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_STORE; loopMax++; gKangaskhanStorageWork->unk24[loopMax].text = gCommonInfo[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 6; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_INFO; loopMax++; gKangaskhanStorageWork->unk24[loopMax].text = NULL; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 1; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_CANCEL; for (index = 0; index < loopMax; index++) { if (gKangaskhanStorageWork->unk4C[index] == 0) { @@ -451,15 +451,15 @@ static void sub_8017758(void) MemoryFill16(gKangaskhanStorageWork->unk4C, 0, sizeof(gKangaskhanStorageWork->unk4C)); loopMax = 0; gKangaskhanStorageWork->unk24[loopMax].text = gCommonTake[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 3; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_TAKE; loopMax++; gKangaskhanStorageWork->unk24[loopMax].text = gCommonInfo[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 6; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_INFO; loopMax++; gKangaskhanStorageWork->unk24[loopMax].text = NULL; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 1; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_CANCEL; for (index = 0; index < loopMax; index++) { if (gKangaskhanStorageWork->unk4C[index] == 0) { @@ -482,29 +482,29 @@ static void sub_80177F8(void) loopMax = 0; gKangaskhanStorageWork->unk24[loopMax].text = gCommonYes[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 4; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_YES; loopMax++; gKangaskhanStorageWork->unk24[loopMax].text = gCommonNo[0]; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 5; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_NO; loopMax++; gKangaskhanStorageWork->unk24[loopMax].text = NULL; - gKangaskhanStorageWork->unk24[loopMax].menuAction = 1; + gKangaskhanStorageWork->unk24[loopMax].menuAction = MENU_CANCEL; } -static void sub_8017828(void) +static void HandleKangaskhanMainMenu(void) { s32 menuAction; if (sub_80144A4(&menuAction)) return; - if (menuAction != 1) + if (menuAction != MENU_CANCEL) gKangaskhanStorageWork->menuAction1 = menuAction; switch (menuAction) { - case 2: + case MENU_STORE: if (GetNumberOfFilledInventorySlots() == 0) UpdateKangaskhanStorageState(KANGASKHAN_STORAGE_NO_INV_ITEMS); else if (sub_801CF50(0)) @@ -512,7 +512,7 @@ static void sub_8017828(void) else UpdateKangaskhanStorageState(11); break; - case 3: + case MENU_TAKE: if (sub_801CF14(1)) UpdateKangaskhanStorageState(7); else if (GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) @@ -520,10 +520,10 @@ static void sub_8017828(void) else UpdateKangaskhanStorageState(20); break; - case 6: + case MENU_INFO: UpdateKangaskhanStorageState(2); break; - case 1: + case MENU_CANCEL: UpdateKangaskhanStorageState(3); break; } @@ -537,14 +537,14 @@ static void sub_80178D0(void) return; switch (menuAction) { - case 4: + case MENU_YES: MoveToStorage(&gKangaskhanStorageWork->storedItem); ShiftItemsDownFrom(gKangaskhanStorageWork->itemIndex); FillInventoryGaps(); UpdateKangaskhanStorageState(19); break; - case 1: - case 5: + case MENU_CANCEL: + case MENU_NO: UpdateKangaskhanStorageState(14); break; } @@ -559,15 +559,15 @@ static void sub_8017928(void) return; switch (menuAction) { - case 4: + case MENU_YES: gTeamInventoryRef->teamStorage[gKangaskhanStorageWork->storedItem.id] -= gKangaskhanStorageWork->storedItem.quantity; item.id = gKangaskhanStorageWork->storedItem.id; item.quantity = gKangaskhanStorageWork->storedItem.quantity; AddHeldItemToInventory(&item); UpdateKangaskhanStorageState(29); break; - case 1: - case 5: + case MENU_CANCEL: + case MENU_NO: UpdateKangaskhanStorageState(23); break; } @@ -582,7 +582,7 @@ static void sub_80179A8(void) return; switch (menuAction) { - case 4: + case MENU_YES: for (index = 0; index < INVENTORY_SIZE; index++) { if (sub_801AED0(index)) { MoveToStorage(&gTeamInventoryRef->teamItems[index]); @@ -595,8 +595,8 @@ static void sub_80179A8(void) sub_801AE84(); UpdateKangaskhanStorageState(19); break; - case 1: - case 5: + case MENU_CANCEL: + case MENU_NO: UpdateKangaskhanStorageState(14); break; } @@ -612,7 +612,7 @@ static void sub_8017A1C(void) return; switch (menuAction) { - case 4: + case MENU_YES: for (itemID = 0; itemID < NUMBER_OF_ITEM_IDS; itemID++) { if (sub_801CFE0(itemID)) { item.id = itemID; @@ -633,8 +633,8 @@ static void sub_8017A1C(void) sub_801CF94(); UpdateKangaskhanStorageState(29); break; - case 1: - case 5: + case MENU_CANCEL: + case MENU_NO: UpdateKangaskhanStorageState(23); break; } @@ -725,12 +725,12 @@ static void sub_8017C7C(void) sub_801A6E8(FALSE); if (sub_8012FD8(&gKangaskhanStorageWork->unk58) == 0) { sub_8013114(&gKangaskhanStorageWork->unk58, &menuAction); - if (menuAction != 1) + if (menuAction != MENU_CANCEL) gKangaskhanStorageWork->menuAction2 = menuAction; } switch (menuAction) { - case 2: + case MENU_STORE: sub_8099690(0); if (!IsNotMoneyOrUsedTMItem(gKangaskhanStorageWork->storedItem.id)) UpdateKangaskhanStorageState(KANGASKHAN_STORAGE_IS_MONEY_USED_TM); @@ -739,11 +739,11 @@ static void sub_8017C7C(void) else UpdateKangaskhanStorageState(17); break; - case 6: + case MENU_INFO: sub_8099690(0); UpdateKangaskhanStorageState(16); break; - case 1: + case MENU_CANCEL: UpdateKangaskhanStorageState(14); break; } @@ -757,12 +757,12 @@ static void sub_8017D24(void) sub_801CA08(FALSE); if (sub_8012FD8(&gKangaskhanStorageWork->unk58) == 0) { sub_8013114(&gKangaskhanStorageWork->unk58, &menuAction); - if (menuAction != 1) + if (menuAction != MENU_CANCEL) gKangaskhanStorageWork->menuAction3 = menuAction; } switch (menuAction) { - case 3: + case MENU_TAKE: if (GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) { sub_801CBB8(); UpdateKangaskhanStorageState(KANGASKHAN_STORAGE_TOO_MANY_ITEMS); @@ -772,10 +772,10 @@ static void sub_8017D24(void) else UpdateKangaskhanStorageState(27); break; - case 6: + case MENU_INFO: UpdateKangaskhanStorageState(26); break; - case 1: + case MENU_CANCEL: UpdateKangaskhanStorageState(23); break; } @@ -817,4 +817,4 @@ static void AdvanceToKangaskhanStorageFallbackState(void) if (!sub_80144A4(&temp)) UpdateKangaskhanStorageState(gKangaskhanStorageWork->fallbackState); -} \ No newline at end of file +} diff --git a/src/kangaskhan_storage2.c b/src/kangaskhan_storage2.c index a06bbc3db..12fc70673 100644 --- a/src/kangaskhan_storage2.c +++ b/src/kangaskhan_storage2.c @@ -17,7 +17,7 @@ static EWRAM_DATA_2 unkStruct_203B20C *sUnknown_203B20C = {0}; #include "data/kangaskhan_storage2.h" -static void sub_8017F10(u32); +static void UpdateKangaskhanStorage2State(u32); static void sub_8017F28(void); static void sub_8018100(void); static void sub_8018280(void); @@ -48,17 +48,17 @@ bool8 sub_8017E1C(void) sUnknown_203B20C->menuAction1 = 0; sUnknown_203B20C->menuAction2 = 0; sUnknown_203B20C->menuAction3 = 0; - sub_8017F10(0); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_INIT); return TRUE; } u32 sub_8017E54(void) { switch (sUnknown_203B20C->state) { - case 0: - sub_8017F10(1); + case KANGASKHAN_STORAGE_2_INIT: + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); break; - case 1: + case KANGASKHAN_STORAGE_2_MAIN: sub_8018588(); break; case 4: @@ -84,7 +84,7 @@ u32 sub_8017E54(void) case 14: sub_8018AE4(); break; - case 3: + case KANGASKHAN_STORAGE_2_EXIT: return 3; } return 0; @@ -98,7 +98,7 @@ void sub_8017EF4(void) } } -static void sub_8017F10(u32 newState) +static void UpdateKangaskhanStorage2State(u32 newState) { sUnknown_203B20C->state = newState; sub_8017F28(); @@ -112,7 +112,7 @@ static void sub_8017F28(void) RestoreUnkTextStruct_8006518(sUnknown_203B20C->unkF0); switch (sUnknown_203B20C->state) { - case 1: + case KANGASKHAN_STORAGE_2_MAIN: sUnknown_203B20C->unkF0[0] = sUnknown_80DB7B8; sUnknown_203B20C->unkF0[1] = sUnknown_80DB7B8; sUnknown_203B20C->unkF0[0] = sUnknown_80DB7B8; @@ -142,7 +142,7 @@ static void sub_8017F28(void) sUnknown_203B20C->unkF0[2] = sUnknown_80DB7E8; break; default: - case 0: + case KANGASKHAN_STORAGE_2_INIT: for (index = 0; index < 4; index++) sUnknown_203B20C->unkF0[index] = sUnknown_80DB7B8; break; @@ -154,7 +154,7 @@ static void sub_8017F28(void) static void sub_8018100(void) { switch (sUnknown_203B20C->state) { - case 1: + case KANGASKHAN_STORAGE_2_MAIN: sub_8012D60(&sUnknown_203B20C->unk70, sUnknown_203B20C->unk20, 0, sUnknown_203B20C->unk60, sUnknown_203B20C->menuAction1, 2); break; case 4: @@ -205,7 +205,7 @@ static void sub_8018100(void) case 14: sub_801B3C0(&sUnknown_203B20C->item); break; - case 0: + case KANGASKHAN_STORAGE_2_INIT: default: break; } @@ -351,7 +351,7 @@ static void sub_8018588(void) switch (menuAction) { case STORE_ACTION: if (GetNumberOfFilledInventorySlots() != 0 && !sub_801CF50(0)) - sub_8017F10(4); + UpdateKangaskhanStorage2State(4); else sub_8012EA4(&sUnknown_203B20C->unk70, 1); break; @@ -359,10 +359,10 @@ static void sub_8018588(void) if (sub_801CF14(1)) sub_8012EA4(&sUnknown_203B20C->unk70, 1); else - sub_8017F10(10); + UpdateKangaskhanStorage2State(10); break; case CANCEL_ACTION: - sub_8017F10(3); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_EXIT); break; } } @@ -387,25 +387,25 @@ static void sub_8018620(void) if (GetNumberOfFilledInventorySlots() == 0) { sub_801A928(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); } else - sub_8017F10(5); + UpdateKangaskhanStorage2State(5); } else { sUnknown_203B20C->itemIndex = sub_801A8AC(); sUnknown_203B20C->item = gTeamInventoryRef->teamItems[sUnknown_203B20C->itemIndex]; - sub_8017F10(6); + UpdateKangaskhanStorage2State(6); } break; case 4: sUnknown_203B20C->itemIndex = sub_801A8AC(); sUnknown_203B20C->item = gTeamInventoryRef->teamItems[sUnknown_203B20C->itemIndex]; - sub_8017F10(7); + UpdateKangaskhanStorage2State(7); break; case 2: sub_801A928(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); break; } } @@ -440,28 +440,28 @@ static void sub_80186F8(void) sub_801CF94(); if (!sub_801CF14(1) && GetNumberOfFilledInventorySlots() < INVENTORY_SIZE) - sub_8017F10(11); + UpdateKangaskhanStorage2State(11); else { sub_801CBB8(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); } } else { sUnknown_203B20C->id = sub_801CB24(); xxx_init_itemslot_8090A8C(&sUnknown_203B20C->item, sUnknown_203B20C->id, 0); sUnknown_203B20C->item.quantity = 1; - sub_8017F10(13); + UpdateKangaskhanStorage2State(13); } break; case 4: sUnknown_203B20C->id = sub_801CB24(); xxx_init_itemslot_8090A8C(&sUnknown_203B20C->item, sUnknown_203B20C->id, 0); sUnknown_203B20C->item.quantity = 1; - sub_8017F10(14); + UpdateKangaskhanStorage2State(14); break; case 2: sub_801CBB8(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); break; case 1: sub_801AD34(0); @@ -488,16 +488,16 @@ static void sub_8018854(void) if (GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) { error: sub_801CBB8(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); } else - sub_8017F10(11); + UpdateKangaskhanStorage2State(11); } else goto error; break; case 2: - sub_8017F10(11); + UpdateKangaskhanStorage2State(11); break; case 1: sub_8018280(); @@ -534,10 +534,10 @@ static void sub_8018904(void) if (GetNumberOfFilledInventorySlots() == 0) { sub_801A928(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); } else - sub_8017F10(5); + UpdateKangaskhanStorage2State(5); } } else @@ -545,10 +545,10 @@ static void sub_8018904(void) break; case INFO_ACTION: sub_8099690(0); - sub_8017F10(7); + UpdateKangaskhanStorage2State(7); break; case CANCEL_ACTION: - sub_8017F10(5); + UpdateKangaskhanStorage2State(5); break; } } @@ -572,7 +572,7 @@ static void sub_80189C8(void) if (GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) sub_8012EA4(&sUnknown_203B20C->unk70, 1); else if (IsThrowableItem(sUnknown_203B20C->item.id)) - sub_8017F10(12); + UpdateKangaskhanStorage2State(12); else { gTeamInventoryRef->teamStorage[sUnknown_203B20C->item.id] -= sUnknown_203B20C->item.quantity; item.id = sUnknown_203B20C->item.id; @@ -584,20 +584,20 @@ static void sub_80189C8(void) { error: sub_801CBB8(); - sub_8017F10(1); + UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); } else - sub_8017F10(11); + UpdateKangaskhanStorage2State(11); } else goto error; } break; case INFO_ACTION: - sub_8017F10(14); + UpdateKangaskhanStorage2State(14); break; case CANCEL_ACTION: - sub_8017F10(11); + UpdateKangaskhanStorage2State(11); break; } } @@ -608,7 +608,7 @@ static void sub_8018AC8(void) case 2: case 3: sub_801B450(); - sub_8017F10(5); + UpdateKangaskhanStorage2State(5); break; case 0: case 1: @@ -623,7 +623,7 @@ static void sub_8018AE4(void) case 2: case 3: sub_801B450(); - sub_8017F10(11); + UpdateKangaskhanStorage2State(11); break; case 0: case 1: From 0fca0de856955dd6533b5749a10c8451fa5cd83c Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 25 Aug 2024 10:41:00 -0700 Subject: [PATCH 02/18] decomp two more trap funcs --- asm/code_807FCD4.s | 119 --------------------------------------------- src/trap.c | 48 ++++++++++++++++++ 2 files changed, 48 insertions(+), 119 deletions(-) diff --git a/asm/code_807FCD4.s b/asm/code_807FCD4.s index 33fdb27a1..3049241bf 100644 --- a/asm/code_807FCD4.s +++ b/asm/code_807FCD4.s @@ -5,125 +5,6 @@ .text - thumb_func_start HandleSealTrap -HandleSealTrap: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - mov r8, r0 - adds r7, r1, 0 - movs r0, 0 - mov r9, r0 - cmp r7, 0 - beq _08080870 - mov r0, r8 - movs r2, 0x1 - bl HasSafeguardStatus - lsls r0, 24 - cmp r0, 0 - bne _08080870 - ldr r0, [r7, 0x70] - movs r5, 0 - movs r6, 0x1 - movs r1, 0x8C - lsls r1, 1 - adds r2, r0, r1 - adds r3, r2, 0 - mov r12, sp - movs r4, 0x3 -_080807F6: - ldrb r1, [r2] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _08080816 - ldrb r1, [r2, 0x1] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - bne _08080816 - mov r0, r12 - adds r0, 0x4 - mov r12, r0 - subs r0, 0x4 - stm r0!, {r3} - adds r5, 0x1 -_08080816: - adds r2, 0x8 - adds r3, 0x8 - subs r4, 0x1 - cmp r4, 0 - bge _080807F6 - cmp r5, 0 - beq _08080848 - adds r0, r5, 0 - bl DungeonRandInt - lsls r0, 2 - mov r1, sp - adds r3, r1, r0 - ldr r2, [r3] - ldrb r1, [r2, 0x1] - movs r0, 0x1 - orrs r0, r1 - strb r0, [r2, 0x1] - ldr r0, _0808085C - ldr r1, [r3] - movs r2, 0 - bl sub_80928C0 - movs r0, 0x1 - mov r9, r0 -_08080848: - mov r1, r9 - cmp r1, 0 - beq _08080864 - ldr r0, _08080860 - ldr r2, [r0] - mov r0, r8 - adds r1, r7, 0 - bl sub_80522F4 - b _08080870 - .align 2, 0 -_0808085C: .4byte gFormatItems -_08080860: .4byte gUnknown_80FDB04 -_08080864: - ldr r0, _08080880 - ldr r2, [r0] - mov r0, r8 - adds r1, r7, 0 - bl sub_80522F4 -_08080870: - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08080880: .4byte gUnknown_80FDB2C - thumb_func_end HandleSealTrap - - thumb_func_start HandleWhirlwindTrap -HandleWhirlwindTrap: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - cmp r4, 0 - beq _0808089E - movs r0, 0x8 - bl DungeonRandInt - adds r2, r0, 0 - adds r0, r5, 0 - adds r1, r4, 0 - bl sub_807CD9C -_0808089E: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end HandleWhirlwindTrap - thumb_func_start HandlePokemonTrap HandlePokemonTrap: push {r4-r7,lr} diff --git a/src/trap.c b/src/trap.c index 9aa45b7ce..011786fa8 100644 --- a/src/trap.c +++ b/src/trap.c @@ -11,6 +11,7 @@ #include "dungeon_engine.h" #include "dungeon_items.h" #include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes.h" #include "dungeon_random.h" #include "dungeon_util.h" #include "items.h" @@ -44,6 +45,9 @@ extern u8 *gUnknown_80FED04[]; extern u8 *gUnknown_80FED0C[]; extern u8 *gUnknown_80FDAA0[]; extern u8 *gUnknown_80FDA80[]; +extern u8 *gUnknown_80FDB04[]; +extern u8 *gUnknown_80FDB2C[]; + extern s16 gUnknown_80F4E0E; extern s16 gUnknown_80F4F84; @@ -90,6 +94,7 @@ u8 sub_803D6FC(void); Entity *sub_8045684(u8, Position *, u8); extern void sub_807D148(Entity *pokemon, Entity *target, u32 r2, Position *r3); extern void sub_807DF38(Entity *pokemon, Entity *target, Position *pos, u32, u8 moveType, s16); +extern void sub_807CD9C(Entity *, Entity *, u32 direction); void sub_807FC3C(Position *pos, u32 trapID, u32 param_3) { @@ -676,3 +681,46 @@ void HandleWonderTile(Entity *pokemon, Entity *target) { sub_8079E34(pokemon, target, FALSE); } + +void HandleSealTrap(Entity *param_1,Entity *param_2) +{ + Move *move; + s32 moveIndex; + s32 i; + s32 counter; + EntityInfo *info; + Move *moveStack [MAX_MON_MOVES]; + bool8 flag = FALSE; + + + if (param_2 != NULL && !HasSafeguardStatus(param_1, param_2, TRUE)) { + info = param_2->info; + counter = 0; + for(i = 0; i < MAX_MON_MOVES;i++) + { + move = &info->moves[i]; + if ((move->moveFlags & MOVE_FLAG_EXISTS) && !(move->moveFlags2 & MOVE_FLAG_SEALED)) { + moveStack[counter] = move; + counter++; + } + } + if (counter != 0) { + moveIndex = DungeonRandInt(counter); + moveStack[moveIndex]->moveFlags2 |= MOVE_FLAG_SEALED; + sub_80928C0(gUnknown_202DE58,moveStack[moveIndex], NULL); + flag = TRUE; + } + if(flag) + sub_80522F4(param_1,param_2,*gUnknown_80FDB04); + else + sub_80522F4(param_1,param_2,*gUnknown_80FDB2C); + } +} + +void HandleWhirlwindTrap(Entity *pokemon, Entity *target) +{ + if(target) + { + sub_807CD9C(pokemon, target, DungeonRandInt(NUM_DIRECTIONS)); + } +} From 24da346796d42646e6d4039f171cab7be1aecfcf Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 25 Aug 2024 20:52:19 -0700 Subject: [PATCH 03/18] more documentation/cleanup --- include/constants/wonder_mail.h | 1 + include/status.h | 1 + include/wonder_mail_4.h | 15 ++++ include/wonder_mail_5.h | 9 +++ src/code_8048480.c | 1 - src/friend_rescue.c | 25 ++---- src/pelipper_board.c | 26 +++--- src/save_menu.c | 9 ++- src/status_actions.c | 1 - src/thank_you_wonder_mail.c | 136 +++++++++++++++++--------------- src/weather.c | 1 - src/wonder_mail.c | 26 ++---- src/wonder_mail_2.c | 29 ++++--- src/wonder_mail_4.c | 15 ++-- src/wonder_mail_5.c | 33 ++++---- src/wonder_mail_6.c | 72 ++++++++--------- src/wonder_mail_main_menu.c | 8 +- 17 files changed, 203 insertions(+), 205 deletions(-) create mode 100644 include/wonder_mail_4.h create mode 100644 include/wonder_mail_5.h diff --git a/include/constants/wonder_mail.h b/include/constants/wonder_mail.h index d0cc5c6b6..08ecdfeef 100644 --- a/include/constants/wonder_mail.h +++ b/include/constants/wonder_mail.h @@ -41,6 +41,7 @@ enum WonderMailTypes WONDER_MAIL_TYPE_WONDER = 5, WONDER_MAIL_TYPE_COMPLETED, WONDER_MAIL_TYPE_OKD, + MAX_WONDER_MAIL_TYPES }; // Used in CreateRescueTitle and CreateRescueDescription diff --git a/include/status.h b/include/status.h index 98b290e79..0526c007a 100644 --- a/include/status.h +++ b/include/status.h @@ -36,5 +36,6 @@ void HandleStockpile(Entity * pokemon, Entity * target); void InvisibleStatusTarget(Entity * pokemon, Entity * target); void PerishSongTarget(Entity * pokemon, Entity * target); void EncoreStatusTarget(Entity * pokemon, Entity * target); +void sub_8078A58(struct Entity *pokemon, struct Entity *target, s32 param_3, s32 param_4); #endif diff --git a/include/wonder_mail_4.h b/include/wonder_mail_4.h new file mode 100644 index 000000000..e24e7f4b5 --- /dev/null +++ b/include/wonder_mail_4.h @@ -0,0 +1,15 @@ +#ifndef WONDER_MAIL_4_H +#define WONDER_MAIL_4_H + +#include "structs/str_text.h" + +u32 sub_80306A8(u32 wonderMailType, u32 r1, UnkTextStruct2_sub *r2, u32 r3); +u32 sub_8030768(u8 r0); +u8 sub_80307EC(void); +void sub_8030810(u8 r0); +void sub_803084C(void); +u8 *sub_8030894(void); +void sub_803092C(void); +bool8 HasNoWonderMailType(u32 wonderMailType); + +#endif /* ifndef WONDER_MAIL_4_H */ diff --git a/include/wonder_mail_5.h b/include/wonder_mail_5.h new file mode 100644 index 000000000..873886b3d --- /dev/null +++ b/include/wonder_mail_5.h @@ -0,0 +1,9 @@ +#ifndef WONDER_MAIL_5_H +#define WONDER_MAIL_5_H + +bool8 sub_8030D40(u8 mailIndex, s32 windowID); +u32 sub_8030DA0(void); +void sub_8030DE4(void); + + +#endif /* ifndef WONDER_MAIL_5_H */ diff --git a/src/code_8048480.c b/src/code_8048480.c index 8dfd6c681..bfbb8ad80 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -112,7 +112,6 @@ extern void sub_8072008(Entity *pokemon, Entity *r1, u32 r2, u8 r3, u32); extern void LevelDownTarget(Entity *pokemon, Entity *r1, u32 r2); extern void sub_80522F4(Entity *pokemon, Entity *r1, const u8[]); extern void sub_806F370(Entity *pokemon, Entity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32); -extern void sub_8078A58(Entity *, Entity *, s32, u32); extern s32 sub_8042520(Entity *); Entity *sub_80696FC(Entity *); extern void sub_806A7E8(EntityInfo *, s32); diff --git a/src/friend_rescue.c b/src/friend_rescue.c index 761bc40fe..86024ccd2 100644 --- a/src/friend_rescue.c +++ b/src/friend_rescue.c @@ -25,6 +25,8 @@ #include "text_util.h" #include "text1.h" #include "text2.h" +#include "wonder_mail_4.h" +#include "wonder_mail_5.h" extern void SetFriendRescueMenuState(u32); @@ -298,14 +300,6 @@ void sub_80353BC(void); void sub_8035424(void); void sub_8035430(void); -extern u32 sub_8030DA0(void); -extern void sub_8030DE4(void); -extern void sub_803092C(void); -extern u32 sub_8030768(u32); -extern void sub_803084C(void); -extern void sub_8030D40(u8, u32); -extern void sub_8030810(u32); -extern u8 sub_80307EC(void); extern u32 sub_8031DCC(void); extern void sub_8031E00(void); extern u32 sub_8039068(u32, u8 *passwordBuffer, unkStruct_203B480 *r0); @@ -313,9 +307,6 @@ extern u32 sub_8039068(u32, u8 *passwordBuffer, unkStruct_203B480 *r0); extern void sub_8031E10(void); extern u8 sub_800D588(void); extern u32 sub_8023CE8(void); -extern u32 sub_80306A8(u32 wonderMailType, u32, UnkTextStruct2_sub *, u32); -extern u32 sub_8030894(void); -extern void sub_803092C(void); extern bool8 sub_8031D70(u32 mailIndex, s32); extern s32 sub_8037B28(u32); @@ -833,8 +824,8 @@ void sub_8032828(void) case 0x32: if (sub_8030894() == 0) { ResetUnusedInputStruct(); - xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); - sub_80306A8(1, 0, NULL, 6); + sub_800641C(NULL, TRUE, TRUE); + sub_80306A8(WONDER_MAIL_TYPE_SOS, 0, NULL, 6); } break; case 0x35: @@ -930,8 +921,8 @@ void sub_8032828(void) case 0x1D: if (sub_8030894() == 0) { ResetUnusedInputStruct(); - xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); - sub_80306A8(4, 0, NULL, 6); + sub_800641C(NULL, TRUE, TRUE); + sub_80306A8(WONDER_MAIL_TYPE_AOK, 0, NULL, 6); } break; case 0x20: @@ -1037,8 +1028,8 @@ void sub_8032828(void) if (sub_8030894() != 0) break; ResetUnusedInputStruct(); - xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); - sub_80306A8(1, 0, NULL, 6); + sub_800641C(NULL, TRUE, TRUE); + sub_80306A8(WONDER_MAIL_TYPE_SOS, 0, NULL, 6); break; case 0x15: sub_8014248(&gUnknown_80E2F78[0], 0, 6, gUnknown_80E2290, NULL, 4, 0, NULL, 0x101); diff --git a/src/pelipper_board.c b/src/pelipper_board.c index e7ec9b563..ec7c65f29 100644 --- a/src/pelipper_board.c +++ b/src/pelipper_board.c @@ -66,20 +66,18 @@ const u8 gPelipperBoard_JobList[] = "Job List"; const u8 gPelipperBoard_Accepted[] = "Accepted"; const u8 gPelipperStatusSlash[] = "/"; -extern void sub_802ECB4(void); -extern void nullsub_134(void); -extern void sub_802ED4C(void); -extern void sub_802EDBC(void); -extern void sub_802EEA0(void); -extern void sub_802EEBC(void); -extern void sub_802E94C(void); -extern void sub_802EA58(void); -extern void CreatePelipperBoardMenu(void); -extern void sub_802EC10(void); - -extern void CreatePelipperAcceptedStatusBox(u32); - -void SetPelipperBoardState(u32); +static void sub_802ECB4(void); +static void nullsub_134(void); +static void sub_802ED4C(void); +static void sub_802EDBC(void); +static void sub_802EEA0(void); +static void sub_802EEBC(void); +static void sub_802E94C(void); +static void sub_802EA58(void); +static void CreatePelipperBoardMenu(void); +static void sub_802EC10(void); +static void CreatePelipperAcceptedStatusBox(u32); +static void SetPelipperBoardState(u32); u32 sub_802E864(void) { diff --git a/src/save_menu.c b/src/save_menu.c index 3f589a5a8..4c7601cf6 100644 --- a/src/save_menu.c +++ b/src/save_menu.c @@ -114,10 +114,11 @@ ALIGNED(4) const u8 gUnknown_80E7178[] = _("{CENTER_ALIGN}The data could not be "{CENTER_ALIGN}Please turn off the power and remove\n" "{CENTER_ALIGN}and reinsert the DS Card."); -extern void sub_8038440(); -extern void sub_80384D0(); -extern void sub_8038830(); -extern void sub_80388C4(void); +static void sub_8038830(void); +static void sub_80388C4(void); + +extern void sub_8038440(void); +extern void sub_80384D0(void); extern void sub_80140F8(void); void CreateSaveMenu(s32 currMenu) diff --git a/src/status_actions.c b/src/status_actions.c index 12e72f85d..b94e59c9f 100644 --- a/src/status_actions.c +++ b/src/status_actions.c @@ -35,7 +35,6 @@ extern void sub_807F43C(Entity *, Entity *); extern void sub_807DC68(Entity *, Entity *); -extern void sub_8078A58(Entity *, Entity *, s32, u32); extern u32 sub_803D73C(u32); extern void sub_8045C28(Item *, u8 , u8); extern void sub_80464C8(Entity *, Position *, Item *); diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index b6b33e4f7..9674d84f9 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -23,6 +23,8 @@ #include "text1.h" #include "text2.h" #include "thank_you_wonder_mail.h" +#include "wonder_mail_4.h" +#include "wonder_mail_5.h" static EWRAM_DATA_2 WonderMailStruct_203B2C4 *sUnknown_203B2C4 = {0}; @@ -54,9 +56,24 @@ static EWRAM_DATA_2 WonderMailStruct_203B2C4 *sUnknown_203B2C4 = {0}; #define PROCESS_THANK_YOU_PASSWORD 0x27 #define THANK_YOU_PASSWORD_WRONG 0x28 +enum menuActions { + CANCEL_ACTION, + SEND_THANK_YOU_MAIL_ACTION, + GET_THANK_YOU_MAIL_ACTION, + // 3 - GAME_LINK + // 4 - ??? + // 5 - PASSWORD + YES_ACTION = 0x7, + NO_ACTION, + SEND_ITEM_ACTION, + NO_SEND_ITEM_ACTION, + CONFIRM_ACTION, + INFO_ACTION, +}; + const Item gUnknown_80DED44 = { - 1, 0, 0 + ITEM_FLAG_EXISTS, 0, ITEM_NOTHING }; extern char gUnknown_202E5D8[0x50]; @@ -88,9 +105,9 @@ extern const u8 DontSendItem_Text[]; const MenuItem gUnknown_80DED78[3] = { - {"Confirm", 0xB}, - {"Info", 0xC}, - {NULL, 0x0}, + {"Confirm", CONFIRM_ACTION}, + {"Info", INFO_ACTION}, + {NULL, CANCEL_ACTION}, }; // Unused @@ -107,40 +124,40 @@ const UnkTextStruct2 gUnknown_80DEDA0 = const MenuItem gThankYouMailMainMenuItems[4] = { - {"Send Thank-You Mail", 0x1}, - {"Get Thank-You Mail", 0x2}, - {"Cancel", 0x0}, - {NULL, 0x0}, + {"Send Thank-You Mail", SEND_THANK_YOU_MAIL_ACTION}, + {"Get Thank-You Mail", GET_THANK_YOU_MAIL_ACTION}, + {"Cancel", CANCEL_ACTION}, + {NULL, CANCEL_ACTION}, }; const MenuItem gUnknown_80DEE08[4] = { {"Game Link cable", WONDER_MAIL_GAME_LINK}, {"Password", WONDER_MAIL_PASSWORD}, - {"Cancel", 0x0}, - {NULL, 0x0}, + {"Cancel", CANCEL_ACTION}, + {NULL, CANCEL_ACTION}, }; const MenuItem gUnknown_80DEE44[3] = { - {"Yes", 0x7}, - {"Cancel", 0x0}, - {NULL, 0x0}, + {"Yes", YES_ACTION}, + {"Cancel", CANCEL_ACTION}, + {NULL, CANCEL_ACTION}, }; const MenuItem gUnknown_80DEE60[3] = { - {"Yes", 0x7}, - {"No", 0x8}, - {NULL, 0x0}, + {"Yes", YES_ACTION}, + {"No", NO_ACTION}, + {NULL, CANCEL_ACTION}, }; const MenuItem gUnknown_80DEE7C[4] = { - {SendItem_Text, 0x9}, - {DontSendItem_Text, 0xA}, - {"Cancel", 0x0}, - {NULL, 0x0}, + {SendItem_Text, SEND_ITEM_ACTION}, + {DontSendItem_Text, NO_SEND_ITEM_ACTION}, + {"Cancel", CANCEL_ACTION}, + {NULL, CANCEL_ACTION}, }; ALIGNED(4) static const u8 DontSendItem_Text[] = _("Don{APOSTROPHE}t Send Item"); @@ -148,29 +165,24 @@ ALIGNED(4) static const u8 SendItem_Text[] = "Send Item"; const MenuItem gUnknown_80DEEBC[3] = { - {"Send w/o Item", 0xA}, - {"Cancel", 0x0}, - {NULL, 0x0}, + {"Send w/o Item", NO_SEND_ITEM_ACTION}, + {"Cancel", CANCEL_ACTION}, + {NULL, CANCEL_ACTION}, }; const MenuItem gUnknown_80DEEE4[4] = { - {"Yes", 0x7}, - {"No", 0x8}, - {"Cancel", 0x0}, - {NULL, 0x0}, + {"Yes", YES_ACTION}, + {"No", NO_ACTION}, + {"Cancel", CANCEL_ACTION}, + {NULL, CANCEL_ACTION}, }; #include "data/thank_you_wonder_mail.h" -extern void sub_8030810(u32); extern u32 sub_8031DCC(void); extern void sub_8031E00(void); -extern u32 sub_8030768(u32); -extern s8 sub_80307EC(void); -extern void sub_8030D40(u8, u32); -extern u32 sub_8030DA0(); extern void HandleThankYouMailPelipperMainMenu(); extern void sub_802AAC8(); extern void ReturnToThankYouMailMainMenu(); @@ -211,19 +223,13 @@ extern void HandleThankYouMailPasswordMenu(); extern void sub_802A9FC(); extern void sub_802A828(); extern void sub_802A850(); -extern void sub_8030DE4(); -extern void sub_803084C(); extern void sub_8031E10(); extern void SetThankYouMailMenuState(u32); -extern void sub_803092C(void); extern s32 sub_8037B28(u32); -extern u32 sub_8030894(void); -extern void sub_80306A8(u32, u32, u32, u32); extern u8 sub_800D588(void); extern u32 GetDungeonTeamRankPts(DungeonLocation *, u32); extern void sub_8031D70(u8, u32); -extern void sub_803092C(void); extern void sub_8011C28(u32); extern u32 sub_8039068(u32, u8 *r1, unkStruct_203B480 *r0); @@ -543,11 +549,11 @@ void sub_802A090(void) { switch(menuAction) { - case 7: + case YES_ACTION: SetThankYouMailMenuState(SELECT_THANK_YOU_MAIL_COMMS); break; - case 8: - case 0: + case NO_ACTION: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; default: @@ -601,11 +607,11 @@ void sub_802A174(void) switch(menuAction) { - case 0xB: + case CONFIRM_ACTION: sub_803084C(); SetThankYouMailMenuState(0xe); break; - case 0xC: + case INFO_ACTION: sUnknown_203B2C4->fallbackState = 0x2b; RestoreUnkTextStruct_8006518(sUnknown_203B2C4->unk3BC); ResetUnusedInputStruct(); @@ -613,7 +619,7 @@ void sub_802A174(void) sub_8030D40(sUnknown_203B2C4->mailIndex,0); SetThankYouMailMenuState(0x12); break; - case 0: + case CANCEL_ACTION: case 0xD: sub_8035CC0(sUnknown_203B2C4->unk35C,2); sub_8030810(1); @@ -711,11 +717,11 @@ void sub_802A39C(void) switch(menuAction) { - case 0xB: + case CONFIRM_ACTION: sub_801CBB8(); SetThankYouMailMenuState(CONFIRM_ITEM_TO_SEND); break; - case 0xC: + case INFO_ACTION: sUnknown_203B2C4->fallbackState = 0x2b; RestoreUnkTextStruct_8006518(sUnknown_203B2C4->unk3BC); ResetUnusedInputStruct(); @@ -723,7 +729,7 @@ void sub_802A39C(void) sub_801B3C0(&sUnknown_203B2C4->unk41C); SetThankYouMailMenuState(SHOW_ITEM_TO_SEND_INFO); break; - case 0: + case CANCEL_ACTION: case 0xD: sub_8035CC0(sUnknown_203B2C4->unk35C, 3); sub_801CCD8(); @@ -907,14 +913,14 @@ void sub_802A75C(void) { switch(menuAction) { - case 7: + case YES_ACTION: // NOTE: if statement is needed to match if(sUnknown_203B2C4->wonderMailMode) SetThankYouMailMenuState(COMMUNICATING_THANK_YOU_MAIL); else SetThankYouMailMenuState(COMMUNICATING_THANK_YOU_MAIL); break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -929,7 +935,7 @@ void HandleConfirmItemtoSendMenu(void) { switch(menuAction) { - case 7: + case YES_ACTION: mail = GetMailatIndex(sUnknown_203B2C4->mailIndex); if(sUnknown_203B2C4->unk41C.id != ITEM_NOTHING) { @@ -938,10 +944,10 @@ void HandleConfirmItemtoSendMenu(void) gTeamInventoryRef->teamStorage[sUnknown_203B2C4->unk41C.id]--; SetThankYouMailMenuState(0x29); break; - case 8: + case NO_ACTION: SetThankYouMailMenuState(PROMPT_ITEM_TO_SEND); break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -997,7 +1003,7 @@ void sub_802A8BC(void) { switch(menuAction) { - case 0xA: + case NO_SEND_ITEM_ACTION: switch(sUnknown_203B2C4->wonderMailMethod) { case WONDER_MAIL_GAME_LINK: @@ -1009,7 +1015,7 @@ void sub_802A8BC(void) break; } break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -1023,7 +1029,7 @@ void sub_802A910(void) { switch(menuAction) { - case 9: + case SEND_ITEM_ACTION: if(sub_801CF14(0)) { SetThankYouMailMenuState(THANK_YOU_MAIL_STORAGE_EMPTY); @@ -1033,7 +1039,7 @@ void sub_802A910(void) SetThankYouMailMenuState(PROMPT_ITEM_TO_SEND); } break; - case 0xA: + case NO_SEND_ITEM_ACTION: switch(sUnknown_203B2C4->wonderMailMethod) { case WONDER_MAIL_GAME_LINK: @@ -1045,7 +1051,7 @@ void sub_802A910(void) break; } break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -1068,7 +1074,7 @@ void sub_802A9A8(void) { switch(menuAction) { - case 0x7: + case YES_ACTION: switch(sUnknown_203B2C4->wonderMailMethod) { case WONDER_MAIL_GAME_LINK: @@ -1080,7 +1086,7 @@ void sub_802A9A8(void) break; } break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -1094,10 +1100,10 @@ void sub_802A9FC(void) { switch(menuAction) { - case 0x7: + case YES_ACTION: SetThankYouMailMenuState(PROMPT_THANK_YOU_PASSWORD); break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -1141,7 +1147,7 @@ void HandleMailCommunicationMenu(void) break; } break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(ANYTHING_ELSE_THANK_YOU_MAIN_MENU); break; } @@ -1173,7 +1179,7 @@ void HandleThankYouMailPelipperMainMenu(void) { switch(menuAction) { - case 1: + case SEND_THANK_YOU_MAIL_ACTION: sUnknown_203B2C4->unk40 = 6; sUnknown_203B2C4->wonderMailMode = WONDER_MAIL_MODE_SEND; if(CountMailType(5) == 0) @@ -1185,12 +1191,12 @@ void HandleThankYouMailPelipperMainMenu(void) SetThankYouMailMenuState(PROMPT_THANK_YOU_TO_SEND); } break; - case 2: + case GET_THANK_YOU_MAIL_ACTION: sUnknown_203B2C4->unk40 = 7; sUnknown_203B2C4->wonderMailMode = WONDER_MAIL_MODE_RECEIVE; SetThankYouMailMenuState(SELECT_THANK_YOU_MAIL_COMMS); break; - case 0: + case CANCEL_ACTION: SetThankYouMailMenuState(2); break; } diff --git a/src/weather.c b/src/weather.c index cd391ee9e..d90d326ab 100644 --- a/src/weather.c +++ b/src/weather.c @@ -11,7 +11,6 @@ extern void TriggerWeatherAbilities(void); extern void sub_807EAA0(u32, u32); -void sub_807E5E4(u8); u8 GetApparentWeather(Entity *pokemon) { diff --git a/src/wonder_mail.c b/src/wonder_mail.c index 580d64565..5dd4fa0dc 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -21,13 +21,14 @@ #include "text1.h" #include "text2.h" #include "wonder_mail.h" +#include "wonder_mail_4.h" +#include "wonder_mail_5.h" static EWRAM_DATA_2 WonderMailStruct_203B2C0 *sUnknown_203B2C0 = {0}; extern void sub_8011C28(u32); extern void sub_809927C(u8); -extern bool8 HasNoWonderMailType(u32); extern u32 sub_8031050(); extern void sub_80310B4(); @@ -36,28 +37,15 @@ extern char gAvailablePokemonNames[0x50]; extern void nullsub_130(void); extern void sub_8028348(void); -extern void sub_803084C(); -extern u32 sub_8030768(u32); -extern s8 sub_80307EC(); -extern void sub_8030D40(u8, u32); -extern void sub_8030810(u32); -extern u32 sub_8030DA0(void); -extern void sub_8030DE4(void); -extern void sub_803092C(void); extern u32 sub_8039068(u32, u8 *r1, unkStruct_203B480 *r0); -extern void sub_8095274(u32); extern u32 sub_8031DCC(); extern void sub_8031E10(); extern void sub_8031E00(); extern void sub_8031E10(void); -extern void sub_803084C(void); -extern void sub_8030DE4(); -extern void sub_80306A8(u32, u32, u32, u32); extern s32 sub_8037B28(u32); extern void sub_8031D70(u8, u32); extern u32 sub_8023CE8(void); -extern u32 sub_8030894(void); extern void sub_8030F58(u32); extern void sub_8029B34(void); extern void sub_8029AD8(void); @@ -111,9 +99,7 @@ extern void sub_8029044(void); extern void sub_8028CFC(void); extern void sub_8028D4C(void); extern void sub_8031E10(void); -extern void sub_803084C(void); extern void sub_80310B4(void); -extern void sub_8030DE4(void); extern const u8 DontSendPokemon_80DDB80[]; extern const u8 SendPokemon_80DDB98[]; @@ -632,7 +618,7 @@ void sub_8028348(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); // SOS Mail - sub_80306A8(2, 0, 0, 6); + sub_80306A8(WONDER_MAIL_TYPE_SOS_1, 0, 0, 6); } break; case 0x20: @@ -1356,7 +1342,7 @@ void sub_802939C(void) } else { - SetFriendRescueCounterState(0x2); + SetFriendRescueCounterState(FRIEND_RESCUE_EXIT_PRE); } } } @@ -1399,8 +1385,8 @@ void sub_80293F4(void) sub_8095274(mail.unk10.unk10); mail.mailType = 2; sub_80951BC(&mail); - xxx_info_box_80141B4(gWonderMailAOKMailReceivedText, 0, &sUnknown_203B2C0->faceFile, 0x101); - SetFriendRescueCounterState(0x23); + sub_80141B4(gWonderMailAOKMailReceivedText, 0, &sUnknown_203B2C0->faceFile, 0x101); + SetFriendRescueCounterState(RECEIVED_FRIEND_SOS_MAIL); break; case 23: case 24: diff --git a/src/wonder_mail_2.c b/src/wonder_mail_2.c index 066441b9d..19441ba28 100644 --- a/src/wonder_mail_2.c +++ b/src/wonder_mail_2.c @@ -37,6 +37,11 @@ struct unkStruct_203B2C8 u32 fill13C; }; +enum States { + INIT_STATE, + EXIT_STATE = 5 +}; + static EWRAM_DATA_2 struct unkStruct_203B2C8 *sUnknown_203B2C8 = {0}; extern void sub_80920D8(u8 *buffer); @@ -78,9 +83,8 @@ ALIGNED(4) const char gUnknown_80DFB14[] = _( " Please give me a shout if\n" "you would like to send {COLOR_1 LIGHT_BLUE}A-OK Mail{END_COLOR_TEXT_1}."); -u32 sub_802B2D4(void) +s32 sub_802B2D4(void) { - s32 iVar1; OpenedFile *faceFile; ResetUnusedInputStruct(); @@ -97,19 +101,20 @@ u32 sub_802B2D4(void) sUnknown_203B2C8->unk12 = 0; sUnknown_203B2C8->unkC = 2; sUnknown_203B2C8->unkE = 8; - if (sub_8099394(&sUnknown_203B2C8->unk1) == 1) { - sub_802B548(0); - iVar1 = 1; + if (sub_8099394(&sUnknown_203B2C8->unk1) != 1) { + return 0; } else - iVar1 = 0; - return iVar1; + { + sub_802B548(INIT_STATE); + return 1; + } } u32 sub_802B358(void) { switch(sUnknown_203B2C8->currState) { - case 0: + case INIT_STATE: sub_802B560(); break; case 1: @@ -124,7 +129,7 @@ u32 sub_802B358(void) case 4: sub_802B624(); break; - case 5: + case EXIT_STATE: return 3; } return 0; @@ -151,7 +156,7 @@ void sub_802B3E0(void) char teamNameBuffer[40]; switch(sUnknown_203B2C8->currState) { - case 0: + case INIT_STATE: if (sub_80023E4(0)) { // Copy Team Name to buffer sub_80920D8(teamNameBuffer); @@ -179,7 +184,7 @@ void sub_802B3E0(void) sUnknown_203B2C8->unk114.itemRewards[2] = ITEM_NOTHING; sUnknown_203B2C8->unk114.quantity = 10; sUnknown_203B2C8->unk114.friendAreaReward = 0; - sub_802F204(&sUnknown_203B2C8->unk114, 0); + sub_802F204(&sUnknown_203B2C8->unk114, FALSE); break; case 2: // I hope you will keep on rescuing your friends @@ -260,6 +265,6 @@ void sub_802B624(void) s32 temp; if (sub_80144A4(&temp) == 0) { - sub_802B548(5); + sub_802B548(EXIT_STATE); } } diff --git a/src/wonder_mail_4.c b/src/wonder_mail_4.c index 06d4a09c5..14a8b9371 100644 --- a/src/wonder_mail_4.c +++ b/src/wonder_mail_4.c @@ -14,6 +14,7 @@ #include "text1.h" #include "text2.h" #include "structs/struct_sub80095e4.h" +#include "wonder_mail_4.h" struct unkStruct_203B320 { @@ -53,7 +54,7 @@ extern const u8 ThanksList[]; extern const u8 CompletedJobs[]; extern const u8 OkdRescue[]; -const u8 * const gUnknown_80E086C[] = +const u8 * const gUnknown_80E086C[MAX_WONDER_MAIL_TYPES] = { SOSList, RequestList, @@ -74,10 +75,8 @@ ALIGNED(4) const u8 SOSMail[] = "SOS Mail"; ALIGNED(4) const u8 RequestList[] = "Request List"; ALIGNED(4) const u8 SOSList[] = "SOS List"; -extern bool8 HasNoWonderMailType(u32); -extern s32 sub_8030A74(void); -extern void sub_80308A0(void); -extern void sub_803092C(void); +s32 sub_8030A74(void); +void sub_80308A0(void); u32 sub_80306A8(u32 wonderMailType, u32 r1, UnkTextStruct2_sub *r2, u32 r3) { @@ -125,7 +124,7 @@ u32 sub_8030768(u8 r0) PlayMenuSoundEffect(0); return 3; default: - if(sub_80138B8(&gUnknown_203B320->s28.s0.input, 1) != 0) + if(sub_80138B8(&gUnknown_203B320->s28.s0.input, TRUE) != 0) { sub_80308A0(); sub_803092C(); @@ -152,7 +151,7 @@ void sub_8030810(u8 r0) AddMenuCursorSprite(&gUnknown_203B320->s28.s0.input); } -void sub_803084C() +void sub_803084C(void) { if(gUnknown_203B320 != NULL) { @@ -164,7 +163,7 @@ void sub_803084C() } } -u8 *sub_8030894() +u8 *sub_8030894(void) { return gUnknown_203B320->unk0; } diff --git a/src/wonder_mail_5.c b/src/wonder_mail_5.c index 4423fe863..2f7133a0e 100644 --- a/src/wonder_mail_5.c +++ b/src/wonder_mail_5.c @@ -1,3 +1,4 @@ +#include "constants/input.h" #include "global.h" #include "globaldata.h" #include "code_800D090.h" @@ -19,7 +20,7 @@ struct unkStruct_203B324 // size: 0x78 MenuInputStructSub unk0; u8 mailIndex; - u32 unk10; + u32 windowID; UnkTextStruct2 *unk14; UnkTextStruct2 unk18[4]; }; @@ -57,27 +58,27 @@ extern void sub_8030DD4(void); void sub_8030E2C(void); void sub_8030E48(void); -bool8 sub_8030D40(u8 mailIndex, s32 param_2) +bool8 sub_8030D40(u8 mailIndex, s32 windowID) { gUnknown_203B324 = MemoryAlloc(sizeof(struct unkStruct_203B324), 8); gUnknown_203B324->mailIndex = mailIndex; sub_801317C(&gUnknown_203B324->unk0); - gUnknown_203B324->unk10 = param_2; - gUnknown_203B324->unk14 = &gUnknown_203B324->unk18[param_2]; - RestoreUnkTextStruct_8006518(gUnknown_203B324->unk18); - gUnknown_203B324->unk18[gUnknown_203B324->unk10] = gUnknown_80E091C; + gUnknown_203B324->windowID = windowID; + gUnknown_203B324->unk14 = &gUnknown_203B324->unk18[windowID]; + sub_8006518(gUnknown_203B324->unk18); + gUnknown_203B324->unk18[gUnknown_203B324->windowID] = gUnknown_80E091C; sub_8030DD4(); return TRUE; } -u8 sub_8030DA0(void) +u32 sub_8030DA0(void) { - switch(sub_8012A64(&gUnknown_203B324->unk0, gUnknown_203B324->unk10)) + switch(sub_8012A64(&gUnknown_203B324->unk0, gUnknown_203B324->windowID)) { - case 2: + case INPUT_B_BUTTON: PlayMenuSoundEffect(1); return 2; - case 1: + case INPUT_A_BUTTON: PlayMenuSoundEffect(0); return 3; default: @@ -95,7 +96,7 @@ void sub_8030DE4(void) { if(gUnknown_203B324 != NULL) { - gUnknown_203B324->unk18[gUnknown_203B324->unk10] = gUnknown_80E0900; + gUnknown_203B324->unk18[gUnknown_203B324->windowID] = gUnknown_80E0900; ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(gUnknown_203B324->unk18, TRUE, TRUE); MemoryFree(gUnknown_203B324); @@ -117,8 +118,8 @@ void sub_8030E48(void) u8 buffer [256]; mail = &gUnknown_203B480[gUnknown_203B324->mailIndex]; - sub_80073B8(gUnknown_203B324->unk10); - stack.unk0[0] = gUnknown_203B324->unk10; + sub_80073B8(gUnknown_203B324->windowID); + stack.unk0[0] = gUnknown_203B324->windowID; stack.mailTitleType = 7; stack.mailMissionType = MISSION_TYPE_FRIEND_RESCUE; stack.mailStatus = MAIL_STATUS_SUSPENDED; @@ -150,8 +151,8 @@ void sub_8030E48(void) } CreateRescueDescription(&stack); uVar2 = mail->unk10.unk10_u16 % 10000; - PrintStringOnWindow(10,0x68,gUnknown_80E0934,gUnknown_203B324->unk10,0); // ID: + PrintStringOnWindow(10,0x68,gUnknown_80E0934,gUnknown_203B324->windowID,0); // ID: sprintfStatic(buffer,gUnknown_80E0938,uVar2); // %-4d - PrintStringOnWindow(0x44,0x68,buffer,gUnknown_203B324->unk10,0); - sub_80073E0(gUnknown_203B324->unk10); + PrintStringOnWindow(0x44,0x68,buffer,gUnknown_203B324->windowID,0); + sub_80073E0(gUnknown_203B324->windowID); } diff --git a/src/wonder_mail_6.c b/src/wonder_mail_6.c index 1077e2f5f..bdc7bac77 100644 --- a/src/wonder_mail_6.c +++ b/src/wonder_mail_6.c @@ -8,8 +8,8 @@ #include "code_8094F88.h" #include "menu_input.h" #include "code_80130A8.h" - -extern bool8 HasNoWonderMailType(u32); +#include "wonder_mail_4.h" +#include "wonder_mail_5.h" struct unkStruct_203B328 { @@ -32,18 +32,27 @@ static EWRAM_DATA_2 struct unkStruct_203B328 *gUnknown_203B328 = {0}; extern unkStruct_203B480 *gUnknown_203B480; +enum MenuActions { + CANCEL_ACTION = 1, + YES_ACTION, + NO_ACTION, + DELETE_ACTION, + INFO_ACTION, + DELETE_ALL_MAIL_ACTION, // Unused +}; + const MenuItem gUnknown_80E0948[] = { - {"Yes", 0x2}, - {"No", 0x3}, - {NULL, 0x1} + {"Yes", YES_ACTION}, + {"No", NO_ACTION}, + {NULL, CANCEL_ACTION} }; const MenuItem gUnknown_80E0968[] = { - {"Delete", 0x4}, - {"Info", 0x5}, - {NULL, 0x1} + {"Delete", DELETE_ACTION}, + {"Info", INFO_ACTION}, + {NULL, CANCEL_ACTION} }; const UnkTextStruct2 gUnknown_80E0990 = { @@ -79,35 +88,18 @@ ALIGNED(4) const u8 gUnknown_80E0A0C[] = _( " ...Uh{COMMA} no?\n" "You don{APOSTROPHE}t have any {COLOR_1 LIGHT_BLUE}A-OK Mail{END_COLOR_TEXT_1}."); -extern void sub_80306A8(s32, u32, u32, u32); extern void sub_8031300(void); extern void sub_803136C(void); extern void sub_80313D8(u32); extern void sub_8031498(void); -extern void sub_803084C(void); extern void sub_80310FC(); extern void sub_8031258(); -extern u32 sub_8030768(u32); -extern u8 sub_80307EC(void); -extern u32 sub_8030DA0(void); -extern void sub_8030DE4(); - -extern void sub_8030810(u32); -extern void sub_803092C(void); -extern void sub_8030D40(u8, u32); enum States { INIT_STATE = 0, DELETE_SINGLE_MAIL_STATE = 2, DELETE_ALL_MAIL_STATE = 3, -}; - -enum MenuActions { - CANCEL_ACTION = 1, - YES_ACTION, - NO_ACTION, - DELETE_ACTION, - INFO_ACTION + INFO_STATE = 4, }; bool8 sub_8030F58(u32 wonderMailType) @@ -165,7 +157,7 @@ s32 sub_8031050(void) case DELETE_ALL_MAIL_STATE: sub_80313D8(gUnknown_203B328->state); break; - case 4: + case INFO_STATE: sub_8031498(); break; case 5: @@ -213,7 +205,7 @@ void sub_80310FC(void) gUnknown_203B328->unkA8[2] = gUnknown_80E09C0; sub_8012CAC(&gUnknown_203B328->unkA8[2], gUnknown_80E0948); break; - case 4: + case INFO_STATE: gUnknown_203B328->unkA8[0] = gUnknown_80E0990; gUnknown_203B328->unkA8[1] = gUnknown_80E0990; gUnknown_203B328->unkA8[2] = gUnknown_80E0990; @@ -239,15 +231,15 @@ void sub_8031258(void) break; case 1: sub_803092C(); - sub_8012D60(&gUnknown_203B328->unk8, gUnknown_80E0968, 0, 0, 4, 1); + sub_8012D60(&gUnknown_203B328->unk8, gUnknown_80E0968, NULL, NULL, DELETE_ACTION, 1); break; case DELETE_SINGLE_MAIL_STATE: case DELETE_ALL_MAIL_STATE: sub_803092C(); sub_8012EA4(&gUnknown_203B328->unk8, 0); - sub_8012D60(&gUnknown_203B328->unk58, gUnknown_80E0948, 0, 0, 3, 2); + sub_8012D60(&gUnknown_203B328->unk58, gUnknown_80E0948, NULL, NULL, NO_ACTION, 2); break; - case 4: + case INFO_STATE: sub_8030D40(gUnknown_203B328->mailIndex, 3); break; case 5: @@ -267,7 +259,7 @@ void sub_8031300(void) break; case 4: gUnknown_203B328->mailIndex = sub_80307EC(); - sub_80310E4(4); + sub_80310E4(INFO_STATE); break; case 2: sub_80310E4(6); @@ -291,16 +283,16 @@ void sub_803136C(void) switch(menuAction) { case CANCEL_ACTION: - sub_80310E4(0); + sub_80310E4(INIT_STATE); break; - case 6: - sub_80310E4(3); + case DELETE_ALL_MAIL_ACTION: + sub_80310E4(DELETE_ALL_MAIL_STATE); break; case DELETE_ACTION: - sub_80310E4(2); + sub_80310E4(DELETE_SINGLE_MAIL_STATE); break; case INFO_ACTION: - sub_80310E4(4); + sub_80310E4(INFO_STATE); break; } @@ -323,7 +315,7 @@ void sub_80313D8(u32 state) { case CANCEL_ACTION: case NO_ACTION: - sub_80310E4(0); + sub_80310E4(INIT_STATE); break; case YES_ACTION: switch(state) @@ -346,7 +338,7 @@ void sub_80313D8(u32 state) sub_80310E4(5); } else { - sub_80310E4(0); + sub_80310E4(INIT_STATE); } } break; @@ -363,7 +355,7 @@ void sub_8031498(void) case 2: case 3: sub_8030DE4(); - sub_80310E4(0); + sub_80310E4(INIT_STATE); break; } } diff --git a/src/wonder_mail_main_menu.c b/src/wonder_mail_main_menu.c index 60626d15a..09f27b39a 100644 --- a/src/wonder_mail_main_menu.c +++ b/src/wonder_mail_main_menu.c @@ -19,6 +19,8 @@ #include "text2.h" #include "wonder_mail_802D098.h" #include "wonder_mail_main_menu.h" +#include "wonder_mail_4.h" +#include "wonder_mail_5.h" #define SELECT_WONDER_MAIL_MODE_MAIN_SCREEN 0 #define SEND_WONDER_MAIL_MAIN_SCREEN 1 @@ -69,17 +71,11 @@ EWRAM_DATA_2 struct unkStruct_203B3E8 *gUnknown_203B3E8 = {0}; #include "data/wonder_mail_main_menu.h" extern void SetWonderMailMainMenuState(u8); -extern void sub_8030DE4(void); -extern void sub_803084C(void); extern void sub_8031E10(void); - extern u8 sub_800D588(void); extern void sub_802EF48(void); - extern s32 sub_8037B28(u32); -extern bool8 IsValidWonderMail(WonderMail *WonderMailData); - void PrintWonderMailMainMenuError(u32); void HandleWonderMailMainScreen(void); void HandleGameLinkCableMenu(void); From 6a1a7bcafff6e4c7b3d6717815b80f86a3e9af47 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 7 Sep 2024 11:04:03 -0700 Subject: [PATCH 04/18] more decomp and documentation --- asm/code_8069E0C.s | 2 +- asm/code_806E8B0.s | 261 ------------------------------- include/pokemon.h | 4 +- include/structs/str_pokemon.h | 13 +- include/structs/struct_8069D4C.h | 27 ++++ ld_script.txt | 1 + src/code_8069D4C.c | 13 +- src/code_806FDF4.c | 112 +++++++++++++ src/pokemon_3.c | 39 ++--- src/pokemon_mid.c | 9 +- src/trap_1.c | 6 +- 11 files changed, 180 insertions(+), 307 deletions(-) create mode 100644 include/structs/struct_8069D4C.h create mode 100644 src/code_806FDF4.c diff --git a/asm/code_8069E0C.s b/asm/code_8069E0C.s index e20ccf580..2a76b35cc 100644 --- a/asm/code_8069E0C.s +++ b/asm/code_8069E0C.s @@ -3479,7 +3479,7 @@ _0806BDA6: bl SetDefaultIQSkills adds r0, r6, 0 adds r0, 0x3C - bl sub_808E6F4 + bl GenerateHiddenPower strh r4, [r6, 0x10] strh r4, [r6, 0xE] mov r0, sp diff --git a/asm/code_806E8B0.s b/asm/code_806E8B0.s index bbe1391a4..3a44c4f55 100644 --- a/asm/code_806E8B0.s +++ b/asm/code_806E8B0.s @@ -2405,265 +2405,4 @@ _0806FDEE: bx r1 thumb_func_end sub_806FD18 - thumb_func_start sub_806FDF4 -sub_806FDF4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x60 - str r0, [sp, 0x58] - mov r10, r1 - str r2, [sp, 0x5C] - movs r0, 0 - mov r9, r0 - str r0, [r2] - add r0, sp, 0xC - bl sub_8069D4C - movs r6, 0 - ldr r3, _0806FE50 - ldr r0, [r3] - ldr r2, _0806FE54 - adds r0, r2 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0806FE46 - adds r5, r3, 0 - adds r4, r2, 0 - movs r2, 0 - movs r3, 0x1 -_0806FE2E: - adds r2, 0x64 - adds r6, 0x1 - cmp r6, 0x3 - bgt _0806FE46 - ldr r0, [r5] - adds r0, r2, r0 - adds r0, r4 - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0806FE2E -_0806FE46: - cmp r6, 0x4 - bne _0806FE58 - movs r0, 0 - b _0806FFF8 - .align 2, 0 -_0806FE50: .4byte gRecruitedPokemonRef -_0806FE54: .4byte 0x00008df8 -_0806FE58: - add r0, sp, 0xC - movs r1, 0 - ldrsh r0, [r0, r1] - bl GetFriendArea - lsls r0, 24 - lsrs r7, r0, 24 - ldr r1, _0806FF74 - movs r0, 0x64 - muls r0, r6 - ldr r2, _0806FF78 - adds r0, r2 - ldr r1, [r1] - adds r5, r1, r0 - movs r4, 0 - movs r0, 0x3 - strh r0, [r5] - strb r4, [r5, 0x2] - add r0, sp, 0xC - ldrh r0, [r0, 0xE] - strb r0, [r5, 0x3] - movs r0, 0x1 - strh r0, [r5, 0x8] - adds r0, r5, 0 - adds r0, 0x4C - movs r1, 0 - bl SetDefaultIQSkills - ldr r0, [sp, 0x50] - str r0, [r5, 0x54] - adds r0, r5, 0 - adds r0, 0x50 - strb r4, [r0] - ldr r0, _0806FF7C - strh r0, [r5, 0xA] - strh r6, [r5, 0xC] - add r0, sp, 0xC - ldrh r0, [r0] - strh r0, [r5, 0xE] - ldr r0, _0806FF80 - ldr r0, [r0] - ldr r3, _0806FF84 - adds r0, r3 - ldr r0, [r0] - str r0, [r5, 0x4] - add r0, sp, 0xC - ldrh r0, [r0, 0x8] - strh r0, [r5, 0x10] - add r0, sp, 0xC - ldrh r0, [r0, 0x8] - strh r0, [r5, 0x12] - ldr r0, [sp, 0x20] - str r0, [r5, 0x44] - ldr r0, [sp, 0x24] - str r0, [r5, 0x48] - movs r2, 0 - add r6, sp, 0x2C - add r4, sp, 0x54 - mov r8, r4 - mov r4, sp - adds r4, 0x16 - add r3, sp, 0x18 - adds r1, r5, 0 - adds r1, 0x14 -_0806FED8: - adds r0, r4, r2 - ldrb r0, [r0] - strb r0, [r1] - adds r0, r3, r2 - ldrb r0, [r0] - strb r0, [r1, 0x2] - adds r1, 0x1 - adds r2, 0x1 - cmp r2, 0x1 - ble _0806FED8 - ldr r0, [sp, 0x1C] - str r0, [r5, 0x18] - adds r1, r5, 0 - adds r1, 0x1C - adds r0, r6, 0 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [sp, 0x28] - str r0, [r5, 0x40] - adds r4, r5, 0 - adds r4, 0x58 - add r0, sp, 0xC - movs r1, 0 - ldrsh r0, [r0, r1] - bl GetMonSpecies - adds r1, r0, 0 - adds r0, r4, 0 - movs r2, 0xA - bl BoundedCopyStringtoBuffer - adds r0, r7, 0 - bl GetFriendAreaStatus - lsls r0, 24 - cmp r0, 0 - bne _0806FF34 - adds r0, r7, 0 - bl UnlockFriendArea - movs r2, 0x1 - mov r9, r2 -_0806FF34: - bl sub_8097848 - movs r1, 0xFA - lsls r1, 1 - mov r0, r10 - ldr r2, [sp, 0x58] - bl sub_8068FE0 - add r0, sp, 0xC - movs r3, 0 - ldrsh r0, [r0, r3] - add r1, sp, 0xC - movs r2, 0x4 - ldrsh r1, [r1, r2] - add r2, sp, 0xC - movs r3, 0x6 - ldrsh r2, [r2, r3] - mov r3, r8 - str r3, [sp] - movs r3, 0 - str r3, [sp, 0x4] - str r3, [sp, 0x8] - adds r3, r5, 0 - bl sub_806B8CC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _0806FF88 - strh r0, [r5] - b _0806FFF6 - .align 2, 0 -_0806FF74: .4byte gRecruitedPokemonRef -_0806FF78: .4byte 0x00008df8 -_0806FF7C: .4byte 0x0000ffff -_0806FF80: .4byte gDungeon -_0806FF84: .4byte 0x00000644 -_0806FF88: - ldr r0, _0806FF9C - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl sub_8052B8C - cmp r0, 0x1 - bne _0806FFB8 - b _0806FFAC - .align 2, 0 -_0806FF9C: .4byte gUnknown_80FA090 -_0806FFA0: - ldr r0, _08070008 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage -_0806FFAC: - adds r0, r4, 0 - bl sub_805FBE8 - lsls r0, 24 - cmp r0, 0 - beq _0806FFA0 -_0806FFB8: - mov r4, r9 - cmp r4, 0 - beq _0806FFE6 - bl xxx_call_GetLeader - adds r1, r0, 0 - ldr r0, _0807000C - movs r2, 0 - bl SetMessageArgument - ldr r0, _08070010 - adds r1, r7, 0 - bl sub_8092558 - movs r0, 0xCE - bl PlaySound - ldr r0, _08070014 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage -_0806FFE6: - ldr r0, _08070018 - adds r1, r5, 0 - movs r2, 0 - bl sub_808D9DC - ldr r0, [sp, 0x54] - ldr r1, [sp, 0x5C] - str r0, [r1] -_0806FFF6: - movs r0, 0x1 -_0806FFF8: - add sp, 0x60 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08070008: .4byte gUnknown_80FA0C8 -_0807000C: .4byte gAvailablePokemonNames -_08070010: .4byte gUnknown_202E628 -_08070014: .4byte gUnknown_80FA120 -_08070018: .4byte gUnknown_202E088 - thumb_func_end sub_806FDF4 - .align 2,0 diff --git a/include/pokemon.h b/include/pokemon.h index 11f21723e..0f689cd30 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -25,7 +25,7 @@ typedef struct unkStruct_808E218_arg typedef struct unkStruct_808E218 { // leveldata? (same size) - unkStruct_808E6F4 unk0[3]; + HiddenPower unk0[3]; } unkStruct_808E218; extern unkStruct_203B45C *gRecruitedPokemonRef; @@ -80,7 +80,7 @@ bool8 IsPokemonDialogueSpriteAvail(s16 index, s32 r1); OpenedFile *OpenPokemonDialogueSpriteFile(s16 index); OpenedFile *GetDialogueSpriteDataPtr(s16 index); s32 GetUnownIndex(s16 index); -void sub_808E6F4(unkStruct_808E6F4 *); +void GenerateHiddenPower(HiddenPower *); s32 GetEvolutionSequence(PokemonStruct1 *pokemon, EvolveStage *); void xxx_pokemonstruct_to_pokemon2_808DE50(PokemonStruct2 *, PokemonStruct1 *, s32); void SavePokemonStruct(unkStruct_8094924 *, PokemonStruct1 *pokemon); diff --git a/include/structs/str_pokemon.h b/include/structs/str_pokemon.h index 7061a25af..92560d2ed 100644 --- a/include/structs/str_pokemon.h +++ b/include/structs/str_pokemon.h @@ -40,13 +40,6 @@ typedef struct PokemonStruct1 /* 0x4C */ u8 name[POKEMON_NAME_LENGTH]; } PokemonStruct1; -// size: 0x4 -typedef struct unkStruct_808E6F4 -{ - s16 unk0; - u8 unk2; -} unkStruct_808E6F4; - // size: 0x4 typedef struct EvolveStage { @@ -78,11 +71,11 @@ typedef struct PokemonStruct2 /* 0x18 */ u32 currExp; /* 0x1C */ unkStruct_8094184 moves; /* 0x40 */ Item itemSlot; // heldItem - /* 0x44 */ FixedPoint unk44; - /* 0x48 */ FixedPoint unk48; + u32 belly; // some struct + u32 maxBelly; // some struct (same type as 44) /* 0x4C */ u32 IQSkills; // unk20 /* 0x50 */ u8 tacticIndex; - unkStruct_808E6F4 unk54; + /* 0x54 */ HiddenPower hiddenPower; /* 0x58 */ u8 name[POKEMON_NAME_LENGTH]; // name (other offset) } PokemonStruct2; diff --git a/include/structs/struct_8069D4C.h b/include/structs/struct_8069D4C.h new file mode 100644 index 000000000..bb0eadf49 --- /dev/null +++ b/include/structs/struct_8069D4C.h @@ -0,0 +1,27 @@ +#ifndef GUARD_STRUCT_8069D4C_H +#define GUARD_STRUCT_8069D4C_H + +#include "structs/dungeon_entity.h" +#include "structs/str_items.h" +#include "structs/str_pokemon.h" +#include "structs/str_position.h" + +struct unkStruct_8069D4C +{ + s16 id; + Position pos; + s16 HP; + // NOTE: cannot re-use offense struct as it pads. + u8 att[2]; // Atk, SpAtk + u8 def[2]; // Def, SpDef + u16 level; + u32 exp; + u32 belly; + u32 maxBelly; + Item heldItem; + unkStruct_8094184 moves; + HiddenPower hiddenPower; +}; + +#endif // GUARD_STRUCT_8069D4C_H + diff --git a/ld_script.txt b/ld_script.txt index 468ae7303..2d7ff2628 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -255,6 +255,7 @@ SECTIONS { src/type_effectiveness.o(.text); src/code_806E8B0.o(.text); asm/code_806E8B0.o(.text); + src/code_806FDF4.o(.text); src/status_checks.o(.text); src/dungeon_movement.o(.text); src/status_checks_1.o(.text); diff --git a/src/code_8069D4C.c b/src/code_8069D4C.c index 5b45774d6..f95d71c63 100644 --- a/src/code_8069D4C.c +++ b/src/code_8069D4C.c @@ -1,7 +1,7 @@ #include "global.h" #include "pokemon_mid.h" #include "dungeon_util.h" -#include "code_8069D4C.h" +#include "structs/struct_8069D4C.h" u32 sub_8069D18(Position *pos,Entity *entity) { @@ -31,15 +31,14 @@ void sub_8069D4C(struct unkStruct_8069D4C *r0, Entity *target) r0->level = info->level; - GetPokemonLevelData(&leveldata, info->id, info->level); r0->exp = leveldata.expRequired; - r0->atk = info->atk; - r0->spAtk = info->spAtk; - r0->def = info->def; - r0->spDef = info->spDef; + r0->att[0] = info->atk; + r0->att[1] = info->spAtk; + r0->def[0] = info->def; + r0->def[1] = info->spDef; r0->heldItem = info->heldItem; - memcpy(r0->moves, info->moves, sizeof(r0->moves) + sizeof(r0->unk40)); + memcpy(r0->moves.moves, info->moves, sizeof(r0->moves)); r0->belly = info->belly; r0->maxBelly = info->maxBelly; r0->hiddenPower = info->hiddenPower; diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c new file mode 100644 index 000000000..98cb4234d --- /dev/null +++ b/src/code_806FDF4.c @@ -0,0 +1,112 @@ +#include "global.h" +#include "structs/str_pokemon.h" +#include "structs/struct_8069D4C.h" +#include "code_80118A4.h" +#include "code_8045A00.h" +#include "code_8097670.h" +#include "friend_area.h" +#include "pokemon.h" +#include "pokemon_3.h" +#include "text_util.h" +#include "dungeon_util_1.h" + +extern u8 gUnknown_202E628[]; +extern u8 gUnknown_202E088[]; +extern u8 gAvailablePokemonNames[]; + +extern u8 *gUnknown_80FA0C8[]; +extern u8 gUnknown_202E088[]; +extern u8 *gUnknown_80FA120[]; +extern u8 *gUnknown_80FA090[]; + +void sub_8069D4C(struct unkStruct_8069D4C *r0, Entity *target); +void sub_8068FE0(Entity *, u32, Entity *); +u8 sub_806B8CC(); +bool8 sub_805FBE8(u8 *a0); +extern s32 sub_8052B8C(u32, const u8 *, u32); +extern void PrintFieldMessage(u32, const u8 *, u32); + +bool8 sub_806FDF4(Entity *entity1,Entity *entity2,Entity **entityPtr) +{ + u8 friendArea; + bool8 flag; + Entity *leader; + PokemonStruct2 *pokeStruct2; + int index; + struct unkStruct_8069D4C local_74; + Entity *local_2c; + u8 *buffer; + s32 index2; + + flag = 0; + *entityPtr = NULL; + + sub_8069D4C(&local_74,entity2); + + for(index = 0; index < MAX_TEAM_MEMBERS; index++) + { + if (((u8)(index[gRecruitedPokemonRef->pokemon2].unk0) & 1) == 0) break; + } + + if (index == MAX_TEAM_MEMBERS) { + return FALSE; + } + else { + friendArea = GetFriendArea(local_74.id); + pokeStruct2 = &gRecruitedPokemonRef->pokemon2[index]; + pokeStruct2->unk0 = 3; + pokeStruct2->isTeamLeader = FALSE; + pokeStruct2->level = local_74.level; + pokeStruct2->IQ = 1; + SetDefaultIQSkills((u8 *)&(pokeStruct2->IQSkills),FALSE); + pokeStruct2->hiddenPower = local_74.hiddenPower; + pokeStruct2->tacticIndex = 0; + pokeStruct2->unkA = -1; + pokeStruct2->unkC = index; + pokeStruct2->speciesNum = local_74.id; + pokeStruct2->dungeonLocation = gDungeon->dungeonLocation; + pokeStruct2->unk10 = local_74.HP; + pokeStruct2->unk12 = local_74.HP; + pokeStruct2->belly = local_74.belly; + pokeStruct2->maxBelly = local_74.maxBelly; + + for(index2 = 0; index2 < 2; index2++) + { + pokeStruct2->offense.att[index2] = local_74.att[index2]; + pokeStruct2->offense.def[index2] = local_74.def[index2]; + } + + pokeStruct2->currExp = local_74.exp; + pokeStruct2->moves = local_74.moves; + + pokeStruct2->itemSlot = local_74.heldItem; + buffer = pokeStruct2->name; + BoundedCopyStringtoBuffer(buffer,GetMonSpecies(local_74.id), POKEMON_NAME_LENGTH); + if (GetFriendAreaStatus(friendArea) == 0) { + UnlockFriendArea(friendArea); + flag = TRUE; + } + sub_8097848(); + sub_8068FE0(entity2,500,entity1); + if (sub_806B8CC(local_74.id,local_74.pos.x,local_74.pos.y,pokeStruct2,&local_2c,0,0) == 0) { + pokeStruct2->unk0 = 0; + } + else { + if (sub_8052B8C(0,*gUnknown_80FA090,1) == 1) { + while (!sub_805FBE8(buffer)) { + PrintFieldMessage(0,*gUnknown_80FA0C8,1); + } + } + if (flag) { + leader = xxx_call_GetLeader(); + SetMessageArgument(gAvailablePokemonNames,leader,0); + sub_8092558(gUnknown_202E628,friendArea); + PlaySound(0xce); + PrintFieldMessage(0,*gUnknown_80FA120,1); + } + sub_808D9DC(gUnknown_202E088,pokeStruct2,0); + *entityPtr = local_2c; + } + return TRUE; + } +} diff --git a/src/pokemon_3.c b/src/pokemon_3.c index a98db162d..48986b1f0 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -7,6 +7,7 @@ #include "constants/evolution_status.h" #include "constants/iq_skill.h" #include "constants/tactic.h" +#include "constants/type.h" #include "sprite.h" #include "text_util.h" #include "friend_area.h" @@ -51,9 +52,9 @@ void RestoreDungeonLocation(struct unkStruct_8094924*, DungeonLocation*); void xxx_restore_poke_sub_c_808F410(struct unkStruct_8094924*, struct unkPokeSubStruct_C*); extern void sub_809449C(struct unkStruct_8094924*, void*); -extern void sub_808F448(struct unkStruct_8094924*, struct unkStruct_808E6F4*); +extern void SavePokemonHiddenPower(struct unkStruct_8094924*, HiddenPower*); extern void sub_809447C(struct unkStruct_8094924*, void*); -extern void sub_808F428(struct unkStruct_8094924*, struct unkStruct_808E6F4*); +extern void RestorePokemonHiddenPower(struct unkStruct_8094924*, HiddenPower*); s16 GetPokemonEvolveConditions(s16 index, unkEvolve *r1); u32 sub_808F798(PokemonStruct1 *, s16); @@ -85,18 +86,18 @@ bool8 AddShadowSprite(s16 species, s16* a2, s16* a3) } -void sub_808E6F4(struct unkStruct_808E6F4* a1) +void GenerateHiddenPower(HiddenPower* a1) { s32 i; - a1->unk0 = gUnknown_810AC90[RandInt(10)]; + a1->hiddenPowerBasePower = gUnknown_810AC90[RandInt(10)]; for (i = 0; i < 100; i++) { - a1->unk2 = RandInt(18); - if ( a1->unk2 ) + a1->hiddenPowerType = RandInt(NUM_TYPES); + if ( a1->hiddenPowerType ) break; } if ( i == 100 ) - a1->unk2 = 2; + a1->hiddenPowerType = TYPE_FIRE; } bool8 HasRecruitedMon(s16 species) { @@ -824,11 +825,11 @@ s32 SavePokemonStruct2(u8* a1, s32 size) SaveIntegerBits(&backup, &pokemon2->currExp, 24); sub_8094184(&backup, &pokemon2->moves); SaveItemSlot(&backup, &pokemon2->itemSlot); - sub_809449C(&backup, &pokemon2->unk44); - sub_809449C(&backup, &pokemon2->unk48); + sub_809449C(&backup, &pokemon2->belly); + sub_809449C(&backup, &pokemon2->maxBelly); SaveIntegerBits(&backup, &pokemon2->IQSkills, 24); SaveIntegerBits(&backup, &pokemon2->tacticIndex, 4); - sub_808F448(&backup, &pokemon2->unk54); + SavePokemonHiddenPower(&backup, &pokemon2->hiddenPower); SaveIntegerBits(&backup, &pokemon2->name, 80); } nullsub_102(&backup); @@ -872,11 +873,11 @@ s32 RestorePokemonStruct2(u8* a1, s32 size) RestoreIntegerBits(&backup, &pokemon2->currExp, 24); sub_80941FC(&backup, &pokemon2->moves); RestoreItemSlot(&backup, &pokemon2->itemSlot); - sub_809447C(&backup, &pokemon2->unk44); - sub_809447C(&backup, &pokemon2->unk48); + sub_809447C(&backup, &pokemon2->belly); + sub_809447C(&backup, &pokemon2->maxBelly); RestoreIntegerBits(&backup, &pokemon2->IQSkills, 24); RestoreIntegerBits(&backup, &pokemon2->tacticIndex, 4); - sub_808F428(&backup, &pokemon2->unk54); + RestorePokemonHiddenPower(&backup, &pokemon2->hiddenPower); RestoreIntegerBits(&backup, &pokemon2->name, 80); } nullsub_102(&backup); @@ -893,16 +894,16 @@ void xxx_save_poke_sub_c_808F41C(struct unkStruct_8094924* a1, struct unkPokeSub SaveIntegerBits(a1, &unkC->level, 7); } -void sub_808F428(unkStruct_8094924* a1, unkStruct_808E6F4* a2) +void RestorePokemonHiddenPower(unkStruct_8094924* a1, HiddenPower* a2) { - RestoreIntegerBits(a1, &a2->unk0, 10); - RestoreIntegerBits(a1, &a2->unk2, 5); + RestoreIntegerBits(a1, &a2->hiddenPowerBasePower, 10); + RestoreIntegerBits(a1, &a2->hiddenPowerType, 5); } -void sub_808F448(unkStruct_8094924* a1, unkStruct_808E6F4* a2) +void SavePokemonHiddenPower(unkStruct_8094924* a1, HiddenPower* a2) { - SaveIntegerBits(a1, &a2->unk0, 10); - SaveIntegerBits(a1, &a2->unk2, 5); + SaveIntegerBits(a1, &a2->hiddenPowerBasePower, 10); + SaveIntegerBits(a1, &a2->hiddenPowerType, 5); } void sub_808F468(PokemonStruct1 *param_1, EvolveStatus *evolveStatus, u8 param_3) diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c index b86f740b2..b0255d806 100644 --- a/src/pokemon_mid.c +++ b/src/pokemon_mid.c @@ -622,7 +622,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(PokemonStruct2 * a1, PokemonStruct1 * a1->level = pokemon->level; a1->IQ = pokemon->IQ; a1->IQSkills = pokemon->IQSkills; - sub_808E6F4(&a1->unk54); + GenerateHiddenPower(&a1->hiddenPower); a1->dungeonLocation = pokemon->dungeonLocation; a1->isTeamLeader = pokemon->isTeamLeader; a1->unkA = a3; @@ -654,9 +654,10 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(PokemonStruct2 * a1, PokemonStruct1 * slot->quantity = 0; slot->flags = 0; } - - a1->unk44 = IntToFixedPoint(100); - a1->unk48 = IntToFixedPoint(100); + sub_80943A0(&somestruct_80943A0, 100); + a1->belly = somestruct_80943A0; + sub_80943A0(&somestruct2_80943A0, 100); + a1->maxBelly = somestruct2_80943A0; } void xxx_pokemon2_to_pokemonstruct_index_808DF2C(s32 a1, PokemonStruct2* a2) diff --git a/src/trap_1.c b/src/trap_1.c index dba5c976a..e930b16fe 100644 --- a/src/trap_1.c +++ b/src/trap_1.c @@ -64,7 +64,7 @@ void SaveImmobilizeStatus(unkStruct_8094924 *param_1, Immobilize *param_2); void SaveNonVolatileStatus(unkStruct_8094924 *param_1, NonVolatile *param_2); void SaveEntitySleep(unkStruct_8094924 *param_1, Sleep* param_2); void SaveTactic(unkStruct_8094924 *param_1, u8 param_2); -void SaveHiddenPower(unkStruct_8094924 *param_1, HiddenPower *param_2); +void SaveDungeonHiddenPower(unkStruct_8094924 *param_1, HiddenPower *param_2); void SaveChargingStatus(unkStruct_8094924 *param_1, Charging *param_2); void SaveProtectionStatus(unkStruct_8094924 *param_1, Protection *param_2); void SaveWaitingStatus(unkStruct_8094924 *param_1, Waiting *param_2); @@ -404,7 +404,7 @@ void SaveEntity(unkStruct_8094924 *param_1, Entity *param_2) SaveIQFlags(param_1,temp2); SaveIQFlags(param_1,temp1); SaveTactic(param_1,*puStack_a0); - SaveHiddenPower(param_1,psStack_a4); + SaveDungeonHiddenPower(param_1,psStack_a4); sub_8083078(param_1,*puStack_9c); sub_8083078(param_1,*puStack_98); sub_8083078(param_1,*puStack_94); @@ -619,7 +619,7 @@ void SaveTactic(unkStruct_8094924 *param_1, u8 param_2) sub_8082FA8(param_1, ¶m_2, 1); } -void SaveHiddenPower(unkStruct_8094924 *param_1, HiddenPower *param_2) +void SaveDungeonHiddenPower(unkStruct_8094924 *param_1, HiddenPower *param_2) { sub_8083048(param_1, param_2->hiddenPowerBasePower); sub_808180C(param_1, param_2->hiddenPowerType); From c280da22ddf478f6b81d078ef9e8459e57586a68 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 8 Sep 2024 14:01:10 -0700 Subject: [PATCH 05/18] more decomp --- asm/code_806E8B0.s | 618 --------------------------------------------- src/code_806FDF4.c | 373 +++++++++++++++++++++++++++ 2 files changed, 373 insertions(+), 618 deletions(-) diff --git a/asm/code_806E8B0.s b/asm/code_806E8B0.s index 3a44c4f55..329c5d7d7 100644 --- a/asm/code_806E8B0.s +++ b/asm/code_806E8B0.s @@ -1787,622 +1787,4 @@ _0806F8FE: bx r1 thumb_func_end sub_806F660 - thumb_func_start nullsub_96 -nullsub_96: - bx lr - thumb_func_end nullsub_96 - - thumb_func_start sub_806F910 -sub_806F910: - push {r4-r7,lr} - mov r7, r8 - push {r7} - movs r5, 0 - movs r6, 0 - movs r7, 0x40 -_0806F91C: - ldr r0, _0806F9AC - ldr r0, [r0] - lsls r1, r6, 2 - ldr r2, _0806F9B0 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - adds r1, r6, 0x1 - mov r8, r1 - cmp r0, 0 - beq _0806F98A - ldr r0, [r4, 0x70] - movs r2, 0x4 - ldrsh r0, [r0, r2] - bl GetBodySize - lsls r0, 24 - lsrs r1, r0, 24 - adds r0, r4, 0 - adds r0, 0x68 - strh r7, [r0] - ldr r0, [r4, 0x70] - ldr r2, _0806F9B4 - adds r0, r2 - strb r6, [r0] - ldr r0, [r4, 0x70] - adds r2, 0x1 - adds r0, r2 - strb r1, [r0] - cmp r1, 0 - beq _0806F978 - ldr r3, _0806F9B8 - movs r2, 0x1 -_0806F966: - cmp r5, 0x5 - bgt _0806F972 - adds r0, r5, r3 - strb r2, [r0] - adds r7, 0x10 - adds r5, 0x1 -_0806F972: - subs r1, 0x1 - cmp r1, 0 - bne _0806F966 -_0806F978: - adds r0, r4, 0 - bl sub_806CEBC - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl sub_806CCB4 -_0806F98A: - mov r6, r8 - cmp r6, 0x3 - ble _0806F91C - cmp r5, 0x5 - bgt _0806F9A2 - ldr r2, _0806F9B8 - movs r1, 0 -_0806F998: - adds r0, r5, r2 - strb r1, [r0] - adds r5, 0x1 - cmp r5, 0x5 - ble _0806F998 -_0806F9A2: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806F9AC: .4byte gDungeon -_0806F9B0: .4byte 0x0001357c -_0806F9B4: .4byte 0x00000167 -_0806F9B8: .4byte gUnknown_202EE70 - thumb_func_end sub_806F910 - - thumb_func_start sub_806F9BC -sub_806F9BC: - push {r4,r5,lr} - sub sp, 0xC - lsls r0, 16 - asrs r4, r0, 16 - ldr r5, _0806FA40 - ldr r0, [r5] - movs r1, 0xCB - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _0806FA3C - adds r0, r4, 0 - bl sub_808529C - lsls r0, 24 - cmp r0, 0 - beq _0806FA3C - cmp r4, 0x97 - bne _0806F9F2 - ldr r0, [r5] - movs r1, 0xCF - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x1 - beq _0806FA3C -_0806F9F2: - movs r0, 0xCC - lsls r0, 1 - cmp r4, r0 - beq _0806FA3C - ldr r0, _0806FA44 - cmp r4, r0 - beq _0806FA3C - ldr r0, _0806FA48 - cmp r4, r0 - beq _0806FA3C - movs r0, 0xD1 - lsls r0, 1 - cmp r4, r0 - beq _0806FA3C - ldr r0, _0806FA4C - cmp r4, r0 - beq _0806FA3C - adds r0, r4, 0 - bl GetUnk12 - lsls r0, 24 - cmp r0, 0 - bne _0806FA50 - adds r0, r4, 0 - bl GetFriendArea - lsls r0, 24 - lsrs r0, 24 - mov r1, sp - movs r2, 0 - movs r3, 0 - bl sub_8092638 - mov r0, sp - ldrb r0, [r0, 0x4] - cmp r0, 0 - bne _0806FA50 -_0806FA3C: - movs r0, 0 - b _0806FA52 - .align 2, 0 -_0806FA40: .4byte gDungeon -_0806FA44: .4byte 0x00000199 -_0806FA48: .4byte 0x000001a1 -_0806FA4C: .4byte 0x000001a3 -_0806FA50: - movs r0, 0x1 -_0806FA52: - add sp, 0xC - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_806F9BC - - thumb_func_start sub_806FA5C -sub_806FA5C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - mov r8, r0 - adds r5, r1, 0 - adds r6, r2, 0 - adds r0, r5, 0x4 - mov r1, r8 - adds r1, 0x4 - bl GetDirectionTowardsPosition - adds r4, r0, 0 - movs r0, 0 - mov r10, r0 - movs r1, 0 - ldrsh r0, [r6, r1] - bl GetFriendArea - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - adds r0, r5, 0 - adds r0, 0x22 - mov r2, r10 - strb r2, [r0] - mov r0, r8 - adds r1, r5, 0 - bl sub_807A0CC - adds r0, r5, 0 - adds r1, r4, 0 - bl sub_806CE68 - ldr r0, _0806FAD4 - movs r3, 0 - ldrsh r1, [r6, r3] - bl CopyCyanMonsterNametoBuffer - ldr r0, _0806FAD8 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl sub_8052B8C - cmp r0, 0 - bne _0806FAE4 - movs r4, 0 - ldrsh r1, [r6, r4] - ldr r0, _0806FADC - cmp r1, r0 - beq _0806FB28 - ldr r0, _0806FAE0 - ldr r1, [r0] - mov r0, r8 - bl SendMessage - b _0806FB28 - .align 2, 0 -_0806FAD4: .4byte gAvailablePokemonNames -_0806FAD8: .4byte gUnknown_80F9FE8 -_0806FADC: .4byte 0x0000019d -_0806FAE0: .4byte gUnknown_80FA004 -_0806FAE4: - movs r7, 0 - ldr r3, _0806FB2C - ldr r0, [r3] - ldr r2, _0806FB30 - adds r0, r2 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0806FB1A - mov r12, r3 - adds r4, r2, 0 - movs r2, 0 - movs r3, 0x1 -_0806FB00: - adds r2, 0x64 - adds r7, 0x1 - cmp r7, 0x3 - bgt _0806FB1A - mov r1, r12 - ldr r0, [r1] - adds r0, r2, r0 - adds r0, r4 - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0806FB00 -_0806FB1A: - cmp r7, 0x4 - bne _0806FB38 - ldr r0, _0806FB34 - ldr r1, [r0] - mov r0, r8 - bl SendMessage -_0806FB28: - movs r0, 0 - b _0806FCF0 - .align 2, 0 -_0806FB2C: .4byte gRecruitedPokemonRef -_0806FB30: .4byte 0x00008df8 -_0806FB34: .4byte gUnknown_80FA030 -_0806FB38: - mov r0, r9 - bl GetFriendAreaStatus - lsls r0, 24 - cmp r0, 0 - bne _0806FB4E - mov r0, r9 - bl UnlockFriendArea - movs r2, 0x1 - mov r10, r2 -_0806FB4E: - movs r1, 0xFA - lsls r1, 1 - adds r0, r5, 0 - mov r2, r8 - bl sub_8068FE0 - ldr r1, _0806FC40 - movs r0, 0x64 - muls r0, r7 - ldr r3, _0806FC44 - adds r0, r3 - ldr r1, [r1] - adds r5, r1, r0 - movs r4, 0 - movs r0, 0x3 - strh r0, [r5] - strb r4, [r5, 0x2] - ldrh r0, [r6, 0xE] - strb r0, [r5, 0x3] - movs r0, 0x1 - strh r0, [r5, 0x8] - adds r0, r5, 0 - adds r0, 0x4C - movs r1, 0 - bl SetDefaultIQSkills - ldr r0, [r6, 0x44] - str r0, [r5, 0x54] - adds r0, r5, 0 - adds r0, 0x50 - strb r4, [r0] - ldr r0, _0806FC48 - strh r0, [r5, 0xA] - strh r7, [r5, 0xC] - ldrh r0, [r6] - strh r0, [r5, 0xE] - ldr r0, _0806FC4C - ldr r0, [r0] - ldr r4, _0806FC50 - adds r0, r4 - ldr r0, [r0] - str r0, [r5, 0x4] - ldrh r0, [r6, 0x8] - strh r0, [r5, 0x10] - ldrh r0, [r6, 0x8] - strh r0, [r5, 0x12] - ldr r0, [r6, 0x14] - str r0, [r5, 0x44] - ldr r0, [r6, 0x18] - str r0, [r5, 0x48] - movs r2, 0 - adds r7, r6, 0 - adds r7, 0x20 - adds r4, r6, 0 - adds r4, 0xA - adds r3, r6, 0 - adds r3, 0xC - adds r1, r5, 0 - adds r1, 0x14 -_0806FBC4: - adds r0, r4, r2 - ldrb r0, [r0] - strb r0, [r1] - adds r0, r3, r2 - ldrb r0, [r0] - strb r0, [r1, 0x2] - adds r1, 0x1 - adds r2, 0x1 - cmp r2, 0x1 - ble _0806FBC4 - ldr r0, [r6, 0x10] - str r0, [r5, 0x18] - adds r1, r5, 0 - adds r1, 0x1C - adds r0, r7, 0 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r6, 0x1C] - str r0, [r5, 0x40] - adds r4, r5, 0 - adds r4, 0x58 - movs r1, 0 - ldrsh r0, [r6, r1] - bl GetMonSpecies - adds r1, r0, 0 - adds r0, r4, 0 - movs r2, 0xA - bl BoundedCopyStringtoBuffer - bl sub_8097848 - movs r2, 0 - ldrsh r0, [r6, r2] - movs r3, 0x4 - ldrsh r1, [r6, r3] - movs r3, 0x6 - ldrsh r2, [r6, r3] - add r3, sp, 0xC - str r3, [sp] - movs r3, 0 - str r3, [sp, 0x4] - movs r3, 0x1 - str r3, [sp, 0x8] - adds r3, r5, 0 - bl sub_806B8CC - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0 - bne _0806FC58 - ldr r0, _0806FC54 - ldr r1, [r0] - mov r0, r8 - bl SendMessage - strh r7, [r5] - b _0806FCEE - .align 2, 0 -_0806FC40: .4byte gRecruitedPokemonRef -_0806FC44: .4byte 0x00008df8 -_0806FC48: .4byte 0x0000ffff -_0806FC4C: .4byte gDungeon -_0806FC50: .4byte 0x00000644 -_0806FC54: .4byte gUnknown_80FA058 -_0806FC58: - bl sub_8083D88 - movs r0, 0xA0 - movs r1, 0x46 - bl sub_803E708 - ldr r0, _0806FC78 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl sub_8052B8C - cmp r0, 0x1 - bne _0806FC94 - b _0806FC88 - .align 2, 0 -_0806FC78: .4byte gUnknown_80FA090 -_0806FC7C: - ldr r0, _0806FD00 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage -_0806FC88: - adds r0, r4, 0 - bl sub_805FBE8 - lsls r0, 24 - cmp r0, 0 - beq _0806FC7C -_0806FC94: - ldr r4, _0806FD04 - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0 - bl sub_808D9DC - ldr r0, _0806FD08 - ldr r1, [r0] - mov r0, r8 - bl SendMessage - mov r0, r10 - cmp r0, 0 - beq _0806FCD8 - bl xxx_call_GetLeader - adds r1, r0, 0 - adds r0, r4, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _0806FD0C - mov r1, r9 - bl sub_8092558 - movs r0, 0xCE - bl PlaySound - ldr r0, _0806FD10 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage -_0806FCD8: - movs r1, 0 - ldrsh r0, [r6, r1] - cmp r0, 0x97 - bne _0806FCEE - ldr r2, _0806FD14 - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r1, [r2] - movs r0, 0x3 - strb r0, [r1, 0x11] -_0806FCEE: - movs r0, 0x1 -_0806FCF0: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0806FD00: .4byte gUnknown_80FA0C8 -_0806FD04: .4byte gAvailablePokemonNames -_0806FD08: .4byte gUnknown_80FA0F0 -_0806FD0C: .4byte gUnknown_202E628 -_0806FD10: .4byte gUnknown_80FA120 -_0806FD14: .4byte gDungeon - thumb_func_end sub_806FA5C - - thumb_func_start sub_806FD18 -sub_806FD18: - push {r4-r7,lr} - ldr r4, [r0, 0x70] - movs r6, 0x1 - negs r6, r6 - movs r1, 0x4 - ldrsh r0, [r4, r1] - bl GetBodySize - lsls r0, 24 - lsrs r5, r0, 24 - movs r2, 0x2 - ldrsh r0, [r4, r2] - bl sub_806F9BC - lsls r0, 24 - cmp r0, 0 - beq _0806FDEC - bl sub_806F910 - movs r4, 0 - movs r0, 0x6 - subs r3, r0, r5 - ldr r7, _0806FD48 - b _0806FD4E - .align 2, 0 -_0806FD48: .4byte gUnknown_202EE70 -_0806FD4C: - adds r4, 0x1 -_0806FD4E: - cmp r4, r3 - bgt _0806FD70 - movs r2, 0 - cmp r2, r5 - bge _0806FD6A - adds r1, r4, r7 - b _0806FD64 -_0806FD5C: - adds r1, 0x1 - adds r2, 0x1 - cmp r2, r5 - bge _0806FD6A -_0806FD64: - ldrb r0, [r1] - cmp r0, 0 - beq _0806FD5C -_0806FD6A: - cmp r2, r5 - bne _0806FD4C - adds r6, r4, 0 -_0806FD70: - movs r0, 0x1 - negs r0, r0 - cmp r6, r0 - beq _0806FDEC - movs r4, 0 - ldr r3, _0806FDB4 - ldr r0, [r3] - ldr r2, _0806FDB8 - adds r0, r2 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0806FDAC - adds r6, r3, 0 - adds r5, r2, 0 - movs r2, 0 - movs r3, 0x1 -_0806FD94: - adds r2, 0x64 - adds r4, 0x1 - cmp r4, 0x3 - bgt _0806FDAC - ldr r0, [r6] - adds r0, r2, r0 - adds r0, r5 - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0806FD94 -_0806FDAC: - cmp r4, 0x4 - beq _0806FDEC - movs r4, 0 - b _0806FDBE - .align 2, 0 -_0806FDB4: .4byte gRecruitedPokemonRef -_0806FDB8: .4byte 0x00008df8 -_0806FDBC: - adds r4, 0x1 -_0806FDBE: - cmp r4, 0x3 - bgt _0806FDDA - ldr r0, _0806FDE4 - ldr r0, [r0] - lsls r1, r4, 2 - ldr r2, _0806FDE8 - adds r0, r2 - adds r0, r1 - ldr r0, [r0] - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _0806FDBC -_0806FDDA: - cmp r4, 0x4 - beq _0806FDEC - movs r0, 0x1 - b _0806FDEE - .align 2, 0 -_0806FDE4: .4byte gDungeon -_0806FDE8: .4byte 0x0001357c -_0806FDEC: - movs r0, 0 -_0806FDEE: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_806FD18 - .align 2,0 diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index 98cb4234d..ff93b117f 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -2,18 +2,31 @@ #include "structs/str_pokemon.h" #include "structs/struct_8069D4C.h" #include "code_80118A4.h" +#include "code_803E668.h" #include "code_8045A00.h" +#include "code_80521D0.h" +#include "code_806CD90.h" +#include "code_8077274_1.h" #include "code_8097670.h" +#include "dungeon_util.h" #include "friend_area.h" #include "pokemon.h" #include "pokemon_3.h" +#include "pokemon_mid.h" +#include "position_util.h" #include "text_util.h" #include "dungeon_util_1.h" extern u8 gUnknown_202E628[]; extern u8 gUnknown_202E088[]; extern u8 gAvailablePokemonNames[]; +extern u8 gUnknown_202EE70[MAX_TEAM_BODY_SIZE]; +extern u8 *gUnknown_80FA0F0[]; +extern u8 *gUnknown_80FA058[]; +extern u8 *gUnknown_80FA030[]; +extern u8 *gUnknown_80F9FE8[]; +extern u8 *gUnknown_80FA004[]; extern u8 *gUnknown_80FA0C8[]; extern u8 gUnknown_202E088[]; extern u8 *gUnknown_80FA120[]; @@ -25,6 +38,366 @@ u8 sub_806B8CC(); bool8 sub_805FBE8(u8 *a0); extern s32 sub_8052B8C(u32, const u8 *, u32); extern void PrintFieldMessage(u32, const u8 *, u32); +void sub_8083D88(); +u8 sub_808529C(s32); +extern u8 GetBodySize(s16 index); +void sub_806F910(); + +void nullsub_96(Entity *pokemon,Entity *target) +{} + +void sub_806F910(void) +{ + u8 size; + s32 counter; + Entity *entity; + int totalSize; + int index; + s32 sVar6; + + totalSize = 0; + + for(index = 0, sVar6 = 0x40; index < MAX_TEAM_MEMBERS; index++) + { + entity = gDungeon->teamPokemon[index]; + if (EntityExists(entity)) { + size = GetBodySize(entity->info->apparentID); + entity->unk68 = sVar6; + entity->info->unk167 = index; + entity->info->unk168 = size; + for (counter = 0; counter < size; counter++) { + if (totalSize < MAX_TEAM_BODY_SIZE) { + gUnknown_202EE70[totalSize] = 1; + sVar6 += 0x10; + totalSize++; + } + } + sub_806CCB4(entity,sub_806CEBC(entity)); + } + } + for (; totalSize < MAX_TEAM_BODY_SIZE; totalSize++) { + gUnknown_202EE70[totalSize] = 0; + } +} + +bool8 sub_806F9BC(s16 species) +{ + u8 friendArea; + s32 id; + unkStruct_8092638 auStack_18; + + id = species; + if (((gDungeon->fill655[3] == 0) || (sub_808529C(id) == 0)) || + ((id == MONSTER_MEW && (gDungeon->unk678 == 1)))) { + return FALSE; + } + else if (id == MONSTER_LATIAS) + { + return FALSE; + } + else if (id == MONSTER_LATIOS) + { + return FALSE; + } + else if (id == MONSTER_DEOXYS_ATTACK) + { + return FALSE; + } + else if (id == MONSTER_DEOXYS_DEFENSE) + { + return FALSE; + } + else if (id == MONSTER_DEOXYS_SPEED) + { + return FALSE; + } + else { + if (GetUnk12(id) == 0) { + friendArea = GetFriendArea(id); + sub_8092638(friendArea, &auStack_18, FALSE, FALSE); + if (auStack_18.hasFriendArea == FALSE) + return FALSE; + } + return TRUE; + } +} + +bool8 sub_806FA5C(Entity *entity1, Entity *entity2, struct unkStruct_8069D4C *param_3) +{ + u8 friendArea; + bool8 flag; + Entity *leader; + PokemonStruct2 *pokeStruct2; + int pokeIndex; + Entity *local_2c; + s32 iVar2; + u32 direction; + + + direction = GetDirectionTowardsPosition(&entity2->pos,&entity1->pos); + flag = FALSE; + friendArea = GetFriendArea(param_3->id); + entity2->unk22 = 0; + sub_807A0CC(entity1, entity2); + sub_806CE68(entity2, direction); + CopyCyanMonsterNametoBuffer(gAvailablePokemonNames,param_3->id); + + if (sub_8052B8C(0,*gUnknown_80F9FE8,1) == 0) { + if (param_3->id != MONSTER_JIRACHI) { + SendMessage(entity1,*gUnknown_80FA004); + } + return 0; + } + else + { + for(pokeIndex = 0; pokeIndex < MAX_TEAM_MEMBERS; pokeIndex++) + { + if (((u8)(pokeIndex[gRecruitedPokemonRef->pokemon2].unk0) & 1) == 0) + break; + } + + if (pokeIndex == MAX_TEAM_MEMBERS) { + SendMessage(entity1,*gUnknown_80FA030); + return FALSE; + } + else { + if (GetFriendAreaStatus(friendArea) == 0) { + UnlockFriendArea(friendArea); + flag = TRUE; + } + sub_8068FE0(entity2,500,entity1); + pokeStruct2 = &gRecruitedPokemonRef->pokemon2[pokeIndex]; + pokeStruct2->unk0 = 3; + pokeStruct2->isTeamLeader = FALSE; + pokeStruct2->level = param_3->level; + pokeStruct2->IQ = 1; + SetDefaultIQSkills((u8 *)&(pokeStruct2->IQSkills),0); + pokeStruct2->hiddenPower = param_3->hiddenPower; + pokeStruct2->tacticIndex = 0; + pokeStruct2->unkA = -1; + pokeStruct2->unkC = pokeIndex; + pokeStruct2->speciesNum = param_3->id; + (pokeStruct2->dungeonLocation) = gDungeon->dungeonLocation; + pokeStruct2->unk10 = param_3->HP; + pokeStruct2->unk12 = param_3->HP; + pokeStruct2->belly = param_3->belly; + pokeStruct2->maxBelly = param_3->maxBelly; + + for(iVar2 = 0; iVar2 < 2; iVar2++) + { + pokeStruct2->offense.att[iVar2] = param_3->att[iVar2]; + pokeStruct2->offense.def[iVar2] = param_3->def[iVar2]; + } + + pokeStruct2->currExp = param_3->exp; + pokeStruct2->moves = param_3->moves; + + pokeStruct2->itemSlot = param_3->heldItem; + BoundedCopyStringtoBuffer(pokeStruct2->name,GetMonSpecies(param_3->id),10); + + sub_8097848(); + + if (sub_806B8CC(param_3->id,param_3->pos.x,param_3->pos.y,pokeStruct2,&local_2c,0,1) == 0) { + SendMessage(entity1,*gUnknown_80FA058); + pokeStruct2->unk0 = 0; + } + else { + sub_8083D88(); + sub_803E708(0xa0,0x46); + if (sub_8052B8C(0,*gUnknown_80FA090,1) == 1) { + while (sub_805FBE8(pokeStruct2->name) == 0) { + PrintFieldMessage(0,*gUnknown_80FA0C8,1); + } + } + sub_808D9DC(gAvailablePokemonNames,pokeStruct2,0); + SendMessage(entity1,*gUnknown_80FA0F0); + if (flag != '\0') { + leader = xxx_call_GetLeader(); + SetMessageArgument(gAvailablePokemonNames,leader,0); + sub_8092558(gUnknown_202E628,friendArea); + PlaySound(0xce); + PrintFieldMessage(0,*gUnknown_80FA120,1); + } + if (param_3->id == MONSTER_MEW) { + gDungeon->unk4 = 1; + gDungeon->unk11 = 3; + } + } + return TRUE; + } + } +} + +// https://decomp.me/scratch/LByEy (93.86% matching - Seth) + +#ifdef NONMATCHING +bool8 sub_806FD18(Entity *param_1) +{ + s32 size; + s32 uVar3; + int iVar4; + EntityInfo *info; + int index; + + info = param_1->info; + iVar4 = -1; + size = GetBodySize((int)info->apparentID); + if (sub_806F9BC((int)info->id) != 0) { + sub_806F910(); + for (index = 0; index <= (6 - size); index++) { + for(uVar3 = 0; uVar3 < size; uVar3++) + { + if (gUnknown_202EE70[index] != 0) break; + iVar4 = index; + } + if (uVar3 == size) break; + } + if (iVar4 != -1) { + + for(index = 0; index < 4; index++) + { + if (((u8)(index[gRecruitedPokemonRef->pokemon2].unk0) & 1) == 0) break; + } + + if (index != 4) { + for(index = 0; index < 4; index++) + { + if(!EntityExists(gDungeon->teamPokemon[index])) break; + } + if (index != 4) { + return 1; + } + } + } + } + return 0; +} +#else +NAKED +bool8 sub_806FD18(Entity *param_1) +{ + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tldr r4, [r0, 0x70]\n" + "\tmovs r6, 0x1\n" + "\tnegs r6, r6\n" + "\tmovs r1, 0x4\n" + "\tldrsh r0, [r4, r1]\n" + "\tbl GetBodySize\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tmovs r2, 0x2\n" + "\tldrsh r0, [r4, r2]\n" + "\tbl sub_806F9BC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0806FDEC\n" + "\tbl sub_806F910\n" + "\tmovs r4, 0\n" + "\tmovs r0, 0x6\n" + "\tsubs r3, r0, r5\n" + "\tldr r7, _0806FD48\n" + "\tb _0806FD4E\n" + "\t.align 2, 0\n" +"_0806FD48: .4byte gUnknown_202EE70\n" +"_0806FD4C:\n" + "\tadds r4, 0x1\n" +"_0806FD4E:\n" + "\tcmp r4, r3\n" + "\tbgt _0806FD70\n" + "\tmovs r2, 0\n" + "\tcmp r2, r5\n" + "\tbge _0806FD6A\n" + "\tadds r1, r4, r7\n" + "\tb _0806FD64\n" +"_0806FD5C:\n" + "\tadds r1, 0x1\n" + "\tadds r2, 0x1\n" + "\tcmp r2, r5\n" + "\tbge _0806FD6A\n" +"_0806FD64:\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0\n" + "\tbeq _0806FD5C\n" +"_0806FD6A:\n" + "\tcmp r2, r5\n" + "\tbne _0806FD4C\n" + "\tadds r6, r4, 0\n" +"_0806FD70:\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tcmp r6, r0\n" + "\tbeq _0806FDEC\n" + "\tmovs r4, 0\n" + "\tldr r3, _0806FDB4\n" + "\tldr r0, [r3]\n" + "\tldr r2, _0806FDB8\n" + "\tadds r0, r2\n" + "\tldrb r1, [r0]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0806FDAC\n" + "\tadds r6, r3, 0\n" + "\tadds r5, r2, 0\n" + "\tmovs r2, 0\n" + "\tmovs r3, 0x1\n" +"_0806FD94:\n" + "\tadds r2, 0x64\n" + "\tadds r4, 0x1\n" + "\tcmp r4, 0x3\n" + "\tbgt _0806FDAC\n" + "\tldr r0, [r6]\n" + "\tadds r0, r2, r0\n" + "\tadds r0, r5\n" + "\tldrb r1, [r0]\n" + "\tadds r0, r3, 0\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbne _0806FD94\n" +"_0806FDAC:\n" + "\tcmp r4, 0x4\n" + "\tbeq _0806FDEC\n" + "\tmovs r4, 0\n" + "\tb _0806FDBE\n" + "\t.align 2, 0\n" +"_0806FDB4: .4byte gRecruitedPokemonRef\n" +"_0806FDB8: .4byte 0x00008df8\n" +"_0806FDBC:\n" + "\tadds r4, 0x1\n" +"_0806FDBE:\n" + "\tcmp r4, 0x3\n" + "\tbgt _0806FDDA\n" + "\tldr r0, _0806FDE4\n" + "\tldr r0, [r0]\n" + "\tlsls r1, r4, 2\n" + "\tldr r2, _0806FDE8\n" + "\tadds r0, r2\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tbl EntityExists\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0806FDBC\n" +"_0806FDDA:\n" + "\tcmp r4, 0x4\n" + "\tbeq _0806FDEC\n" + "\tmovs r0, 0x1\n" + "\tb _0806FDEE\n" + "\t.align 2, 0\n" +"_0806FDE4: .4byte gDungeon\n" +"_0806FDE8: .4byte 0x0001357c\n" +"_0806FDEC:\n" + "\tmovs r0, 0\n" +"_0806FDEE:\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1" + ); +} + +#endif + bool8 sub_806FDF4(Entity *entity1,Entity *entity2,Entity **entityPtr) { From 24ff46c5856df47168cbaf4a926c8dd209adbbab Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 13 Sep 2024 17:54:31 -0700 Subject: [PATCH 06/18] more decomp --- asm/code_807CD9C.s | 921 --------------------------- include/code_807CD9C.h | 8 + include/dungeon_pokemon_attributes.h | 1 + include/structs/str_dungeon.h | 2 +- ld_script.txt | 3 +- src/code_8048480.c | 2 +- src/code_8066D04.c | 2 +- src/code_807CD9C.c | 502 ++++++++++----- src/code_807E1A0.c | 182 ++++++ src/dungeon_ai_leader.c | 3 +- src/move_actions.c | 2 +- src/move_effects_target.c | 1 - src/save.c | 1 - src/status.c | 4 +- src/status_actions.c | 6 +- src/trap.c | 3 +- 16 files changed, 555 insertions(+), 1088 deletions(-) create mode 100644 include/code_807CD9C.h create mode 100644 src/code_807E1A0.c diff --git a/asm/code_807CD9C.s b/asm/code_807CD9C.s index 298700ef7..a23bf106b 100644 --- a/asm/code_807CD9C.s +++ b/asm/code_807CD9C.s @@ -5,927 +5,6 @@ .text - thumb_func_start sub_807CD9C -sub_807CD9C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x34 - mov r9, r0 - adds r6, r1, 0 - adds r4, r2, 0 - movs r0, 0xA - str r0, [sp, 0x24] - bl IsCurrentFixedRoomBossFight - lsls r0, 24 - cmp r0, 0 - beq _0807CDC4 - ldr r0, _0807CDC0 - b _0807CDFE - .align 2, 0 -_0807CDC0: .4byte gUnknown_80FC9E8 -_0807CDC4: - cmp r9, r6 - bne _0807CDE4 - ldr r0, _0807CDDC - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _0807CDE0 - ldr r2, [r0] - adds r0, r6, 0 - b _0807CE02 - .align 2, 0 -_0807CDDC: .4byte gAvailablePokemonNames -_0807CDE0: .4byte gUnknown_80FCA10 -_0807CDE4: - ldr r0, _0807CE0C - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - adds r0, r6, 0 - movs r1, 0xE - bl HasAbility - lsls r0, 24 - cmp r0, 0 - beq _0807CE28 - ldr r0, _0807CE10 -_0807CDFE: - ldr r2, [r0] - mov r0, r9 -_0807CE02: - adds r1, r6, 0 - bl sub_80522F4 - b _0807D02A - .align 2, 0 -_0807CE0C: .4byte gAvailablePokemonNames -_0807CE10: .4byte gUnknown_80FCBCC -_0807CE14: - str r0, [sp, 0x28] - b _0807CF26 -_0807CE18: - ldrh r0, [r5] - movs r1, 0x3 - ands r1, r0 - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - mov r10, r0 - b _0807CF20 -_0807CE28: - ldr r1, [r6, 0x70] - adds r2, r4, 0x4 - movs r3, 0x7 - adds r0, r2, 0 - ands r0, r3 - adds r1, 0x46 - strb r0, [r1] - movs r0, 0x7 - ands r2, r0 - adds r0, r6, 0 - movs r1, 0x6 - bl sub_806CDD4 - ldr r1, _0807D03C - adds r0, r6, 0 - bl sub_80421C0 - ldr r0, _0807D040 - ldr r2, [r0] - mov r0, r9 - adds r1, r6, 0 - bl sub_80522F4 - movs r1, 0x1 - mov r10, r1 - movs r2, 0 - str r2, [sp, 0x28] - lsls r1, r4, 2 - ldr r0, _0807D044 - adds r1, r0 - mov r8, r1 - add r7, sp, 0x18 -_0807CE68: - ldr r2, [r6, 0x4] - str r2, [sp, 0x18] - ldrh r0, [r7] - mov r3, r8 - ldrh r3, [r3] - adds r0, r3 - lsls r0, 16 - lsrs r0, 16 - ldr r1, _0807D048 - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0x18] - asrs r0, r1, 16 - mov r2, r8 - ldrh r2, [r2, 0x2] - adds r0, r2 - lsls r0, 16 - ldr r2, _0807D04C - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x18] - movs r3, 0 - ldrsh r0, [r7, r3] - cmp r0, 0 - blt _0807CF20 - asrs r1, r2, 16 - cmp r1, 0 - blt _0807CF20 - cmp r0, 0x37 - bgt _0807CF20 - cmp r1, 0x1F - bgt _0807CF20 - mov r1, r8 - movs r2, 0 - ldrsh r0, [r1, r2] - lsls r0, 10 - str r0, [sp, 0x2C] - movs r3, 0x2 - ldrsh r0, [r1, r3] - lsls r0, 10 - str r0, [sp, 0x30] - movs r4, 0x5 -_0807CEBC: - adds r0, r6, 0 - ldr r1, [sp, 0x2C] - ldr r2, [sp, 0x30] - bl IncreaseEntityPixelPos - adds r0, r6, 0 - bl sub_8045888 - lsls r0, 24 - cmp r0, 0 - beq _0807CED8 - movs r0, 0x19 - bl sub_803E46C -_0807CED8: - subs r4, 0x1 - cmp r4, 0 - bge _0807CEBC - movs r1, 0 - ldrsh r0, [r7, r1] - ldr r1, [sp, 0x18] - asrs r1, 16 - bl GetTile - adds r5, r0, 0 - ldr r0, [r5, 0x10] - cmp r0, 0 - bne _0807CE14 - add r4, sp, 0x18 - adds r0, r6, 0 - adds r1, r4, 0 - bl sub_80705F0 - lsls r0, 24 - cmp r0, 0 - bne _0807CE18 - movs r2, 0 - ldrsh r1, [r7, r2] - movs r3, 0x2 - ldrsh r2, [r4, r3] - adds r0, r6, 0 - movs r3, 0x1 - bl sub_80694C0 - ldr r0, [sp, 0x24] - subs r0, 0x1 - str r0, [sp, 0x24] - cmp r0, 0 - bgt _0807CE68 - movs r1, 0x1 - mov r10, r1 -_0807CF20: - mov r2, r10 - cmp r2, 0 - bne _0807CF4E -_0807CF26: - adds r1, r6, 0x4 - adds r0, r6, 0 - bl sub_807D068 - ldr r0, _0807D050 - movs r3, 0 - ldrsh r2, [r0, r3] - movs r1, 0 - str r1, [sp] - str r1, [sp, 0x4] - ldr r0, _0807D054 - str r0, [sp, 0x8] - str r1, [sp, 0xC] - str r1, [sp, 0x10] - str r1, [sp, 0x14] - mov r0, r9 - adds r1, r6, 0 - movs r3, 0 - bl sub_806F370 -_0807CF4E: - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - bne _0807D02A - ldr r0, [sp, 0x28] - cmp r0, 0 - beq _0807CF9E - add r4, sp, 0x1C - ldr r1, _0807D058 - adds r0, r4, 0 - bl InitPokemonMove - ldr r0, [sp, 0x28] - adds r1, r4, 0 - bl sub_80571F0 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _0807CF9E - mov r0, r9 - ldr r1, [sp, 0x28] - bl TrySendImmobilizeSleepEndMsg - ldr r0, _0807D050 - movs r1, 0 - ldrsh r2, [r0, r1] - str r4, [sp] - str r4, [sp, 0x4] - ldr r0, _0807D05C - str r0, [sp, 0x8] - str r4, [sp, 0xC] - str r4, [sp, 0x10] - str r4, [sp, 0x14] - mov r0, r9 - ldr r1, [sp, 0x28] - movs r3, 0 - bl sub_806F370 -_0807CF9E: - bl sub_8044B28 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - bne _0807D02A - adds r0, r6, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807D02A - adds r0, r6, 0 - bl sub_806A5B8 - adds r4, r6, 0x4 - adds r0, r6, 0 - adds r1, r4, 0 - bl sub_80706A4 - lsls r0, 24 - cmp r0, 0 - beq _0807CFD8 - adds r0, r6, 0 - adds r1, r6, 0 - movs r2, 0 - movs r3, 0 - bl sub_807D148 -_0807CFD8: - adds r0, r6, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807D02A - adds r0, r6, 0 - movs r1, 0x8 - bl sub_806CE68 - ldr r0, [r6, 0x70] - ldrb r0, [r0, 0x7] - cmp r0, 0 - beq _0807D014 - ldr r1, _0807D060 - ldr r0, [r1] - strb r5, [r0, 0x1] - ldr r0, [r1] - movs r2, 0xB8 - lsls r2, 3 - adds r0, r2 - movs r1, 0x1 - negs r1, r1 - str r1, [r0] - adds r0, r4, 0 - bl sub_804AC20 - movs r0, 0 - bl sub_807EC28 -_0807D014: - adds r0, r6, 0 - bl sub_806A5B8 - ldr r0, _0807D060 - ldr r0, [r0] - ldr r3, _0807D064 - adds r0, r3 - ldrb r1, [r0] - adds r0, r6, 0 - bl sub_8075900 -_0807D02A: - add sp, 0x34 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807D03C: .4byte 0x000001a3 -_0807D040: .4byte gUnknown_80F8A0C -_0807D044: .4byte gAdjacentTileOffsets -_0807D048: .4byte 0xffff0000 -_0807D04C: .4byte 0x0000ffff -_0807D050: .4byte gUnknown_80F4F90 -_0807D054: .4byte 0x00000219 -_0807D058: .4byte 0x00000163 -_0807D05C: .4byte 0x0000021a -_0807D060: .4byte gDungeon -_0807D064: .4byte 0x00003a08 - thumb_func_end sub_807CD9C - - thumb_func_start sub_807D068 -sub_807D068: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x14 - adds r6, r0, 0 - movs r0, 0 - ldrsh r2, [r1, r0] - lsls r0, r2, 1 - adds r0, r2 - lsls r0, 11 - movs r2, 0xC0 - lsls r2, 4 - adds r2, r0 - mov r10, r2 - movs r0, 0x2 - ldrsh r1, [r1, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r1, 0x80 - lsls r1, 5 - adds r1, r0 - mov r9, r1 - ldr r0, [r6, 0xC] - subs r0, r2 - cmp r0, 0 - bge _0807D0A4 - negs r0, r0 -_0807D0A4: - ldr r1, [r6, 0x10] - cmp r0, 0xB - bgt _0807D0B8 - mov r2, r9 - subs r0, r1, r2 - cmp r0, 0 - bge _0807D0B4 - negs r0, r0 -_0807D0B4: - cmp r0, 0xB - ble _0807D11E -_0807D0B8: - movs r0, 0 - mov r8, r0 - ldr r5, [r6, 0xC] - adds r4, r1, 0 - mov r1, r10 - subs r0, r1, r5 - movs r1, 0xC - bl __divsi3 - str r0, [sp, 0x8] - mov r2, r9 - subs r0, r2, r4 - movs r1, 0xC - bl __divsi3 - str r0, [sp, 0xC] - mov r0, sp - str r0, [sp, 0x10] - movs r7, 0xB -_0807D0DE: - ldr r1, [sp, 0x8] - adds r5, r1 - ldr r2, [sp, 0xC] - adds r4, r2 - str r5, [sp] - ldr r0, [sp, 0x10] - str r4, [r0, 0x4] - mov r0, r8 - bl sin_abs_4096 - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - str r1, [r6, 0x1C] - adds r0, r6, 0 - mov r1, sp - bl sub_804535C - adds r0, r6, 0 - bl sub_8045888 - lsls r0, 24 - cmp r0, 0 - beq _0807D114 - movs r0, 0x1A - bl sub_803E46C -_0807D114: - movs r1, 0xAA - add r8, r1 - subs r7, 0x1 - cmp r7, 0 - bge _0807D0DE -_0807D11E: - mov r2, r10 - str r2, [sp] - mov r0, r9 - str r0, [sp, 0x4] - movs r0, 0 - str r0, [r6, 0x1C] - adds r0, r6, 0 - mov r1, sp - bl sub_804535C - movs r0, 0x1A - bl sub_803E46C - add sp, 0x14 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_807D068 - - thumb_func_start sub_807D148 -sub_807D148: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xC - mov r8, r0 - adds r5, r1, 0 - mov r9, r2 - str r3, [sp, 0x4] - ldr r0, [r5, 0x70] - mov r10, r0 - movs r1, 0 - str r1, [sp, 0x8] - ldr r0, _0807D180 - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument - adds r0, r5, 0 - movs r1, 0xE - bl HasAbility - lsls r0, 24 - cmp r0, 0 - beq _0807D188 - ldr r0, _0807D184 - b _0807D194 - .align 2, 0 -_0807D180: .4byte gAvailablePokemonNames -_0807D184: .4byte gUnknown_80FCAE8 -_0807D188: - bl IsCurrentFixedRoomBossFight - lsls r0, 24 - cmp r0, 0 - beq _0807D1A4 - ldr r0, _0807D1A0 -_0807D194: - ldr r2, [r0] - mov r0, r8 - adds r1, r5, 0 - bl sub_80522F4 - b _0807D3A8 - .align 2, 0 -_0807D1A0: .4byte gUnknown_80FC97C -_0807D1A4: - mov r2, r9 - cmp r2, 0x1 - bne _0807D1DC - ldr r0, _0807D1D0 - ldr r0, [r0] - ldr r3, _0807D1D4 - adds r0, r3 - ldr r1, [r0] - ldr r0, [r5, 0x4] - cmp r1, r0 - bne _0807D1DC - ldr r0, _0807D1D8 - ldr r2, [r0] - mov r0, r8 - adds r1, r5, 0 - bl sub_80522F4 - mov r0, r8 - adds r1, r5, 0 - bl PetrifiedStatusTarget - b _0807D3A8 - .align 2, 0 -_0807D1D0: .4byte gDungeon -_0807D1D4: .4byte 0x0000e21c -_0807D1D8: .4byte gUnknown_80FC9A0 -_0807D1DC: - ldr r0, _0807D27C - ldr r2, [r0] - mov r0, r8 - adds r1, r5, 0 - bl sub_80522F4 - adds r0, r5, 0 - adds r1, r5, 0 - bl TrySendImmobilizeSleepEndMsg - mov r0, r8 - adds r1, r5, 0 - bl sub_80421AC - adds r0, r5, 0 - bl sub_8045888 - lsls r0, 24 - cmp r0, 0 - beq _0807D252 - mov r0, r10 - adds r0, 0x46 - ldrb r4, [r0] - ldr r1, [r5, 0x1C] - movs r2, 0x80 - lsls r2, 4 - adds r1, r2 - str r1, [r5, 0x1C] - ldr r2, _0807D280 - adds r6, r0, 0 - cmp r1, r2 - bgt _0807D252 - movs r7, 0x7 -_0807D21E: - ldr r0, _0807D284 - ldr r0, [r0] - movs r1, 0x3 - ands r0, r1 - cmp r0, 0 - bne _0807D23C - adds r4, 0x1 - ands r4, r7 - adds r0, r4, 0 - ands r0, r7 - strb r0, [r6] - adds r0, r5, 0 - adds r1, r4, 0 - bl sub_806CE68 -_0807D23C: - movs r0, 0x22 - bl sub_803E46C - ldr r1, [r5, 0x1C] - movs r3, 0x80 - lsls r3, 4 - adds r1, r3 - str r1, [r5, 0x1C] - ldr r0, _0807D280 - cmp r1, r0 - ble _0807D21E -_0807D252: - mov r0, r9 - cmp r0, 0x1 - beq _0807D288 - cmp r0, 0x1 - bcc _0807D264 - cmp r0, 0x2 - beq _0807D2B0 - cmp r0, 0x3 - beq _0807D2C8 -_0807D264: - mov r0, sp - bl sub_8083660 - lsls r0, 24 - cmp r0, 0 - bne _0807D2CE - ldr r0, [r5, 0x4] - str r0, [sp] - movs r1, 0x1 - str r1, [sp, 0x8] - b _0807D2CE - .align 2, 0 -_0807D27C: .4byte gUnknown_80FC584 -_0807D280: .4byte 0x00009fff -_0807D284: .4byte gUnknown_202EDCC -_0807D288: - ldr r0, _0807D2A8 - ldr r1, [r0] - ldr r2, _0807D2AC - adds r1, r2 - mov r0, sp - bl sub_808384C - lsls r0, 24 - cmp r0, 0 - bne _0807D2CE - ldr r0, [r5, 0x4] - str r0, [sp] - movs r3, 0x1 - str r3, [sp, 0x8] - b _0807D2CE - .align 2, 0 -_0807D2A8: .4byte gDungeon -_0807D2AC: .4byte 0x0000e21c -_0807D2B0: - mov r0, sp - ldr r1, [sp, 0x4] - bl sub_808384C - lsls r0, 24 - cmp r0, 0 - bne _0807D2CE - ldr r0, [r5, 0x4] - str r0, [sp] - movs r0, 0x1 - str r0, [sp, 0x8] - b _0807D2CE -_0807D2C8: - ldr r1, [sp, 0x4] - ldr r0, [r1] - str r0, [sp] -_0807D2CE: - mov r0, sp - movs r2, 0 - ldrsh r1, [r0, r2] - movs r3, 0x2 - ldrsh r2, [r0, r3] - adds r0, r5, 0 - movs r3, 0x1 - bl sub_80694C0 - adds r0, r5, 0 - movs r1, 0 - bl sub_804535C - adds r0, r5, 0 - bl sub_807BB78 - movs r0, 0x1 - bl sub_803F580 - adds r0, r5, 0 - bl sub_8045888 - lsls r0, 24 - cmp r0, 0 - beq _0807D340 - mov r1, r10 - adds r1, 0x46 - ldrb r4, [r1] - movs r0, 0x9C - lsls r0, 8 - str r0, [r5, 0x1C] - adds r6, r1, 0 - movs r7, 0x7 -_0807D310: - ldr r0, _0807D3B8 - ldr r0, [r0] - movs r1, 0x3 - ands r0, r1 - cmp r0, 0 - bne _0807D32E - adds r4, 0x1 - ands r4, r7 - adds r0, r4, 0 - ands r0, r7 - strb r0, [r6] - adds r0, r5, 0 - adds r1, r4, 0 - bl sub_806CE68 -_0807D32E: - movs r0, 0x22 - bl sub_803E46C - ldr r0, [r5, 0x1C] - ldr r1, _0807D3BC - adds r0, r1 - str r0, [r5, 0x1C] - cmp r0, 0 - bgt _0807D310 -_0807D340: - movs r4, 0 - str r4, [r5, 0x1C] - movs r0, 0x22 - bl sub_803E46C - ldr r2, [sp, 0x8] - cmp r2, 0 - beq _0807D35C - ldr r0, _0807D3C0 - ldr r2, [r0] - mov r0, r8 - adds r1, r5, 0 - bl sub_80522F4 -_0807D35C: - mov r3, r9 - cmp r3, 0x1 - bne _0807D36A - mov r0, r8 - adds r1, r5, 0 - bl PetrifiedStatusTarget -_0807D36A: - mov r1, r10 - ldrb r0, [r1, 0x7] - cmp r0, 0 - beq _0807D392 - adds r0, r5, 0x4 - bl sub_804AC20 - ldr r1, _0807D3C4 - ldr r0, [r1] - strb r4, [r0, 0x1] - ldr r0, [r1] - movs r2, 0xB8 - lsls r2, 3 - adds r0, r2 - movs r1, 0x1 - negs r1, r1 - str r1, [r0] - movs r0, 0 - bl sub_807EC28 -_0807D392: - adds r0, r5, 0 - bl sub_806A5B8 - ldr r0, _0807D3C4 - ldr r0, [r0] - ldr r3, _0807D3C8 - adds r0, r3 - ldrb r1, [r0] - adds r0, r5, 0 - bl sub_8075900 -_0807D3A8: - add sp, 0xC - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807D3B8: .4byte gUnknown_202EDCC -_0807D3BC: .4byte 0xfffffc00 -_0807D3C0: .4byte gUnknown_80FCB14 -_0807D3C4: .4byte gDungeon -_0807D3C8: .4byte 0x00003a08 - thumb_func_end sub_807D148 - - thumb_func_start sub_807D3CC -sub_807D3CC: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - mov r8, r0 - movs r2, 0 - ldr r4, _0807D448 - ldr r0, [r4] - ldr r1, _0807D44C - adds r0, r1 - ldrb r6, [r0] - cmp r6, 0 - bne _0807D3E8 - movs r6, 0x2 -_0807D3E8: - mov r0, r8 - str r2, [sp] - bl GetEntityRoom - lsls r0, 24 - lsrs r1, r0, 24 - ldr r2, [sp] - cmp r1, 0xFF - bne _0807D450 - mov r3, r8 - movs r1, 0x6 - ldrsh r0, [r3, r1] - subs r5, r0, r6 - adds r0, r6 - cmp r5, r0 - bgt _0807D4A8 -_0807D408: - mov r3, r8 - movs r1, 0x4 - ldrsh r0, [r3, r1] - subs r4, r0, r6 - adds r0, r6 - adds r7, r5, 0x1 - cmp r4, r0 - bgt _0807D438 -_0807D418: - adds r0, r4, 0 - adds r1, r5, 0 - str r2, [sp] - bl sub_807D4E0 - ldr r2, [sp] - orrs r2, r0 - lsls r0, r2, 24 - lsrs r2, r0, 24 - adds r4, 0x1 - mov r3, r8 - movs r1, 0x4 - ldrsh r0, [r3, r1] - adds r0, r6 - cmp r4, r0 - ble _0807D418 -_0807D438: - adds r5, r7, 0 - mov r3, r8 - movs r1, 0x6 - ldrsh r0, [r3, r1] - adds r0, r6 - cmp r5, r0 - ble _0807D408 - b _0807D4A8 - .align 2, 0 -_0807D448: .4byte gDungeon -_0807D44C: .4byte 0x00018209 -_0807D450: - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - ldr r3, _0807D468 - adds r0, r3 - ldr r1, [r4] - adds r6, r1, r0 - movs r1, 0x4 - ldrsh r0, [r6, r1] - subs r5, r0, 0x1 - b _0807D49E - .align 2, 0 -_0807D468: .4byte 0x000104c4 -_0807D46C: - movs r1, 0x2 - ldrsh r0, [r6, r1] - subs r4, r0, 0x1 - movs r3, 0x6 - ldrsh r0, [r6, r3] - adds r0, 0x1 - adds r7, r5, 0x1 - cmp r4, r0 - bgt _0807D49C -_0807D47E: - adds r0, r4, 0 - adds r1, r5, 0 - str r2, [sp] - bl sub_807D4E0 - ldr r2, [sp] - orrs r2, r0 - lsls r0, r2, 24 - lsrs r2, r0, 24 - adds r4, 0x1 - movs r1, 0x6 - ldrsh r0, [r6, r1] - adds r0, 0x1 - cmp r4, r0 - ble _0807D47E -_0807D49C: - adds r5, r7, 0 -_0807D49E: - movs r3, 0x8 - ldrsh r0, [r6, r3] - adds r0, 0x1 - cmp r5, r0 - ble _0807D46C -_0807D4A8: - cmp r2, 0 - beq _0807D4C4 - ldr r0, _0807D4C0 - ldr r1, [r0] - mov r0, r8 - bl SendMessage - bl sub_8040A84 - bl sub_8049ED4 - b _0807D4CE - .align 2, 0 -_0807D4C0: .4byte gUnknown_80FD2F8 -_0807D4C4: - ldr r0, _0807D4DC - ldr r1, [r0] - mov r0, r8 - bl SendMessage -_0807D4CE: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807D4DC: .4byte gUnknown_80FD320 - thumb_func_end sub_807D3CC - - thumb_func_start sub_807D4E0 -sub_807D4E0: - push {r4,lr} - bl GetTile - ldr r4, [r0, 0x14] - cmp r4, 0 - beq _0807D506 - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x2 - bne _0807D506 - adds r1, r4, 0 - adds r1, 0x20 - ldrb r0, [r1] - cmp r0, 0 - bne _0807D506 - movs r0, 0x1 - strb r0, [r1] - b _0807D508 -_0807D506: - movs r0, 0 -_0807D508: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_807D4E0 - thumb_func_start sub_807D510 sub_807D510: push {r4-r7,lr} diff --git a/include/code_807CD9C.h b/include/code_807CD9C.h new file mode 100644 index 000000000..0f3c8dafc --- /dev/null +++ b/include/code_807CD9C.h @@ -0,0 +1,8 @@ +#ifndef CODE_807CD9C_H +#define CODE_807CD9C_H + +void sub_807CD9C(Entity *pokemon, Entity *target, u32 direction); +void sub_807D148(Entity *pokemon, Entity *target, u32 param_3, Position *pos); +void sub_807D3CC(Entity *param_1); + +#endif /* ifndef CODE_807CD9C_H */ diff --git a/include/dungeon_pokemon_attributes.h b/include/dungeon_pokemon_attributes.h index 4a308dc38..e2aca1773 100644 --- a/include/dungeon_pokemon_attributes.h +++ b/include/dungeon_pokemon_attributes.h @@ -4,6 +4,7 @@ #include "structs/dungeon_entity.h" bool8 HasSafeguardStatus(Entity * param_1, Entity * param_2, bool8 displayMessage); +bool8 sub_8071728(Entity * pokemon, Entity * target, bool8 displayMessage); bool8 sub_80717A4(Entity *pokemon, u16 moveID); bool8 HasAbility(Entity *pokemon, u8 ability); bool8 MonsterIsType(Entity *pokemon, u8 type); diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 7dd29b8cb..b260b7b95 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -275,7 +275,7 @@ typedef struct Dungeon /* 0x3A16 */ s16 unk3A16; /* 0x3A18 */ Tile tiles[DUNGEON_MAX_SIZE_Y][DUNGEON_MAX_SIZE_X]; Position unkE218; - Position unkE21C; + Position unkE21C; // stair location? Position unkE220[8]; u32 unkE240; u8 fillE244[0xE250 - 0xE244]; diff --git a/ld_script.txt b/ld_script.txt index 2d7ff2628..783e507a0 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -279,8 +279,9 @@ SECTIONS { src/dungeon_ai_movement.o(.text); src/dungeon_ai_attack.o(.text); src/targeting_flags.o(.text); - asm/code_807CD9C.o(.text); src/code_807CD9C.o(.text); + asm/code_807CD9C.o(.text); + src/code_807E1A0.o(.text); src/weather.o(.text); asm/code_807E5AC.o(.text); src/trap.o(.text); diff --git a/src/code_8048480.c b/src/code_8048480.c index bfbb8ad80..606dea9f1 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -3,6 +3,7 @@ #include "code_8045A00.h" #include "code_80521D0.h" #include "code_8077274_1.h" +#include "code_807CD9C.h" #include "code_808417C.h" #include "constants/dungeon_action.h" #include "constants/dungeon.h" @@ -107,7 +108,6 @@ extern void PrintFieldMessage(u32, u8 *, u32); extern void sub_8044E24(Entity *, u32, u32); extern void sub_804245C(Entity *, Item *); extern u8 sub_8072938(Entity *, u16); -extern void sub_807D148(Entity *pokemon, Entity *r1, u32 r2, Position *r3); extern void sub_8072008(Entity *pokemon, Entity *r1, u32 r2, u8 r3, u32); extern void LevelDownTarget(Entity *pokemon, Entity *r1, u32 r2); extern void sub_80522F4(Entity *pokemon, Entity *r1, const u8[]); diff --git a/src/code_8066D04.c b/src/code_8066D04.c index b9bfc7fea..6d55ea059 100644 --- a/src/code_8066D04.c +++ b/src/code_8066D04.c @@ -1,6 +1,7 @@ #include "global.h" #include "code_8045A00.h" #include "code_80521D0.h" +#include "code_807CD9C.h" #include "dungeon_map_access.h" #include "dungeon_movement.h" #include "dungeon_music.h" @@ -34,7 +35,6 @@ void sub_8045BF8(u8 *, Item *); u8 sub_80460F8(Position *, Item *, u32); extern void sub_807AB38(Entity *, u32); extern Entity * sub_8044DA4(Entity *param_1,int param_2); -extern void sub_807D148(Entity *pokemon, Entity *r1, u32 r2, Position *r3); extern void sub_806A6E8(Entity *); extern void sub_8044DF0(Entity *, u32, u32); extern void sub_8045DB4(Position *, u32); diff --git a/src/code_807CD9C.c b/src/code_807CD9C.c index feed949e2..aef238e8a 100644 --- a/src/code_807CD9C.c +++ b/src/code_807CD9C.c @@ -1,182 +1,386 @@ #include "global.h" -#include "code_804267C.h" +#include "constants/ability.h" +#include "code_803E46C.h" #include "code_8045A00.h" #include "code_80521D0.h" -#include "constants/ability.h" -#include "constants/type.h" -#include "dungeon_ai.h" -#include "dungeon_leader.h" -#include "dungeon_map_access.h" -#include "dungeon_pokemon_attributes.h" -#include "dungeon_util.h" -#include "move_util.h" -#include "moves.h" +#include "code_806CD90.h" +#include "code_807CD9C.h" #include "structs/str_dungeon.h" +#include "code_8077274_1.h" +#include "dungeon_ai.h" +#include "dungeon_engine.h" +#include "dungeon_movement.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_map_access.h" +#include "dungeon_util.h" +#include "math.h" +#include "move_effects_target.h" +#include "moves.h" +#include "move_util.h" -extern u8 UseAttack(Entity *); -extern void sub_805E804(void); -void sub_806A2BC(Entity *pokemon, u8 param_2); -extern u8 sub_8044B28(void); -extern void sub_8068FE0(Entity *, u32, Entity *r2); -extern void nullsub_93(Position *); -extern void sub_80522F4(Entity *, Entity *, u8 *); -extern void sub_806F370(Entity *pokemon, Entity *target, u32, u32, u8 *, u8 moveType, s32, u32, u32, u32); -extern void sub_80694C0(Entity *, s32, s32, u32); -extern void sub_807EC28(bool8); -extern void sub_806A5B8(Entity *); - -extern u32 gUnknown_80F5FAC[]; -extern u8 *gUnknown_80F9C4C[]; -extern u8 *gUnknown_80F9C70[]; -extern u8 *gUnknown_80F9C8C[]; -extern u8 *gUnknown_80F9CBC[]; +extern u32 gUnknown_202EDCC; extern u8 gAvailablePokemonNames[]; -extern u8 *gUnknown_80FCAC0[]; -void sub_807E1A0(Entity *pokemon,Entity *target,u8 moveType,s16 param_4,s32 param_5) +extern s16 gUnknown_80F4F90; +extern u8 *gUnknown_80FCA10[]; +extern u8 *gUnknown_80F8A0C[]; +extern u8 *gUnknown_80FCBCC[]; +extern u8 *gUnknown_80FC9E8[]; +extern u8 *gUnknown_80FCB14[]; +extern u8 *gUnknown_80FCAE8[]; +extern u8 *gUnknown_80FC97C[]; +extern u8 *gUnknown_80FC9A0[]; +extern u8 *gUnknown_80FC584[]; +extern u8 *gUnknown_80FD320[]; +extern u8 *gUnknown_80FD2F8[]; + +bool8 ExposeTrap(s32 x, s32 y); +void sub_8040A84(); +void sub_8049ED4(); +void sub_806A5B8(Entity *); +void sub_80522F4(Entity *, Entity *, u8 *); +void sub_80421C0(Entity *, u32); +u8 sub_8045888(Entity *); +void sub_807EC28(u32); +void sub_80694C0(Entity *, s32, s32, s32); +void sub_807D068(Entity *, Position *); +u8 sub_8044B28(void); +extern void sub_806F370(Entity *pokemon, Entity *target, u32, u32, u8 *, u8 moveType, s32, u32, u32, u32); +void sub_80421AC(Entity * pokemon, Entity * target); +void sub_807BB78(Entity *pokemon); +extern void sub_803F580(u32); +bool8 sub_808384C(Position *, Position *); +u8 sub_8083660(Position *); + +void sub_807CD9C(Entity *pokemon, Entity *target, u32 direction) { - EntityInfo *targetInfo; - u8 flag; - Move move; - s32 newHP; - s32 param_4_s32; + Tile *tile; + int iVar8; + bool8 flag; + Position sp_0x18; + Move move; + int sp_0x24; + Entity *sp_0x28; + Position32 sp_0x2C; - param_4_s32 = param_4; - - if (EntityExists(target)) { - targetInfo = target->info; - InitPokemonMove(&move, MOVE_REGULAR_ATTACK); - if (!sub_80571F0(target,&move)) { - if (!targetInfo->isNotTeamMember) { - newHP = targetInfo->HP; - newHP /= 2; - if (MonsterIsType(target, TYPE_FIRE)) { - newHP /= 2; - } - if (newHP < 1) { - newHP = 1; - } - } - else { - newHP = param_5; - if (MonsterIsType(target, TYPE_FIRE)) { - newHP /= 2; - } - } - sub_806F370(pokemon,target,newHP,0,&flag,moveType,param_4_s32,0,0,0); + sp_0x24 = 10; + if (IsCurrentFixedRoomBossFight()) { + sub_80522F4(pokemon,target,*gUnknown_80FC9E8); // It couldn't be knocked flying! + return; + } + else + { + if (pokemon == target) { + SetMessageArgument(gAvailablePokemonNames,target,0); + sub_80522F4(pokemon,target,*gUnknown_80FCA10); // {ARG_POKEMON_0} couldn't be knocked flying! + return; + } + SetMessageArgument(gAvailablePokemonNames,target,0); + if (HasAbility(target,ABILITY_SUCTION_CUPS)) { + sub_80522F4(pokemon,target,*gUnknown_80FCBCC); // {ARG_POKEMON_0} is anchored! It can't be knocked flying! + return; + } + else + { + (target->info->action).direction = (direction + 4) & DIRECTION_MASK; + sub_806CDD4(target, 6, (direction + 4) & DIRECTION_MASK); + sub_80421C0(target,0x1a3); + sub_80522F4(pokemon,target,*gUnknown_80F8A0C); // {ARG_POKEMON_0} was blown away! + flag = TRUE; + sp_0x28 = NULL; + + for(; sp_0x24 > 0; sp_0x24--) + { + sp_0x18 = target->pos; + sp_0x18.x += gAdjacentTileOffsets[direction].x; + sp_0x18.y += gAdjacentTileOffsets[direction].y; + if ((((sp_0x18.x < 0) || (sp_0x18.y < 0)) || (DUNGEON_MAX_SIZE_X <= sp_0x18.x)) || + (DUNGEON_MAX_SIZE_Y <= sp_0x18.y)) goto _0807CF20; + sp_0x2C.x = gAdjacentTileOffsets[direction].x << 0xA; + sp_0x2C.y = gAdjacentTileOffsets[direction].y << 0xA; + + for(iVar8 = 0; iVar8 < 6; iVar8++) + { + IncreaseEntityPixelPos(target,sp_0x2C.x,sp_0x2C.y); + if (sub_8045888(target) != 0) { + sub_803E46C(0x19); + } + } + tile = GetTile(sp_0x18.x, sp_0x18.y); + if (tile->monster != NULL) { + sp_0x28 = tile->monster; + goto _0807CF26; + } + if (sub_80705F0(target,&sp_0x18)){ + flag = (tile->terrainType & 3) == 0 ? FALSE : TRUE; + goto _0807CF20; + } + sub_80694C0(target,sp_0x18.x,sp_0x18.y,1); + } + + + flag = TRUE; + _0807CF20: + if (!flag) { + _0807CF26: + + sub_807D068(target,&target->pos); + sub_806F370(pokemon,target,gUnknown_80F4F90,0,0,0,0x219,0,0,0); + } + if (sub_8044B28()) { + return; + } + if (sp_0x28 != NULL) { + InitPokemonMove(&move,0x163); + if (!sub_80571F0(sp_0x28,&move)) { + sub_807A96C(pokemon,sp_0x28); + sub_806F370(pokemon,sp_0x28,gUnknown_80F4F90,0,0,0,0x21a,0,0,0); + } + } + if (sub_8044B28()) { + return; + } + if (!EntityExists(target)) { + return; + } + sub_806A5B8(target); + if (sub_80706A4(target,&target->pos)) { + sub_807D148(target,target,0,0); + } + if (!EntityExists(target)) { + return; + } + sub_806CE68(target,8); + if (target->info->isTeamLeader) { + gDungeon->unk1 = 0; + gDungeon->unk5C0 = -1; + sub_804AC20(&target->pos); + sub_807EC28(FALSE); + } + sub_806A5B8(target); + sub_8075900(target,gDungeon->unk3A08); + } } - } } -void sub_807E254(Entity *pokemon,Entity *target) +void sub_807D068(Entity *pokemon, Position *pos) { - Position pokemonPos; - Position targetPos; + int pixelX; + int posY; + int pixelY; + int posX; + int counter; + int iVar8; + s32 diff; + Position32 local_34; + int incrementX; + int incrementY; + posX = pos->x * 0x1800 + 0xc00; + posY = pos->y * 0x1800 + 0x1000; + diff = (pokemon->pixelPos).x - posX; + if (diff < 0) { + diff = -diff; + } + if (diff < 0xc) { + diff = (pokemon->pixelPos).y - posY; + if (diff < 0) { + diff = -diff; + } + if (diff < 0xc) goto _0807D11E; + } + iVar8 = 0; + pixelX = (pokemon->pixelPos).x; + pixelY = (pokemon->pixelPos).y; + incrementX = (posX - pixelX) / 0xc; + incrementY = (posY - pixelY) / 0xc; + + for(counter = 0; counter < 0xC; counter++) + { + pixelX += incrementX; + pixelY += incrementY; + local_34.x = pixelX; + local_34.y = pixelY; + pokemon->unk1C = sin_abs_4096(iVar8) * 0xc; + sub_804535C(pokemon, &local_34); + if (sub_8045888(pokemon)) { + sub_803E46C(0x1a); + } + iVar8 = iVar8 + 0xaa; + } +_0807D11E: + local_34.x = posX; + local_34.y = posY; + pokemon->unk1C = 0; + sub_804535C(pokemon,&local_34); + sub_803E46C(0x1a); +} + +void sub_807D148(Entity *pokemon, Entity *target, u32 param_3, Position *pos) +{ + EntityInfo *info; + u32 direction; + Position local_2c; + Position pos2; + bool8 flag; + + info = target->info; + flag = FALSE; - if (HasAbility(pokemon, ABILITY_SUCTION_CUPS)) { - SetMessageArgument(gAvailablePokemonNames,pokemon,0); - sub_80522F4(pokemon,target,*gUnknown_80FCAC0); // $m0 is anchored! It won't switch places - } - else if(HasAbility(target, ABILITY_SUCTION_CUPS)) - { SetMessageArgument(gAvailablePokemonNames,target,0); - sub_80522F4(pokemon,target,*gUnknown_80FCAC0); // $m0 is anchored! It won't switch places - } - else - { - pokemonPos.x = pokemon->pos.x; - pokemonPos.y = pokemon->pos.y; - targetPos.x = target->pos.x; - targetPos.y = target->pos.y; - nullsub_93(&pokemonPos); - nullsub_93(&targetPos); - sub_80694C0(pokemon,targetPos.x,targetPos.y,1); - sub_80694C0(target,pokemonPos.x,pokemonPos.y,1); - sub_804535C(pokemon,NULL); - sub_804535C(target,NULL); - - if (EntityExists(pokemon)) { - if (pokemon->info->isTeamLeader) { - sub_804AC20(&pokemon->pos); - sub_807EC28(FALSE); - } - sub_806A5B8(pokemon); - sub_8075900(pokemon,gDungeon->unk3A08); + if (HasAbility(target,ABILITY_SUCTION_CUPS)) { + sub_80522F4(pokemon,target,*gUnknown_80FCAE8); + return; + } + if (IsCurrentFixedRoomBossFight()) { + sub_80522F4(pokemon,target,*gUnknown_80FC97C); + return; + } + if (param_3 == 1) + { + pos2 = gDungeon->unkE21C; + if(pos2.x == target->pos.x && pos2.y == target->pos.y) { + sub_80522F4(pokemon,target,*gUnknown_80FC9A0); // It's already on the stairs! + PetrifiedStatusTarget(pokemon,target); + return; + } } - if (EntityExists(target)) { - if (target->info->isTeamLeader) { + sub_80522F4(pokemon,target,*gUnknown_80FC584); // $m0 warped! + sub_807A96C(target,target); + sub_80421AC(pokemon,target); + if (sub_8045888(target)) { + direction = (info->action).direction; + target->unk1C += + 0x800; + while ( target->unk1C < 0xa000) { + if ((gUnknown_202EDCC & 3) == 0) { + direction = (direction + 1) & DIRECTION_MASK; + info->action.direction = direction & DIRECTION_MASK; + sub_806CE68(target,direction); + } + sub_803E46C(0x22); + target->unk1C += 0x800; + } + } + + + switch(param_3) + { + default: + case 0: + if (!sub_8083660(&local_2c)) { + local_2c = target->pos; + flag = TRUE; + } + break; + case 1: + if (!sub_808384C(&local_2c,&gDungeon->unkE21C)) { + local_2c = target->pos; + flag = TRUE; + } + break; + case 2: + if (!sub_808384C(&local_2c,pos)) { + local_2c = target->pos; + flag = TRUE; + } + break; + case 3: + local_2c = *pos; + break; + + } + + sub_80694C0(target,local_2c.x,local_2c.y,1); + sub_804535C(target,0); + sub_807BB78(target); + sub_803F580(1); + if (sub_8045888(target)) { + direction = (info->action).direction; + target->unk1C = 0x9c00; + do { + if ((gUnknown_202EDCC & 3) == 0) { + direction = (direction + 1) & DIRECTION_MASK; + info->action.direction = direction & DIRECTION_MASK; + sub_806CE68(target,direction); + } + sub_803E46C(0x22); + target->unk1C -= 0x400; + } while (0 < target->unk1C); + } + target->unk1C = 0; + sub_803E46C(0x22); + if (flag) { + sub_80522F4(pokemon,target,*gUnknown_80FCB14); // But it dropped back at the same spot! + } + if (param_3 == 1) { + PetrifiedStatusTarget(pokemon,target); + } + if (info->isTeamLeader) { sub_804AC20(&target->pos); - sub_807EC28(FALSE); - } - sub_806A5B8(target); - sub_8075900(target,gDungeon->unk3A08); + gDungeon->unk1 = 0; + gDungeon->unk5C0 = -1; + sub_807EC28(0); } - } + sub_806A5B8(target); + sub_8075900(target,gDungeon->unk3A08); } -void sub_807E378(void) +void sub_807D3CC(Entity *param_1) { - u16 uVar2; - Entity *leader; + u32 room; + u8 flag; + int x; + int y; + s32 range; + RoomData *roomData; - leader = GetLeader(); - if (EntityExists(leader)) { + flag = FALSE; + range = gDungeon->unk181e8.visibilityRange; + if (range == 0) { + range = 2; + } + room = GetEntityRoom(param_1); - uVar2 = gDungeon->windTurns; - if ((gDungeon->windTurns < 1) || - (gDungeon->windTurns--, ((uVar2 - 1) << 0x10) < 1)) { - gDungeon->unk67A = 3; - } - - if (gDungeon->unk67A == 0) { - if (gDungeon->windTurns < 0xfa) { - sub_805E804(); - sub_806A2BC(leader,1); - UseAttack(leader); - if (sub_8044B28() == 0) { - SendMessage(leader,*gUnknown_80F9C4C); - sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],0); - gDungeon->unk67A = 1; + if (room == CORRIDOR_ROOM) { + for (y = (param_1->pos).y - range; y <= ((param_1->pos).y + range); y++) + { + for (x = (param_1->pos).x - range; x <= ((param_1->pos).x + range); x++) { + flag |= ExposeTrap(x,y); + } } - } } - else if (gDungeon->unk67A == 1) { - if (gDungeon->windTurns < 0x96) { - sub_805E804(); - sub_806A2BC(leader,1); - UseAttack(leader); - if (sub_8044B28() == 0) { - SendMessage(leader,*gUnknown_80F9C70); - sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],1); - gDungeon->unk67A = 2; + else { + roomData = &gDungeon->roomData[room]; + for (y = roomData->bottomRightCornerY + -1; y <= roomData->topLeftCornerY + 1; y++) { + for (x = roomData->bottomRightCornerX + -1; x <= roomData->topLeftCornerX + 1; x++) { + flag |= ExposeTrap(x,y); + } } - } } - else if (gDungeon->unk67A == 2) { - if (gDungeon->windTurns < 0x32) { - sub_805E804(); - sub_806A2BC(leader,1); - UseAttack(leader); - if (sub_8044B28() == 0) { - SendMessage(leader,*gUnknown_80F9C8C); - sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],2); - gDungeon->unk67A = 3; - } - } + if (flag) { + SendMessage(param_1,*gUnknown_80FD2F8); // All traps were exposed + sub_8040A84(); + sub_8049ED4(); } - else if (gDungeon->windTurns < 1) { - sub_805E804(); - sub_806A2BC(leader,1); - UseAttack(leader); - if (sub_8044B28() == 0) { - SendMessage(leader,*gUnknown_80F9CBC); - sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],3); - gDungeon->unk67A = 4; - sub_8068FE0(leader,0x21e,leader); - } + else { + SendMessage(param_1,*gUnknown_80FD320); // There appears to be no hidden traps. + } +} + +bool8 ExposeTrap(s32 x,s32 y) +{ + Tile *tile; + Entity *trap; + + tile = GetTile(x,y); + trap = tile->object; + if (((trap != NULL) && (GetEntityType(trap) == ENTITY_TRAP)) && (!trap->isVisible)) { + trap->isVisible = TRUE; + return TRUE; + } + else { + return FALSE; } - } } diff --git a/src/code_807E1A0.c b/src/code_807E1A0.c new file mode 100644 index 000000000..feed949e2 --- /dev/null +++ b/src/code_807E1A0.c @@ -0,0 +1,182 @@ +#include "global.h" + +#include "code_804267C.h" +#include "code_8045A00.h" +#include "code_80521D0.h" +#include "constants/ability.h" +#include "constants/type.h" +#include "dungeon_ai.h" +#include "dungeon_leader.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_util.h" +#include "move_util.h" +#include "moves.h" +#include "structs/str_dungeon.h" + +extern u8 UseAttack(Entity *); +extern void sub_805E804(void); +void sub_806A2BC(Entity *pokemon, u8 param_2); +extern u8 sub_8044B28(void); +extern void sub_8068FE0(Entity *, u32, Entity *r2); +extern void nullsub_93(Position *); +extern void sub_80522F4(Entity *, Entity *, u8 *); +extern void sub_806F370(Entity *pokemon, Entity *target, u32, u32, u8 *, u8 moveType, s32, u32, u32, u32); +extern void sub_80694C0(Entity *, s32, s32, u32); +extern void sub_807EC28(bool8); +extern void sub_806A5B8(Entity *); + +extern u32 gUnknown_80F5FAC[]; +extern u8 *gUnknown_80F9C4C[]; +extern u8 *gUnknown_80F9C70[]; +extern u8 *gUnknown_80F9C8C[]; +extern u8 *gUnknown_80F9CBC[]; +extern u8 gAvailablePokemonNames[]; +extern u8 *gUnknown_80FCAC0[]; + +void sub_807E1A0(Entity *pokemon,Entity *target,u8 moveType,s16 param_4,s32 param_5) +{ + EntityInfo *targetInfo; + u8 flag; + Move move; + s32 newHP; + s32 param_4_s32; + + param_4_s32 = param_4; + + if (EntityExists(target)) { + targetInfo = target->info; + InitPokemonMove(&move, MOVE_REGULAR_ATTACK); + if (!sub_80571F0(target,&move)) { + if (!targetInfo->isNotTeamMember) { + newHP = targetInfo->HP; + newHP /= 2; + if (MonsterIsType(target, TYPE_FIRE)) { + newHP /= 2; + } + if (newHP < 1) { + newHP = 1; + } + } + else { + newHP = param_5; + if (MonsterIsType(target, TYPE_FIRE)) { + newHP /= 2; + } + } + sub_806F370(pokemon,target,newHP,0,&flag,moveType,param_4_s32,0,0,0); + } + } +} + +void sub_807E254(Entity *pokemon,Entity *target) +{ + Position pokemonPos; + Position targetPos; + + + if (HasAbility(pokemon, ABILITY_SUCTION_CUPS)) { + SetMessageArgument(gAvailablePokemonNames,pokemon,0); + sub_80522F4(pokemon,target,*gUnknown_80FCAC0); // $m0 is anchored! It won't switch places + } + else if(HasAbility(target, ABILITY_SUCTION_CUPS)) + { + SetMessageArgument(gAvailablePokemonNames,target,0); + sub_80522F4(pokemon,target,*gUnknown_80FCAC0); // $m0 is anchored! It won't switch places + } + else + { + pokemonPos.x = pokemon->pos.x; + pokemonPos.y = pokemon->pos.y; + targetPos.x = target->pos.x; + targetPos.y = target->pos.y; + nullsub_93(&pokemonPos); + nullsub_93(&targetPos); + sub_80694C0(pokemon,targetPos.x,targetPos.y,1); + sub_80694C0(target,pokemonPos.x,pokemonPos.y,1); + sub_804535C(pokemon,NULL); + sub_804535C(target,NULL); + + if (EntityExists(pokemon)) { + if (pokemon->info->isTeamLeader) { + sub_804AC20(&pokemon->pos); + sub_807EC28(FALSE); + } + sub_806A5B8(pokemon); + sub_8075900(pokemon,gDungeon->unk3A08); + } + + if (EntityExists(target)) { + if (target->info->isTeamLeader) { + sub_804AC20(&target->pos); + sub_807EC28(FALSE); + } + sub_806A5B8(target); + sub_8075900(target,gDungeon->unk3A08); + } + } +} + +void sub_807E378(void) +{ + u16 uVar2; + Entity *leader; + + leader = GetLeader(); + if (EntityExists(leader)) { + + uVar2 = gDungeon->windTurns; + if ((gDungeon->windTurns < 1) || + (gDungeon->windTurns--, ((uVar2 - 1) << 0x10) < 1)) { + gDungeon->unk67A = 3; + } + + if (gDungeon->unk67A == 0) { + if (gDungeon->windTurns < 0xfa) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9C4C); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],0); + gDungeon->unk67A = 1; + } + } + } + else if (gDungeon->unk67A == 1) { + if (gDungeon->windTurns < 0x96) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9C70); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],1); + gDungeon->unk67A = 2; + } + } + } + else if (gDungeon->unk67A == 2) { + if (gDungeon->windTurns < 0x32) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9C8C); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],2); + gDungeon->unk67A = 3; + } + } + } + else if (gDungeon->windTurns < 1) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9CBC); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],3); + gDungeon->unk67A = 4; + sub_8068FE0(leader,0x21e,leader); + } + } + } +} diff --git a/src/dungeon_ai_leader.c b/src/dungeon_ai_leader.c index c212b0653..3d3c33f5e 100644 --- a/src/dungeon_ai_leader.c +++ b/src/dungeon_ai_leader.c @@ -7,6 +7,7 @@ #include "code_8045A00.h" #include "code_80521D0.h" #include "code_8077274_1.h" +#include "code_807CD9C.h" #include "constants/dungeon_action.h" #include "constants/dungeon.h" #include "constants/iq_skill.h" @@ -24,7 +25,6 @@ #include "dungeon_visibility.h" #include "pokemon_3.h" #include "pokemon.h" -#include "code_8077274_1.h" #include "trap.h" extern u8 gUnknown_202F221; @@ -81,7 +81,6 @@ void HandleEatAIAction(Entity *pokemon); bool8 sub_8044B84(void); extern void sub_8074094(Entity *); extern void sub_8071DA4(Entity *); -extern void sub_807D148(Entity *pokemon, Entity *r1, u32 r2, Position *r3); u32 sub_8075818(Entity *entity); bool8 TargetLeader(Entity *pokemon) diff --git a/src/move_actions.c b/src/move_actions.c index 10daadf37..713ecaa9f 100644 --- a/src/move_actions.c +++ b/src/move_actions.c @@ -4,6 +4,7 @@ #include "code_8045A00.h" #include "code_806CD90.h" #include "code_8077274_1.h" +#include "code_807CD9C.h" #include "code_808417C.h" #include "constants/ability.h" #include "constants/status.h" @@ -200,7 +201,6 @@ extern void sub_806EAF4(Entity *, Entity *, u8, u32, u32, s32 *, u32, u16, u32); extern void sub_8045C28(Item *, u8 , u8); extern void sub_805A7D4(Entity *, Entity *, Item *, Position *); extern void MudWaterSportEffect(u32); -extern void sub_807D148(Entity *pokemon, Entity *target, u32 r2, Position *r3); extern void sub_806EAF4(Entity *, Entity *, u8, u32, u32, s32 *, u32, u16, u32); extern void sub_806A6E8(Entity *); diff --git a/src/move_effects_target.c b/src/move_effects_target.c index a260350da..f693d5c20 100644 --- a/src/move_effects_target.c +++ b/src/move_effects_target.c @@ -126,7 +126,6 @@ extern u8 *gUnknown_80FC270[]; extern u8 *gUnknown_80FC138[]; extern u8 *gUnknown_80FC21C[]; -extern bool8 sub_8071728(Entity * pokemon, Entity * target, bool8 displayMessage); extern void sub_8041F28(Entity *, s32); extern void sub_8041F4C(Entity *, s32); extern void sub_8041F70(Entity *, s32); diff --git a/src/save.c b/src/save.c index 5099d464d..5f333724a 100644 --- a/src/save.c +++ b/src/save.c @@ -44,7 +44,6 @@ extern u32 SaveRecruitedPokemon(u8 *, u32); extern u32 RestoreRecruitedPokemon(void* a, s32 b); extern u32 SavePokemonStruct2(u8 *, u32); extern u32 RestorePokemonStruct2(void* a, s32 b); -extern u32 sub_80921C4(u8 *, u32); extern u32 sub_80954CC(void* a, s32 b); extern u32 sub_8095624(u8 *, u32); extern u32 RestoreMailInfo(void* a, s32 b); diff --git a/src/status.c b/src/status.c index e4b145438..c5dc01239 100644 --- a/src/status.c +++ b/src/status.c @@ -17,6 +17,7 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_util.h" #include "math.h" +#include "move_effects_target.h" #include "number_util.h" #include "status_checks_1.h" #include "structs/map.h" @@ -134,8 +135,6 @@ extern s32 gFormatData_202DE30[10]; extern void sub_8041D84(Entity *); extern void sub_804178C(u32); extern void sub_8041D5C(Entity *); -extern void RaiseAttackStageTarget(Entity *, Entity *, u32, u32); -extern void RaiseDefenseStageTarget(Entity *, Entity *, u32, u32); extern void sub_8041D48(Entity *); extern void sub_8041D38(Entity * pokemon); extern u8 sub_8043D10(void); @@ -168,7 +167,6 @@ extern void sub_8041CCC(Entity *); extern void sub_8041CB8(Entity *r0); extern void sub_8041C1C(Entity *r0); extern void sub_8042060(Entity *, s32); -extern bool8 sub_8071728(Entity * param_1, Entity * param_2, u8 param_3); extern void sub_8041FB4(Entity *r0, u32 r1); extern void sub_8041FD8(Entity *r0, u32 r1); extern void sub_80522F4(Entity *r1, Entity *r2, u8 *); diff --git a/src/status_actions.c b/src/status_actions.c index b94e59c9f..d4c05ec85 100644 --- a/src/status_actions.c +++ b/src/status_actions.c @@ -6,6 +6,7 @@ #include "code_80521D0.h" #include "code_806CD90.h" #include "code_8077274_1.h" +#include "code_807CD9C.h" #include "code_808417C.h" #include "constants/ability.h" #include "constants/move_id.h" @@ -50,7 +51,6 @@ extern void sub_8042A54(Position *); extern void sub_8049BB0(s32, s32); extern s16 sub_8057600(Move*, u32); extern u32 sub_8055864(Entity *pokemon, Entity *target, Move *param_3, s32 param_4, s32 param_5); -extern void sub_807D148(Entity *pokemon, Entity *r1, u32 r2, Position *r3); extern void sub_807DB74(Entity *); extern void HandleLuminousOrbAction(Entity *pokemon); extern void sub_807D510(Entity *, Entity *); @@ -61,7 +61,6 @@ extern void sub_806BB6C(Entity *, s32); extern void sub_807E254(Entity *, Entity *, u32); extern u32 sub_8055640(Entity *, Entity *, Move *, u32, u32); extern void sub_806A6E8(Entity *); -extern void sub_807D3CC(Entity *, Entity *); extern u8 sub_8069D18(Position *); extern u8 sub_804AD34(Position *); @@ -82,7 +81,6 @@ extern void sub_8075C58(Entity *, Entity *, s32, s32); extern void DealDamageToEntity(Entity *, s32, u32, u32); extern bool8 sub_805755C(Entity* pokemon,u16 moveID); extern void sub_80783C4(Entity *, Entity *, u32); -extern void sub_807CD9C(Entity *, Entity *, u32 direction); // NOTE: Override pokemon.c types for these two funcs @@ -726,7 +724,7 @@ bool8 RockSmashMoveAction(Entity * pokemon, Entity * target, Move *move, s32 par bool8 sub_805BA44(Entity * pokemon, Entity * target, Move *move, s32 param_4) { - sub_807D3CC(pokemon, target); + sub_807D3CC(pokemon); return TRUE; } diff --git a/src/trap.c b/src/trap.c index 011786fa8..e05697734 100644 --- a/src/trap.c +++ b/src/trap.c @@ -5,6 +5,7 @@ #include "code_8045A00.h" #include "code_80521D0.h" #include "code_8077274_1.h" +#include "code_807CD9C.h" #include "code_808417C.h" #include "constants/trap.h" #include "constants/type.h" @@ -92,9 +93,7 @@ void sub_8049ED4(void); void sub_80522F4(Entity *pokemon, Entity *target, const char r2[]); u8 sub_803D6FC(void); Entity *sub_8045684(u8, Position *, u8); -extern void sub_807D148(Entity *pokemon, Entity *target, u32 r2, Position *r3); extern void sub_807DF38(Entity *pokemon, Entity *target, Position *pos, u32, u8 moveType, s16); -extern void sub_807CD9C(Entity *, Entity *, u32 direction); void sub_807FC3C(Position *pos, u32 trapID, u32 param_3) { From 0ceb445c255f18df91dd5e8e1529d0e334f0a121 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 18 Sep 2024 19:35:14 -0700 Subject: [PATCH 07/18] rebase updates --- include/code_8069D4C.h | 9 +++------ include/moves.h | 6 +++--- include/structs/dungeon_entity.h | 9 +++++++-- include/structs/str_pokemon.h | 6 +++--- src/code_8048480.c | 2 +- src/code_8069D4C.c | 4 ++-- src/code_806FDF4.c | 2 +- src/code_8077274_1.c | 8 ++++---- src/code_807CD9C.c | 4 ++-- src/dungeon_ai_attack.c | 26 +++++++++++++------------- src/dungeon_ai_item_weight.c | 4 ++-- src/dungeon_ai_leader.c | 6 +++--- src/dungeon_pokemon_attributes.c | 2 +- src/friend_rescue.c | 6 +++--- src/move_actions.c | 16 ++++++++-------- src/move_checks.c | 8 ++++---- src/move_util.c | 10 +++++----- src/moves.c | 12 ++++++------ src/pokemon_mid.c | 7 +++---- src/status.c | 6 +++--- src/status_actions.c | 2 +- src/status_checks.c | 6 +++--- src/status_checks_1.c | 2 +- src/trap.c | 6 +++--- src/trap_1.c | 10 +++++----- src/wonder_mail.c | 2 +- src/wonder_mail_5.c | 2 +- 27 files changed, 92 insertions(+), 91 deletions(-) diff --git a/include/code_8069D4C.h b/include/code_8069D4C.h index bb653ea57..9687a386e 100644 --- a/include/code_8069D4C.h +++ b/include/code_8069D4C.h @@ -6,17 +6,14 @@ struct unkStruct_8069D4C s16 id; Position pos; s16 HP; - u8 atk; - u8 spAtk; - u8 def; - u8 spDef; + /* 0x0 */ u8 att[2]; // Atk, SpAtk + /* 0x2 */ u8 def[2]; // Def, SpDef u16 level; u32 exp; FixedPoint belly; FixedPoint maxBelly; Item heldItem; - Move moves[MAX_MON_MOVES]; - u32 unk40; // strugglemoveFlags? + Moves moves; HiddenPower hiddenPower; }; diff --git a/include/moves.h b/include/moves.h index ca21c661a..f8cb09d1c 100644 --- a/include/moves.h +++ b/include/moves.h @@ -86,7 +86,7 @@ bool8 sub_8093318(s32, Move *moves); bool8 sub_809333C(s32, Move *moves); s32 sub_80935B8(Move *moves, s32 index); void sub_8094060(Move *srcMoves, Move *destMoves); -void sub_8094184(struct unkStruct_8094924 *, struct unkStruct_8094184 *); -void sub_80941FC(struct unkStruct_8094924 *, struct unkStruct_8094184 *); +void sub_8094184(struct unkStruct_8094924 *, struct Moves *); +void sub_80941FC(struct unkStruct_8094924 *, struct Moves *); -#endif // GUARD_MOVES_H \ No newline at end of file +#endif // GUARD_MOVES_H diff --git a/include/structs/dungeon_entity.h b/include/structs/dungeon_entity.h index 91da6a214..f7c59105d 100644 --- a/include/structs/dungeon_entity.h +++ b/include/structs/dungeon_entity.h @@ -168,6 +168,12 @@ typedef struct Unk_Entity_x184 /* 0x19e - 0x1a */ u8 unk1A; } Unk_Entity_x184 ; +typedef struct Moves +{ + /* 0x118 */ Move moves[MAX_MON_MOVES]; + /* 0x138 */ u8 struggleMoveFlags; +} Moves; + // size: 0x208 typedef struct EntityInfo { @@ -272,8 +278,7 @@ typedef struct EntityInfo // When non-zero, an AI Pokémon will move in a random direction every turn when it is a room. // There is a chance of this flag being set when a wild Pokémon spawns. The chance depends on the dungeon's randomMovementChance. /* 0x114 */ u32 moveRandomly; - /* 0x118 */ Move moves[MAX_MON_MOVES]; - /* 0x138 */ u8 struggleMoveFlags; + /* 0x118 */ Moves moves; /* 0x13C */ FixedPoint belly; /* 0x140 */ FixedPoint maxBelly; /* 0x144 */ bool8 aiNextToTarget; // True if an AI Pokémon is following another Pokémon and is already adjacent to them. diff --git a/include/structs/str_pokemon.h b/include/structs/str_pokemon.h index 92560d2ed..aa01421aa 100644 --- a/include/structs/str_pokemon.h +++ b/include/structs/str_pokemon.h @@ -69,10 +69,10 @@ typedef struct PokemonStruct2 u16 unk12; // pokeHP /* 0x14 */ Offense offense; // offense (other offset) /* 0x18 */ u32 currExp; - /* 0x1C */ unkStruct_8094184 moves; + /* 0x1C */ Moves moves; /* 0x40 */ Item itemSlot; // heldItem - u32 belly; // some struct - u32 maxBelly; // some struct (same type as 44) + FixedPoint belly; // some struct + FixedPoint maxBelly; // some struct (same type as 44) /* 0x4C */ u32 IQSkills; // unk20 /* 0x50 */ u8 tacticIndex; /* 0x54 */ HiddenPower hiddenPower; diff --git a/src/code_8048480.c b/src/code_8048480.c index 606dea9f1..3045ad7b8 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -652,7 +652,7 @@ void GinsengItemAction(Entity *pokemon, Entity * target) if (DungeonRandInt(100) < gUnknown_80F4F46) moveBoost = 3; if (entityInfo->isTeamLeader) { - for(moveIndex = 0, movePtr1 = &entityInfo->moves[0], movePtr2 = movePtr1; moveIndex < MAX_MON_MOVES; movePtr1++, movePtr2++, moveIndex++) + for(moveIndex = 0, movePtr1 = &entityInfo->moves.moves[0], movePtr2 = movePtr1; moveIndex < MAX_MON_MOVES; movePtr1++, movePtr2++, moveIndex++) { if((movePtr1->moveFlags & MOVE_FLAG_EXISTS) && (movePtr1->moveFlags & MOVE_FLAG_SET)) { diff --git a/src/code_8069D4C.c b/src/code_8069D4C.c index f95d71c63..d72280641 100644 --- a/src/code_8069D4C.c +++ b/src/code_8069D4C.c @@ -1,7 +1,7 @@ #include "global.h" #include "pokemon_mid.h" #include "dungeon_util.h" -#include "structs/struct_8069D4C.h" +#include "code_8069D4C.h" u32 sub_8069D18(Position *pos,Entity *entity) { @@ -38,7 +38,7 @@ void sub_8069D4C(struct unkStruct_8069D4C *r0, Entity *target) r0->def[0] = info->def; r0->def[1] = info->spDef; r0->heldItem = info->heldItem; - memcpy(r0->moves.moves, info->moves, sizeof(r0->moves)); + memcpy(r0->moves.moves, info->moves.moves, sizeof(r0->moves)); r0->belly = info->belly; r0->maxBelly = info->maxBelly; r0->hiddenPower = info->hiddenPower; diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index ff93b117f..22ea36afb 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -1,6 +1,6 @@ #include "global.h" #include "structs/str_pokemon.h" -#include "structs/struct_8069D4C.h" +#include "code_8069D4C.h" #include "code_80118A4.h" #include "code_803E668.h" #include "code_8045A00.h" diff --git a/src/code_8077274_1.c b/src/code_8077274_1.c index 90a5b7018..e0bab1df4 100644 --- a/src/code_8077274_1.c +++ b/src/code_8077274_1.c @@ -476,7 +476,7 @@ void RestorePPTarget(Entity * pokemon,Entity * target, s32 param_3) for(index = 0; index < MAX_MON_MOVES; index++) { - movePtr = &entityInfo->moves[index]; + movePtr = &entityInfo->moves.moves[index]; movePtr1 = movePtr; if ((movePtr->moveFlags & MOVE_FLAG_EXISTS)) { PP = movePtr->PP; @@ -689,7 +689,7 @@ void SetChargeStatusTarget(Entity *pokemon, Entity *target, u8 newStatus, Move * for(index = 0; index < MAX_MON_MOVES; index++) { - movePtr = &entityInfo->moves[index]; + movePtr = &entityInfo->moves.moves[index]; if(movePtr == move) { entityInfo->charging.chargingStatusMoveIndex = index; @@ -1118,7 +1118,7 @@ void sub_8079F20(Entity * pokemon, Entity * target, u8 param_3, u8 param_4) for(index = 0; index < MAX_MON_MOVES; index++) { - move = &entityInfo->moves[index]; + move = &entityInfo->moves.moves[index]; if ((move->moveFlags & MOVE_FLAG_EXISTS) && (move->moveFlags2 & MOVE_FLAG_EXISTS)) { bVar8 = TRUE; moveUnsealed = TRUE; @@ -1155,7 +1155,7 @@ void sub_807A0CC(Entity * pokemon, Entity * target) for(index = 0; index < MAX_MON_MOVES; index++) { - move = &entityInfo->moves[index]; + move = &entityInfo->moves.moves[index]; if ((move->moveFlags & MOVE_FLAG_EXISTS)) { move->moveFlags2 &= ~(MOVE_FLAG_EXISTS); } diff --git a/src/code_807CD9C.c b/src/code_807CD9C.c index aef238e8a..f9f3c7e60 100644 --- a/src/code_807CD9C.c +++ b/src/code_807CD9C.c @@ -134,7 +134,7 @@ void sub_807CD9C(Entity *pokemon, Entity *target, u32 direction) if (sp_0x28 != NULL) { InitPokemonMove(&move,0x163); if (!sub_80571F0(sp_0x28,&move)) { - sub_807A96C(pokemon,sp_0x28); + TrySendImmobilizeSleepEndMsg(pokemon,sp_0x28); sub_806F370(pokemon,sp_0x28,gUnknown_80F4F90,0,0,0,0x21a,0,0,0); } } @@ -248,7 +248,7 @@ void sub_807D148(Entity *pokemon, Entity *target, u32 param_3, Position *pos) } sub_80522F4(pokemon,target,*gUnknown_80FC584); // $m0 warped! - sub_807A96C(target,target); + TrySendImmobilizeSleepEndMsg(target,target); sub_80421AC(pokemon,target); if (sub_8045888(target)) { direction = (info->action).direction; diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index d7eefec8c..88e260294 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -95,18 +95,18 @@ void DecideAttack(Entity *pokemon) { for (i = 0; i < MAX_MON_MOVES; i++) { - if (pokemonInfo->moves[i].moveFlags & MOVE_FLAG_EXISTS && - MoveMatchesChargingStatus(pokemon, &pokemonInfo->moves[i]) && + if (pokemonInfo->moves.moves[i].moveFlags & MOVE_FLAG_EXISTS && + MoveMatchesChargingStatus(pokemon, &pokemonInfo->moves.moves[i]) && pokemonInfo->charging.chargingStatusMoveIndex == i) { s32 chosenMoveIndex; SetMonsterActionFields(&pokemonInfo->action, ACTION_USE_MOVE_AI); chosenMoveIndex = i; - if (i > 0 && pokemonInfo->moves[i].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN) + if (i > 0 && pokemonInfo->moves.moves[i].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN) { while (--chosenMoveIndex > 0) { - if (!(pokemonInfo->moves[chosenMoveIndex].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + if (!(pokemonInfo->moves.moves[chosenMoveIndex].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { break; } @@ -122,10 +122,10 @@ void DecideAttack(Entity *pokemon) numUsableMoves = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - Move *move = &pokemonInfo->moves[i]; - if (pokemonInfo->moves[i].moveFlags & MOVE_FLAG_EXISTS) + Move *move = &pokemonInfo->moves.moves[i]; + if (pokemonInfo->moves.moves[i].moveFlags & MOVE_FLAG_EXISTS) { - if (pokemonInfo->moves[i].moveFlags & MOVE_FLAG_ENABLED_FOR_AI) + if (pokemonInfo->moves.moves[i].moveFlags & MOVE_FLAG_ENABLED_FOR_AI) { numUsableMoves++; } @@ -161,7 +161,7 @@ void DecideAttack(Entity *pokemon) // This requires a separate check from the 0-PP check used for unlinked moves. for (i = 0; i < MAX_MON_MOVES; i++) { - Move *move = &pokemonInfo->moves[i]; + Move *move = &pokemonInfo->moves.moves[i]; if (!(move->moveFlags & MOVE_FLAG_EXISTS)) { break; @@ -202,7 +202,7 @@ void DecideAttack(Entity *pokemon) { Move *move; aiPossibleMove[i].canBeUsed = FALSE; - move = &pokemonInfo->moves[i]; + move = &pokemonInfo->moves.moves[i]; if (move->moveFlags & MOVE_FLAG_EXISTS && willNotUnlinkMove[i] && CanAIUseMove(pokemon, i, hasPPChecker) && @@ -319,17 +319,17 @@ void DecideAttack(Entity *pokemon) } else { - AIConsiderMove(&aiPossibleMove[i], pokemon, &pokemonInfo->moves[i]); + AIConsiderMove(&aiPossibleMove[i], pokemon, &pokemonInfo->moves.moves[i]); if (aiPossibleMove[i].canBeUsed) { s32 chosenMoveIndex; SetMonsterActionFields(&pokemonInfo->action, ACTION_USE_MOVE_AI); chosenMoveIndex = i; - if (i > 0 && pokemonInfo->moves[i].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN) + if (i > 0 && pokemonInfo->moves.moves[i].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN) { while (--chosenMoveIndex > 0) { - if (!(pokemonInfo->moves[chosenMoveIndex].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + if (!(pokemonInfo->moves.moves[chosenMoveIndex].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { break; } @@ -1012,7 +1012,7 @@ void HandleUseOrbAction(Entity *pokemon) if (!entityInfo->isTeamLeader) { sp28.canBeUsed = r8; sp28.weight = 10; - AIConsiderMove(&sp28, pokemon, entityInfo->moves); + AIConsiderMove(&sp28, pokemon, entityInfo->moves.moves); if (sp28.canBeUsed) { entityInfo->action.direction = sp28.direction & 7; diff --git a/src/dungeon_ai_item_weight.c b/src/dungeon_ai_item_weight.c index 8e2c57d05..4a8a0af5e 100644 --- a/src/dungeon_ai_item_weight.c +++ b/src/dungeon_ai_item_weight.c @@ -79,7 +79,7 @@ u32 GetAIUseItemProbability(Entity *targetPokemon, Item *item, u32 itemTargetFla break; case ITEM_MAX_ELIXIR: itemWeight = 0; - move = pokemonInfo->moves; + move = pokemonInfo->moves.moves; move2 = move; for (i = 0; i < MAX_MON_MOVES; move++, move2++, i++) { @@ -427,7 +427,7 @@ u32 GetAIUseItemProbability(Entity *targetPokemon, Item *item, u32 itemTargetFla itemWeight = 30; break; case ITEM_ROLLCALL_ORB: - move = pokemonInfo->moves; // Fixes a regswap. + move = pokemonInfo->moves.moves; // Fixes a regswap. if (targetOther) { itemWeight = 0; diff --git a/src/dungeon_ai_leader.c b/src/dungeon_ai_leader.c index 3d3c33f5e..62c6e3beb 100644 --- a/src/dungeon_ai_leader.c +++ b/src/dungeon_ai_leader.c @@ -139,7 +139,7 @@ bool8 sub_8072CF4(Entity *entity) for(index = 0; index < MAX_MON_MOVES; index++) { - move = &info->moves[index]; + move = &info->moves.moves[index]; if ((move->moveFlags & MOVE_FLAG_EXISTS)) { move->moveFlags2 &= ~(MOVE_FLAG2_UNK4); } @@ -334,8 +334,8 @@ bool8 sub_8072CF4(Entity *entity) for(index = 0; index < MAX_MON_MOVES; index++) { - move = &info->moves[index]; - if ((info->moves[index].moveFlags & MOVE_FLAG_EXISTS) && (move->moveFlags & MOVE_FLAG_LAST_USED)) { + move = &info->moves.moves[index]; + if ((info->moves.moves[index].moveFlags & MOVE_FLAG_EXISTS) && (move->moveFlags & MOVE_FLAG_LAST_USED)) { move->PP = 0; bVar4 = TRUE; } diff --git a/src/dungeon_pokemon_attributes.c b/src/dungeon_pokemon_attributes.c index 62cae8eb9..721506820 100644 --- a/src/dungeon_pokemon_attributes.c +++ b/src/dungeon_pokemon_attributes.c @@ -79,7 +79,7 @@ bool8 sub_80717A4(Entity *pokemon, u16 moveID) Move *pokeMove2; // some reason uses another pointer to same struct - for(index = 0, pokeMove = entityInfo->moves, pokeMove2 = pokeMove; index < MAX_MON_MOVES; pokeMove++, pokeMove2++, index++) + for(index = 0, pokeMove = entityInfo->moves.moves, pokeMove2 = pokeMove; index < MAX_MON_MOVES; pokeMove++, pokeMove2++, index++) { if (((pokeMove->moveFlags & MOVE_FLAG_EXISTS)) && (entityInfo->isTeamLeader || ((pokeMove->moveFlags & MOVE_FLAG_ENABLED_FOR_AI)))) if((sub_805744C(pokemon, pokeMove2, TRUE) != 0) && (pokeMove->PP != 0)) diff --git a/src/friend_rescue.c b/src/friend_rescue.c index 86024ccd2..a6fa8840b 100644 --- a/src/friend_rescue.c +++ b/src/friend_rescue.c @@ -824,7 +824,7 @@ void sub_8032828(void) case 0x32: if (sub_8030894() == 0) { ResetUnusedInputStruct(); - sub_800641C(NULL, TRUE, TRUE); + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sub_80306A8(WONDER_MAIL_TYPE_SOS, 0, NULL, 6); } break; @@ -921,7 +921,7 @@ void sub_8032828(void) case 0x1D: if (sub_8030894() == 0) { ResetUnusedInputStruct(); - sub_800641C(NULL, TRUE, TRUE); + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sub_80306A8(WONDER_MAIL_TYPE_AOK, 0, NULL, 6); } break; @@ -1028,7 +1028,7 @@ void sub_8032828(void) if (sub_8030894() != 0) break; ResetUnusedInputStruct(); - sub_800641C(NULL, TRUE, TRUE); + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sub_80306A8(WONDER_MAIL_TYPE_SOS, 0, NULL, 6); break; case 0x15: diff --git a/src/move_actions.c b/src/move_actions.c index 713ecaa9f..311e039c8 100644 --- a/src/move_actions.c +++ b/src/move_actions.c @@ -308,7 +308,7 @@ void sub_8057588(Entity * pokemon, u8 param_2) entityInfo = pokemon->info; for(index = 0; index < MAX_MON_MOVES; index++) { - move = &entityInfo->moves[index]; + move = &entityInfo->moves.moves[index]; if ((move->moveFlags & MOVE_FLAG_EXISTS)) { PPtoRemove = 1; if ((move->moveFlags2 & MOVE_FLAG_LAST_USED)) { @@ -556,7 +556,7 @@ bool8 TormentMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4 for(iVar4 = 0; iVar4 < MAX_MON_MOVES; iVar4++) { - movePtr = &entityInfo->moves[iVar4]; + movePtr = &entityInfo->moves.moves[iVar4]; if ((movePtr->moveFlags & MOVE_FLAG_EXISTS) != 0) { if ((movePtr->moveFlags & MOVE_FLAG_DISABLED) == 0) { if ((movePtr->moveFlags & MOVE_FLAG_LAST_USED) != 0) { @@ -573,18 +573,18 @@ bool8 TormentMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4 } }; - if ((entityInfo->struggleMoveFlags & MOVE_FLAG_DISABLED) == 0) { - if ((entityInfo->struggleMoveFlags & MOVE_FLAG_LAST_USED) != 0) { + if ((entityInfo->moves.struggleMoveFlags & MOVE_FLAG_DISABLED) == 0) { + if ((entityInfo->moves.struggleMoveFlags & MOVE_FLAG_LAST_USED) != 0) { InitPokemonMove(&struggleMove, MOVE_STRUGGLE); - entityInfo->struggleMoveFlags |= MOVE_FLAG_DISABLED; + entityInfo->moves.struggleMoveFlags |= MOVE_FLAG_DISABLED; isTormented = TRUE; sub_80928C0(gFormatItems,&struggleMove,0); // $i0 was tormented sub_80522F4(pokemon,target,*gUnknown_80FCFBC); } } - else if ((entityInfo->struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0) { - entityInfo->struggleMoveFlags &= ~(MOVE_FLAG_DISABLED); + else if ((entityInfo->moves.struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0) { + entityInfo->moves.struggleMoveFlags &= ~(MOVE_FLAG_DISABLED); } if (isTormented) { @@ -2321,7 +2321,7 @@ bool8 ConversionMoveAction(Entity * pokemon,Entity * target,Move * move,u32 para { for(index = 0; index < MAX_MON_MOVES; index++) { - movePtr = &info->moves[index]; + movePtr = &info->moves.moves[index]; if (((movePtr->moveFlags & MOVE_FLAG_EXISTS)) && (GetMoveTypeForMonster(target,movePtr) != TYPE_NONE)) { moveStack[counter] = movePtr; counter++; diff --git a/src/move_checks.c b/src/move_checks.c index 1f857e105..34390b1eb 100644 --- a/src/move_checks.c +++ b/src/move_checks.c @@ -596,7 +596,7 @@ bool8 CanUseOnTargetWithStatusChecker(Entity *user, Entity *target, Move *move) { return FALSE; } - if (!HasLastUsedMove(targetData->moves)) + if (!HasLastUsedMove(targetData->moves.moves)) { return FALSE; } @@ -614,7 +614,7 @@ bool8 CanUseOnTargetWithStatusChecker(Entity *user, Entity *target, Move *move) } break; case MOVE_TORMENT: - if (HasDisabledMove(targetData->moves) || !HasLastUsedMove(targetData->moves)) + if (HasDisabledMove(targetData->moves.moves) || !HasLastUsedMove(targetData->moves.moves)) { return FALSE; } @@ -640,7 +640,7 @@ bool8 CanUseOnTargetWithStatusChecker(Entity *user, Entity *target, Move *move) } break; case MOVE_SPITE: - if (LastUsedMoveOutOfPP(targetData->moves)) + if (LastUsedMoveOutOfPP(targetData->moves.moves)) { return FALSE; } @@ -850,7 +850,7 @@ bool8 CanUseOnTargetWithStatusChecker(Entity *user, Entity *target, Move *move) break; case MOVE_MIMIC: case MOVE_SKETCH: - if (!HasLastUsedMove(targetData->moves)) + if (!HasLastUsedMove(targetData->moves.moves)) { return FALSE; } diff --git a/src/move_util.c b/src/move_util.c index 663bf49d8..a42e27534 100644 --- a/src/move_util.c +++ b/src/move_util.c @@ -35,7 +35,7 @@ u32 sub_8057144(Entity * pokemon) { Entity *dungeonMon = gDungeon->allPokemon[i]; if (EntityExists(dungeonMon)) { - Move *moves = dungeonMon->info->moves; + Move *moves = dungeonMon->info->moves.moves; for (j = 0; j < MAX_MON_MOVES; j++) { if (moves[j].moveFlags & MOVE_FLAG_EXISTS @@ -141,7 +141,7 @@ bool8 sub_8057308(Entity *pokemon, s32 chance) bool8 CanAIUseMove(Entity *pokemon, s32 moveIndex, bool8 hasPPChecker) { EntityInfo *pokemonInfo = pokemon->info; - Move *move = &pokemonInfo->moves[moveIndex]; + Move *move = &pokemonInfo->moves.moves[moveIndex]; s32 i; if (!(move->moveFlags & MOVE_FLAG_EXISTS)) { @@ -174,7 +174,7 @@ bool8 CanAIUseMove(Entity *pokemon, s32 moveIndex, bool8 hasPPChecker) goto returnTrue; } move++; - if ((u32) move >= (u32) &pokemonInfo->struggleMoveFlags || !(move->moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + if ((u32) move >= (u32) &pokemonInfo->moves.struggleMoveFlags || !(move->moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { return FALSE; } @@ -206,7 +206,7 @@ bool8 CanMonsterUseMove(Entity *pokemon, Move *move, bool8 hasPPChecker) { if (move->id == MOVE_STRUGGLE) { - if (!(pokemonInfo->struggleMoveFlags & MOVE_FLAG_LAST_USED)) + if (!(pokemonInfo->moves.struggleMoveFlags & MOVE_FLAG_LAST_USED)) { return FALSE; } @@ -233,7 +233,7 @@ bool8 sub_805744C(Entity * pokemon, Move *move, bool8 param_3) if ((entityInfo->volatileStatus.volatileStatus == STATUS_TAUNTED) && (!MoveIgnoresTaunted(move))) return FALSE; if (entityInfo->volatileStatus.volatileStatus == STATUS_ENCORE) { if (move->id == MOVE_STRUGGLE) { - if((entityInfo->struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0) return FALSE; + if((entityInfo->moves.struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0) return FALSE; } else { if((move->moveFlags & MOVE_FLAG_LAST_USED) == 0) return FALSE; diff --git a/src/moves.c b/src/moves.c index df83ceafc..9efc729be 100644 --- a/src/moves.c +++ b/src/moves.c @@ -1595,14 +1595,14 @@ static void sub_8094148(struct unkStruct_8094924 *r0, Move *move) SaveIntegerBits(r0, &move->ginseng, 7); } -void sub_8094184(struct unkStruct_8094924 *r0, struct unkStruct_8094184 *r1) +void sub_8094184(struct unkStruct_8094924 *r0, struct Moves *r1) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) sub_8094148(r0, &r1->moves[i]); - SaveIntegerBits(r0, &r1->unk20, 8); + SaveIntegerBits(r0, &r1->struggleMoveFlags, 8); } static void sub_80941B0(struct unkStruct_8094924 *r0, Move *move) @@ -1615,15 +1615,15 @@ static void sub_80941B0(struct unkStruct_8094924 *r0, Move *move) RestoreIntegerBits(r0, &move->ginseng, 7); } -void sub_80941FC(struct unkStruct_8094924 *r0, struct unkStruct_8094184 *r1) +void sub_80941FC(struct unkStruct_8094924 *r0, struct Moves*r1) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) sub_80941B0(r0, &r1->moves[i]); - r1->unk20 = 0; - RestoreIntegerBits(r0, &r1->unk20, 8); + r1->struggleMoveFlags= 0; + RestoreIntegerBits(r0, &r1->struggleMoveFlags, 8); } bool8 DoesMoveCharge(u16 move) @@ -1639,4 +1639,4 @@ bool8 DoesMoveCharge(u16 move) if (move == MOVE_DIG) return TRUE; return FALSE; -} \ No newline at end of file +} diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c index b0255d806..9ed0c8b31 100644 --- a/src/pokemon_mid.c +++ b/src/pokemon_mid.c @@ -654,10 +654,9 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(PokemonStruct2 * a1, PokemonStruct1 * slot->quantity = 0; slot->flags = 0; } - sub_80943A0(&somestruct_80943A0, 100); - a1->belly = somestruct_80943A0; - sub_80943A0(&somestruct2_80943A0, 100); - a1->maxBelly = somestruct2_80943A0; + + a1->belly = IntToFixedPoint(100); + a1->maxBelly = IntToFixedPoint(100); } void xxx_pokemon2_to_pokemonstruct_index_808DF2C(s32 a1, PokemonStruct2* a2) diff --git a/src/status.c b/src/status.c index c5dc01239..4be7b775d 100644 --- a/src/status.c +++ b/src/status.c @@ -1211,10 +1211,10 @@ void EncoreStatusTarget(Entity *pokemon,Entity *target) if ((EntityExists(target)) && (!HasSafeguardStatus(pokemon,target,TRUE))) { for(index = 0; index < MAX_MON_MOVES; index++) { - movePtr = &EntityInfo->moves[index]; - if ((EntityInfo->moves[index].moveFlags & MOVE_FLAG_EXISTS) && (movePtr->moveFlags & MOVE_FLAG_LAST_USED)) break; + movePtr = &EntityInfo->moves.moves[index]; + if ((EntityInfo->moves.moves[index].moveFlags & MOVE_FLAG_EXISTS) && (movePtr->moveFlags & MOVE_FLAG_LAST_USED)) break; } - if ((index == MAX_MON_MOVES) && ((EntityInfo->struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0)) { + if ((index == MAX_MON_MOVES) && ((EntityInfo->moves.struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0)) { SetMessageArgument(gAvailablePokemonNames,target,0); sub_80522F4(pokemon,target,*gUnknown_80FBBD4); } diff --git a/src/status_actions.c b/src/status_actions.c index d4c05ec85..6c041b424 100644 --- a/src/status_actions.c +++ b/src/status_actions.c @@ -458,7 +458,7 @@ bool8 MimicMoveAction(Entity * pokemon, Entity * target, Move *move, s32 param_4 for(moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - movePtr = &targetEntityInfo->moves[moveIndex]; + movePtr = &targetEntityInfo->moves.moves[moveIndex]; if (((movePtr->moveFlags & MOVE_FLAG_EXISTS)) && !sub_805755C(pokemon,movePtr->id)) { if ((movePtr->id != MOVE_MIMIC) && (movePtr->id != MOVE_ASSIST) && (movePtr->id != MOVE_SKETCH) && (movePtr->id != MOVE_MIRROR_MOVE) && (movePtr->id != MOVE_ENCORE) && ((movePtr->moveFlags & MOVE_FLAG_LAST_USED))) { diff --git a/src/status_checks.c b/src/status_checks.c index 76f7128f8..c97bfc2d4 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -168,7 +168,7 @@ bool8 sub_80701A4(Entity *pokemon) SendMessage(pokemon,*gPtrMoveInterruptedMessage); } else { - for(index = 0, move = pokemonInfo->moves; index < MAX_MON_MOVES; move++, index++) { + for(index = 0, move = pokemonInfo->moves.moves; index < MAX_MON_MOVES; move++, index++) { if ((move->moveFlags & MOVE_FLAG_EXISTS) && (MoveMatchesChargingStatus(pokemon,move)) && (pokemonInfo->charging.chargingStatusMoveIndex == index)) { @@ -178,10 +178,10 @@ bool8 sub_80701A4(Entity *pokemon) if((index > 0) && (move->moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { do { - move2 = &pokemonInfo->moves[index_1 + 1]; + move2 = &pokemonInfo->moves.moves[index_1 + 1]; move2--, index_1--; if(index_1 <= 0) break; - if(!(pokemonInfo->moves[index_1].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + if(!(pokemonInfo->moves.moves[index_1].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { break; } diff --git a/src/status_checks_1.c b/src/status_checks_1.c index 2d081ab88..ee73ea556 100644 --- a/src/status_checks_1.c +++ b/src/status_checks_1.c @@ -150,7 +150,7 @@ bool8 HasNegativeStatus(Entity *pokemon) } for (i = 0; i < MAX_MON_MOVES; i++) { - Move *moves = pokemonInfo->moves; + Move *moves = pokemonInfo->moves.moves; if (moves[i].moveFlags & MOVE_FLAG_EXISTS && moves[i].moveFlags2 & MOVE_FLAG_SEALED) { return TRUE; diff --git a/src/trap.c b/src/trap.c index e05697734..e195af20d 100644 --- a/src/trap.c +++ b/src/trap.c @@ -655,7 +655,7 @@ void HandlePPZeroTrap(Entity *param_1,Entity *param_2) counter = 0; for(i = 0; i < MAX_MON_MOVES; move++, i++) { - move = &info->moves[i]; + move = &info->moves.moves[i]; if (((move->moveFlags & MOVE_FLAG_EXISTS) != 0) && (move->PP != 0)) { moveStack[counter] = move; indexStack[counter] = i; @@ -697,7 +697,7 @@ void HandleSealTrap(Entity *param_1,Entity *param_2) counter = 0; for(i = 0; i < MAX_MON_MOVES;i++) { - move = &info->moves[i]; + move = &info->moves.moves[i]; if ((move->moveFlags & MOVE_FLAG_EXISTS) && !(move->moveFlags2 & MOVE_FLAG_SEALED)) { moveStack[counter] = move; counter++; @@ -706,7 +706,7 @@ void HandleSealTrap(Entity *param_1,Entity *param_2) if (counter != 0) { moveIndex = DungeonRandInt(counter); moveStack[moveIndex]->moveFlags2 |= MOVE_FLAG_SEALED; - sub_80928C0(gUnknown_202DE58,moveStack[moveIndex], NULL); + sub_80928C0(gFormatItems,moveStack[moveIndex], NULL); flag = TRUE; } if(flag) diff --git a/src/trap_1.c b/src/trap_1.c index e930b16fe..fa8f2bd33 100644 --- a/src/trap_1.c +++ b/src/trap_1.c @@ -44,7 +44,7 @@ void sub_8083048(unkStruct_8094924 *param_1, u32); void sub_80818C8(unkStruct_8094924 *param_1, JoinedAt *param_2); void SaveActionContainer(unkStruct_8094924 *param_1, ActionContainer *param_2); void sub_8081B34(unkStruct_8094924 *r0, s16 *r1); -void SaveEntityMoves(unkStruct_8094924 *r0, Move *move); +void SaveEntityMoves(unkStruct_8094924 *r0, Moves *move); void sub_8081824(unkStruct_8094924 *param_1, u32 param_2); void sub_80817B0(unkStruct_8094924 *param_1, u32 param_2); void SavePosition(void*, Position *); @@ -442,7 +442,7 @@ void SaveEntity(unkStruct_8094924 *param_1, Entity *param_2) sub_8083060(param_1,info->stockpileStage); sub_8083060(param_1,info->unk113); sub_8083060(param_1,(u8)info->moveRandomly); - SaveEntityMoves(param_1,info->moves); + SaveEntityMoves(param_1,&info->moves); sub_8081B34(param_1,(s16 *)&info->belly); sub_8081B34(param_1,(s16 *)&info->maxBelly); sub_80830B4(param_1,info->aiNextToTarget); @@ -743,14 +743,14 @@ void SaveEntityMove(unkStruct_8094924 *r0, Move *r1) sub_8083060(r0, r1->ginseng); } -void SaveEntityMoves(unkStruct_8094924 *r0, Move *move) +void SaveEntityMoves(unkStruct_8094924 *r0, Moves *move) { s32 index; for(index = 0; index < MAX_MON_MOVES; index++) { - SaveEntityMove(r0, &move[index]); + SaveEntityMove(r0, &move->moves[index]); } - sub_8083060(r0, *(u8 *)(move + 0x4)); // Struggle Move flags? + sub_8083060(r0, move->struggleMoveFlags); // Struggle Move flags? } void sub_8081B34(unkStruct_8094924 *r0, s16 *r1) diff --git a/src/wonder_mail.c b/src/wonder_mail.c index 5dd4fa0dc..11a76ffdf 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -1385,7 +1385,7 @@ void sub_80293F4(void) sub_8095274(mail.unk10.unk10); mail.mailType = 2; sub_80951BC(&mail); - sub_80141B4(gWonderMailAOKMailReceivedText, 0, &sUnknown_203B2C0->faceFile, 0x101); + xxx_info_box_80141B4(gWonderMailAOKMailReceivedText, 0, &sUnknown_203B2C0->faceFile, 0x101); SetFriendRescueCounterState(RECEIVED_FRIEND_SOS_MAIL); break; case 23: diff --git a/src/wonder_mail_5.c b/src/wonder_mail_5.c index 2f7133a0e..081ae3a27 100644 --- a/src/wonder_mail_5.c +++ b/src/wonder_mail_5.c @@ -65,7 +65,7 @@ bool8 sub_8030D40(u8 mailIndex, s32 windowID) sub_801317C(&gUnknown_203B324->unk0); gUnknown_203B324->windowID = windowID; gUnknown_203B324->unk14 = &gUnknown_203B324->unk18[windowID]; - sub_8006518(gUnknown_203B324->unk18); + RestoreUnkTextStruct_8006518(gUnknown_203B324->unk18); gUnknown_203B324->unk18[gUnknown_203B324->windowID] = gUnknown_80E091C; sub_8030DD4(); return TRUE; From 3311aa476e1d6ee8126c3daaf9d42d628eb862bf Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 19 Sep 2024 19:03:55 -0700 Subject: [PATCH 08/18] slight updates --- include/code_8069D4C.h | 5 +++-- include/structs/struct_8069D4C.h | 27 --------------------------- src/code_806FDF4.c | 6 ++---- 3 files changed, 5 insertions(+), 33 deletions(-) delete mode 100644 include/structs/struct_8069D4C.h diff --git a/include/code_8069D4C.h b/include/code_8069D4C.h index 9687a386e..a2872dd70 100644 --- a/include/code_8069D4C.h +++ b/include/code_8069D4C.h @@ -6,8 +6,9 @@ struct unkStruct_8069D4C s16 id; Position pos; s16 HP; - /* 0x0 */ u8 att[2]; // Atk, SpAtk - /* 0x2 */ u8 def[2]; // Def, SpDef + // NOTE: cannot re-use offense struct as it pads. + u8 att[2]; // Atk, SpAtk + u8 def[2]; // Def, SpDef u16 level; u32 exp; FixedPoint belly; diff --git a/include/structs/struct_8069D4C.h b/include/structs/struct_8069D4C.h deleted file mode 100644 index bb0eadf49..000000000 --- a/include/structs/struct_8069D4C.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef GUARD_STRUCT_8069D4C_H -#define GUARD_STRUCT_8069D4C_H - -#include "structs/dungeon_entity.h" -#include "structs/str_items.h" -#include "structs/str_pokemon.h" -#include "structs/str_position.h" - -struct unkStruct_8069D4C -{ - s16 id; - Position pos; - s16 HP; - // NOTE: cannot re-use offense struct as it pads. - u8 att[2]; // Atk, SpAtk - u8 def[2]; // Def, SpDef - u16 level; - u32 exp; - u32 belly; - u32 maxBelly; - Item heldItem; - unkStruct_8094184 moves; - HiddenPower hiddenPower; -}; - -#endif // GUARD_STRUCT_8069D4C_H - diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index 22ea36afb..7e40eb7bf 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -32,7 +32,6 @@ extern u8 gUnknown_202E088[]; extern u8 *gUnknown_80FA120[]; extern u8 *gUnknown_80FA090[]; -void sub_8069D4C(struct unkStruct_8069D4C *r0, Entity *target); void sub_8068FE0(Entity *, u32, Entity *); u8 sub_806B8CC(); bool8 sub_805FBE8(u8 *a0); @@ -41,7 +40,6 @@ extern void PrintFieldMessage(u32, const u8 *, u32); void sub_8083D88(); u8 sub_808529C(s32); extern u8 GetBodySize(s16 index); -void sub_806F910(); void nullsub_96(Entity *pokemon,Entity *target) {} @@ -171,7 +169,7 @@ bool8 sub_806FA5C(Entity *entity1, Entity *entity2, struct unkStruct_8069D4C *pa pokeStruct2->isTeamLeader = FALSE; pokeStruct2->level = param_3->level; pokeStruct2->IQ = 1; - SetDefaultIQSkills((u8 *)&(pokeStruct2->IQSkills),0); + SetDefaultIQSkills((u8 *)&(pokeStruct2->IQSkills),FALSE); pokeStruct2->hiddenPower = param_3->hiddenPower; pokeStruct2->tacticIndex = 0; pokeStruct2->unkA = -1; @@ -211,7 +209,7 @@ bool8 sub_806FA5C(Entity *entity1, Entity *entity2, struct unkStruct_8069D4C *pa } sub_808D9DC(gAvailablePokemonNames,pokeStruct2,0); SendMessage(entity1,*gUnknown_80FA0F0); - if (flag != '\0') { + if (flag) { leader = xxx_call_GetLeader(); SetMessageArgument(gAvailablePokemonNames,leader,0); sub_8092558(gUnknown_202E628,friendArea); From 9d995576183e8b1db3aca35e6c53e2c2d2d22d26 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 20 Sep 2024 10:23:42 -0700 Subject: [PATCH 09/18] More decomp --- asm/code_806E8B0.s | 632 +--------------------------------- include/dungeon.h | 1 + include/structs/str_dungeon.h | 42 ++- src/code_8041AD0.c | 2 +- src/code_806FDF4.c | 609 ++++++++++++++++++++++++++++++++ src/type_effectiveness.c | 38 +- 6 files changed, 663 insertions(+), 661 deletions(-) diff --git a/asm/code_806E8B0.s b/asm/code_806E8B0.s index 329c5d7d7..0db99eb57 100644 --- a/asm/code_806E8B0.s +++ b/asm/code_806E8B0.s @@ -1157,634 +1157,4 @@ _0806F440: bx r0 thumb_func_end sub_806F370 - thumb_func_start SetShopkeeperAggression -SetShopkeeperAggression: - push {r4-r6,lr} - adds r5, r0, 0 - ldr r4, [r1, 0x70] - adds r6, r4, 0 - ldrb r0, [r4, 0x8] - cmp r0, 0 - beq _0806F47A - adds r0, r5, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0806F47A - ldr r0, [r5, 0x70] - ldrb r0, [r0, 0x6] - cmp r0, 0 - beq _0806F476 - movs r0, 0x2 - strb r0, [r4, 0x8] - b _0806F47A -_0806F476: - movs r0, 0x3 - strb r0, [r6, 0x8] -_0806F47A: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end SetShopkeeperAggression - - thumb_func_start sub_806F480 -sub_806F480: - push {lr} - lsls r1, 24 - lsrs r1, 24 - ldr r2, [r0, 0x70] - adds r3, r2, 0 - ldrb r0, [r2, 0x8] - cmp r0, 0 - beq _0806F49E - cmp r1, 0 - beq _0806F49A - movs r0, 0x2 - strb r0, [r2, 0x8] - b _0806F49E -_0806F49A: - movs r0, 0x3 - strb r0, [r3, 0x8] -_0806F49E: - pop {r0} - bx r0 - thumb_func_end sub_806F480 - - thumb_func_start sub_806F4A4 -sub_806F4A4: - push {r4-r6,lr} - lsls r1, 24 - lsrs r4, r1, 24 - ldr r5, [r0, 0x70] - movs r1, 0xE - bl MonsterIsType - lsls r0, 24 - cmp r0, 0 - beq _0806F4CE - cmp r4, 0x1 - beq _0806F4C0 - cmp r4, 0x7 - bne _0806F4CE -_0806F4C0: - adds r0, r5, 0 - adds r0, 0xF5 - ldrb r0, [r0] - cmp r0, 0 - bne _0806F4CE -_0806F4CA: - movs r0, 0 - b _0806F4F6 -_0806F4CE: - movs r2, 0 - lsls r0, r4, 3 - ldr r6, _0806F4FC - adds r3, r5, 0 - adds r3, 0x5C - adds r0, r4 - lsls r1, r0, 2 -_0806F4DC: - adds r0, r3, r2 - ldrb r0, [r0] - lsls r0, 1 - adds r0, r1 - adds r0, r6 - movs r4, 0 - ldrsh r0, [r0, r4] - cmp r0, 0 - beq _0806F4CA - adds r2, 0x1 - cmp r2, 0x1 - ble _0806F4DC - movs r0, 0x1 -_0806F4F6: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_0806F4FC: .4byte gTypeEffectivenessChart - thumb_func_end sub_806F4A4 - - thumb_func_start sub_806F500 -sub_806F500: - ldr r0, _0806F5F4 - ldr r0, [r0] - mov r12, r0 - movs r0, 0x9A - lsls r0, 1 - add r0, r12 - movs r1, 0 - strb r1, [r0] - str r1, [r0, 0x4] - strb r1, [r0, 0x8] - strb r1, [r0, 0x9] - movs r2, 0xA - strb r2, [r0, 0xA] - strb r2, [r0, 0xB] - movs r2, 0 - movs r3, 0x1 - strh r3, [r0, 0xC] - strh r3, [r0, 0xE] - strh r1, [r0, 0x10] - strh r1, [r0, 0x14] - strh r1, [r0, 0x12] - strh r1, [r0, 0x16] - strh r1, [r0, 0x18] - str r1, [r0, 0x1C] - str r1, [r0, 0x24] - str r1, [r0, 0x28] - movs r0, 0xB0 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F5F8 - add r0, r12 - strb r2, [r0] - movs r0, 0xB1 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F5FC - add r0, r12 - strb r2, [r0] - movs r0, 0xB2 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F600 - add r0, r12 - strb r2, [r0] - movs r0, 0xB3 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F604 - add r0, r12 - strb r2, [r0] - movs r0, 0xB4 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F608 - add r0, r12 - strb r2, [r0] - movs r0, 0xB5 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - movs r0, 0xB6 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F60C - add r0, r12 - strb r2, [r0] - ldr r0, _0806F610 - add r0, r12 - strb r2, [r0] - movs r0, 0xB7 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F614 - add r0, r12 - strb r2, [r0] - movs r0, 0xB8 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F618 - add r0, r12 - strb r2, [r0] - movs r0, 0xB9 - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F61C - add r0, r12 - strb r2, [r0] - movs r0, 0xBA - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F620 - add r0, r12 - strb r2, [r0] - movs r0, 0xBB - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F624 - add r0, r12 - strb r2, [r0] - movs r0, 0xBC - lsls r0, 1 - add r0, r12 - strb r2, [r0] - ldr r0, _0806F628 - add r0, r12 - strb r2, [r0] - movs r0, 0xBD - lsls r0, 1 - add r0, r12 - strb r2, [r0] - bx lr - .align 2, 0 -_0806F5F4: .4byte gDungeon -_0806F5F8: .4byte 0x00000161 -_0806F5FC: .4byte 0x00000163 -_0806F600: .4byte 0x00000165 -_0806F604: .4byte 0x00000167 -_0806F608: .4byte 0x00000169 -_0806F60C: .4byte 0x0000016b -_0806F610: .4byte 0x0000016d -_0806F614: .4byte 0x0000016f -_0806F618: .4byte 0x00000171 -_0806F61C: .4byte 0x00000173 -_0806F620: .4byte 0x00000175 -_0806F624: .4byte 0x00000177 -_0806F628: .4byte 0x00000179 - thumb_func_end sub_806F500 - - thumb_func_start sub_806F62C -sub_806F62C: - ldr r1, _0806F638 - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - bx lr - .align 2, 0 -_0806F638: .4byte gUnknown_8106F7C - thumb_func_end sub_806F62C - - thumb_func_start sub_806F63C -sub_806F63C: - push {lr} - ldr r1, _0806F658 - ldr r1, [r1] - ldr r2, _0806F65C - adds r1, r2 - ldr r1, [r1, 0x10] - cmp r1, r0 - bne _0806F652 - adds r0, r1, 0 - bl sub_803F508 -_0806F652: - pop {r0} - bx r0 - .align 2, 0 -_0806F658: .4byte gDungeon -_0806F65C: .4byte 0x000181e8 - thumb_func_end sub_806F63C - - thumb_func_start sub_806F660 -sub_806F660: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r6, r0, 0 - mov r8, r1 - ldr r0, [r6, 0x70] - mov r10, r0 - ldr r4, [r1, 0x70] - movs r1, 0x1 - negs r1, r1 - mov r9, r1 - movs r2, 0x4 - ldrsh r0, [r4, r2] - bl GetBodySize - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _0806F6C0 - ldr r3, [r0] - ldr r1, _0806F6C4 - adds r0, r3, r1 - ldrh r2, [r0] - subs r0, r2, 0x4 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bls _0806F702 - lsls r0, r2, 16 - asrs r1, r0, 16 - cmp r1, 0x9 - beq _0806F702 - cmp r1, 0xF - beq _0806F702 - adds r0, r2, 0 - subs r0, 0x2C - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x4 - bhi _0806F6CC - ldr r2, _0806F6C8 - adds r0, r3, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0806F702 - b _0806F8FC - .align 2, 0 -_0806F6C0: .4byte gDungeon -_0806F6C4: .4byte 0x00003a14 -_0806F6C8: .4byte 0x0000065c -_0806F6CC: - cmp r1, 0x31 - bne _0806F6F0 - ldr r1, _0806F6EC - adds r0, r3, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _0806F6DC - b _0806F8FC -_0806F6DC: - movs r0, 0xCF - lsls r0, 1 - bl sub_8097900 - lsls r0, 24 - cmp r0, 0 - bne _0806F702 - b _0806F8FC - .align 2, 0 -_0806F6EC: .4byte 0x00000659 -_0806F6F0: - ldr r2, _0806F834 - adds r0, r3, r2 - ldrb r0, [r0] - bl IsRecruitingEnabled - lsls r0, 24 - cmp r0, 0 - bne _0806F702 - b _0806F8FC -_0806F702: - ldr r0, _0806F838 - ldr r0, [r0] - ldr r3, _0806F83C - adds r0, r3 - ldrb r0, [r0] - cmp r0, 0 - beq _0806F712 - b _0806F8FC -_0806F712: - ldrh r1, [r4, 0x2] - adds r0, r1, 0 - subs r0, 0x90 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x2 - bls _0806F766 - lsls r0, r1, 16 - asrs r1, r0, 16 - ldr r0, _0806F840 - cmp r1, r0 - beq _0806F766 - subs r0, 0x1 - cmp r1, r0 - beq _0806F766 - adds r0, 0x2 - cmp r1, r0 - beq _0806F766 - adds r0, 0x8A - cmp r1, r0 - beq _0806F766 - adds r0, 0x1 - cmp r1, r0 - beq _0806F766 - adds r0, 0x4 - cmp r1, r0 - beq _0806F766 - subs r0, 0x1 - cmp r1, r0 - beq _0806F766 - adds r0, 0x2 - cmp r1, r0 - beq _0806F766 - subs r0, 0x9 - cmp r1, r0 - beq _0806F766 - adds r0, 0x1 - cmp r1, r0 - beq _0806F766 - adds r0, 0x1 - cmp r1, r0 - bne _0806F776 -_0806F766: - movs r1, 0x2 - ldrsh r0, [r4, r1] - bl HasRecruitedMon - lsls r0, 24 - cmp r0, 0 - beq _0806F776 - b _0806F8FC -_0806F776: - movs r2, 0x2 - ldrsh r0, [r4, r2] - bl sub_806F9BC - lsls r0, 24 - cmp r0, 0 - bne _0806F786 - b _0806F8FC -_0806F786: - movs r3, 0x4 - ldrsh r1, [r6, r3] - mov r2, r8 - movs r3, 0x4 - ldrsh r0, [r2, r3] - subs r1, r0 - cmp r1, 0 - bge _0806F798 - negs r1, r1 -_0806F798: - cmp r1, 0x1 - ble _0806F79E - b _0806F8FC -_0806F79E: - movs r0, 0x6 - ldrsh r1, [r6, r0] - mov r2, r8 - movs r3, 0x6 - ldrsh r0, [r2, r3] - subs r1, r0 - cmp r1, 0 - bge _0806F7B0 - negs r1, r1 -_0806F7B0: - cmp r1, 0x1 - ble _0806F7B6 - b _0806F8FC -_0806F7B6: - adds r0, r4, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - bne _0806F7C2 - b _0806F8FC -_0806F7C2: - adds r0, r4, 0 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0806F7CE - b _0806F8FC -_0806F7CE: - mov r0, r8 - adds r1, r6, 0 - bl CanSeeTarget - lsls r0, 24 - cmp r0, 0 - bne _0806F7DE - b _0806F8FC -_0806F7DE: - bl sub_806F910 - movs r0, 0xFA - lsls r0, 2 - bl DungeonRandInt - adds r7, r0, 0 - movs r1, 0x2 - ldrsh r0, [r4, r1] - bl GetRecruitRate - lsls r0, 16 - asrs r4, r0, 16 - ldr r0, _0806F844 - cmp r4, r0 - bne _0806F800 - b _0806F8FC -_0806F800: - adds r0, r6, 0 - movs r1, 0x2E - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806F816 - ldr r0, _0806F848 - movs r2, 0 - ldrsh r0, [r0, r2] - adds r4, r0 -_0806F816: - ldr r0, _0806F84C - mov r3, r10 - ldrb r1, [r3, 0x9] - lsls r1, 1 - adds r1, r0 - movs r2, 0 - ldrsh r0, [r1, r2] - adds r4, r0 - cmp r7, r4 - bge _0806F8FC - movs r4, 0 - movs r0, 0x6 - subs r3, r0, r5 - ldr r7, _0806F850 - b _0806F856 - .align 2, 0 -_0806F834: .4byte 0x00000644 -_0806F838: .4byte gDungeon -_0806F83C: .4byte 0x0000065d -_0806F840: .4byte 0x0000010d -_0806F844: .4byte 0xfffffc19 -_0806F848: .4byte gUnknown_80F5008 -_0806F84C: .4byte gUnknown_80F5700 -_0806F850: .4byte gUnknown_202EE70 -_0806F854: - adds r4, 0x1 -_0806F856: - cmp r4, r3 - bgt _0806F878 - movs r2, 0 - cmp r2, r5 - bge _0806F872 - adds r1, r4, r7 - b _0806F86C -_0806F864: - adds r1, 0x1 - adds r2, 0x1 - cmp r2, r5 - bge _0806F872 -_0806F86C: - ldrb r0, [r1] - cmp r0, 0 - beq _0806F864 -_0806F872: - cmp r2, r5 - bne _0806F854 - mov r9, r4 -_0806F878: - movs r0, 0x1 - negs r0, r0 - cmp r9, r0 - beq _0806F8F4 - movs r4, 0 - ldr r3, _0806F8BC - ldr r0, [r3] - ldr r2, _0806F8C0 - adds r0, r2 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0806F8B4 - adds r7, r3, 0 - adds r5, r2, 0 - movs r2, 0 - movs r3, 0x1 -_0806F89C: - adds r2, 0x64 - adds r4, 0x1 - cmp r4, 0x3 - bgt _0806F8B4 - ldr r0, [r7] - adds r0, r2, r0 - adds r0, r5 - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0806F89C -_0806F8B4: - cmp r4, 0x4 - beq _0806F8F4 - movs r4, 0 - b _0806F8C6 - .align 2, 0 -_0806F8BC: .4byte gRecruitedPokemonRef -_0806F8C0: .4byte 0x00008df8 -_0806F8C4: - adds r4, 0x1 -_0806F8C6: - cmp r4, 0x3 - bgt _0806F8E2 - ldr r0, _0806F8EC - ldr r0, [r0] - lsls r1, r4, 2 - ldr r3, _0806F8F0 - adds r0, r3 - adds r0, r1 - ldr r0, [r0] - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _0806F8C4 -_0806F8E2: - cmp r4, 0x4 - beq _0806F8F4 - movs r0, 0x1 - b _0806F8FE - .align 2, 0 -_0806F8EC: .4byte gDungeon -_0806F8F0: .4byte 0x0001357c -_0806F8F4: - adds r0, r6, 0 - mov r1, r8 - bl nullsub_96 -_0806F8FC: - movs r0, 0 -_0806F8FE: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_806F660 - - .align 2,0 + .align 2,0 diff --git a/include/dungeon.h b/include/dungeon.h index ccd3a3073..28726de73 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -49,5 +49,6 @@ void PrintDungeonLocationtoBuffer(u8 *buffer, DungeonLocation *dungeonLocation); u32 sub_80908D8(DungeonLocation *dungeon); u8 sub_8090910(DungeonLocation *dungeon, u32 param_2); bool8 IsNotValidDungeon(u8 dungeon); +u8 IsRecruitingEnabled(u8 dungeon); #endif // GUARD_DUNGEON_H diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index b260b7b95..cbacd5e9b 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -161,6 +161,36 @@ typedef struct UnkDungeonGlobal_unk1CD98 s16 unk2[2]; } UnkDungeonGlobal_unk1CD98; +struct unkStruct_Dungeon134_sub +{ + u8 unk134; + u32 unk138; + u8 unk13C[2]; + u8 unk13E[2]; + u16 unk140[7]; + u32 unk150; + u32 unk154; + u32 unk158; + u32 unk15C; + u8 unk160; + u8 unk161; + u8 unk162; + u8 unk163; + u8 unk164; + u8 unk165; + u8 unk166; + u8 unk167; + u8 unk168; + u8 unk169; + u8 unk16A; + u8 unk16B; + u8 unk16C; + u8 unk16D; + u8 fill16E[0x179 - 0x16E]; + bool8 pokemonExposed; + u8 unk17A; +}; + // size: 0x1CEDC typedef struct Dungeon { @@ -184,16 +214,8 @@ typedef struct Dungeon u8 fill14[0xB8 - 0x16]; Entity *unkB8; Entity *unkBC; - u8 fillC0[0x13C - 0xC0]; - u8 unk13C[2]; - u8 fill13E[0x16A - 0x13E]; - u8 unk16A; - u8 unk16B; - u8 unk16C; - u8 unk16D; - u8 fill16E[0x179 - 0x16E]; - /* 0x179 */ bool8 pokemonExposed; // True if a Pokémon on the floor has the Exposed status. - u8 fill17A[0x17C - 0x17A]; + u8 fillC0[0x134 - 0xC0]; + struct unkStruct_Dungeon134_sub unk134; Dungeon_sub unk17C[0x100]; /* 0x57C */ u8 fill57C[0x5C0 - 0x57c]; /* 0x5C0 */ s32 unk5C0; diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index af66eb6fd..7e57bc8f5 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -822,7 +822,7 @@ void sub_80420E8(Entity *pokemon, struct DamageStruct *dmgStruct) u32 typeEffectiveness; u32 arg; typeEffectiveness = dmgStruct->typeEffectiveness; - if(gDungeon->unk16D != 0) + if(gDungeon->unk134.unk16D != 0) typeEffectiveness = sub_806F62C(dmgStruct->typeEffectiveness); switch(typeEffectiveness) { diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index 7e40eb7bf..9eb6dafba 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -1,4 +1,5 @@ #include "global.h" +#include "constants/type.h" #include "structs/str_pokemon.h" #include "code_8069D4C.h" #include "code_80118A4.h" @@ -8,7 +9,12 @@ #include "code_806CD90.h" #include "code_8077274_1.h" #include "code_8097670.h" +#include "dungeon.h" +#include "dungeon_items.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_random.h" #include "dungeon_util.h" +#include "dungeon_visibility.h" #include "friend_area.h" #include "pokemon.h" #include "pokemon_3.h" @@ -16,11 +22,15 @@ #include "position_util.h" #include "text_util.h" #include "dungeon_util_1.h" +#include "type_chart.h" extern u8 gUnknown_202E628[]; extern u8 gUnknown_202E088[]; extern u8 gAvailablePokemonNames[]; extern u8 gUnknown_202EE70[MAX_TEAM_BODY_SIZE]; +extern s16 gUnknown_80F5008; +extern s16 gUnknown_80F5700[]; +extern s32 gUnknown_8106F7C[]; extern u8 *gUnknown_80FA0F0[]; extern u8 *gUnknown_80FA058[]; @@ -40,6 +50,605 @@ extern void PrintFieldMessage(u32, const u8 *, u32); void sub_8083D88(); u8 sub_808529C(s32); extern u8 GetBodySize(s16 index); +void nullsub_96(Entity *pokemon,Entity *target); +u8 sub_8097900(s16); +void sub_806F910(void); +u8 sub_806F9BC(s16); +extern void sub_803F508(Entity *); + +void SetShopkeeperAggression(Entity *pokemon, Entity *target) +{ + EntityInfo *info; + + info = GetEntInfo(target); + + if(info->shopkeeper != 0) + { + if(GetEntityType(pokemon) == ENTITY_MONSTER) + { + if(pokemon->info->isNotTeamMember) + { + info->shopkeeper = 2; + } + else + { + info->shopkeeper = 3; + } + } + } +} + +void sub_806F480(Entity *pokemon, u8 r1) +{ + EntityInfo *info; + + info = GetEntInfo(pokemon); + + if(info->shopkeeper != 0) + { + if(r1) + { + info->shopkeeper = 2; + } + else + { + info->shopkeeper = 3; + } + } +} + +u8 sub_806F4A4(Entity *pokemon, u8 type) { + + EntityInfo *info = pokemon->info; + s32 index; + + if(MonsterIsType(pokemon, TYPE_GHOST)) + { + if(type == TYPE_NORMAL || type == TYPE_FIGHTING) + if(!info->exposed) + return FALSE; + } + for(index = 0; index < 2; index++) + { + if(gTypeEffectivenessChart[type][info->types[index]] == EFFECTIVENESS_IMMUNE) + return FALSE; + } + return TRUE; +} + +void sub_806F500(void) +{ + struct unkStruct_Dungeon134_sub *temp; + + temp = &gDungeon->unk134; + + temp->unk134 = 0; + temp->unk138 = 0; + temp->unk13C[0] = 0; + temp->unk13C[1] = 0; + temp->unk13E[0] = 0xA; + temp->unk13E[1] = 0xA; + temp->unk140[0] = 1; + temp->unk140[1] = 1; + temp->unk140[2] = 0; + temp->unk140[4] = 0; + temp->unk140[3] = 0; + temp->unk140[5] = 0; + temp->unk140[6] = 0; + temp->unk150 = 0; + temp->unk158 = 0; + temp->unk15C = 0; + temp->unk160 = 0; + temp->unk161 = 0; + temp->unk162 = 0; + temp->unk163 = 0; + temp->unk164 = 0; + temp->unk165 = 0; + temp->unk166 = 0; + temp->unk167 = 0; + temp->unk168 = 0; + temp->unk169 = 0; + temp->unk16A = 0; + temp->unk16C = 0; + temp->unk16B = 0; + temp->unk16D = 0; + temp->fill16E[0] = 0; + temp->fill16E[1] = 0; + temp->fill16E[2] = 0; + temp->fill16E[3] = 0; + temp->fill16E[4] = 0; + temp->fill16E[5] = 0; + temp->fill16E[6] = 0; + temp->fill16E[7] = 0; + temp->fill16E[8] = 0; + temp->fill16E[9] = 0; + temp->fill16E[10] = 0; + temp->pokemonExposed = FALSE; + temp->unk17A = 0; +} + +s32 sub_806F62C(int param_1) +{ + return gUnknown_8106F7C[param_1]; +} + +void sub_806F63C(Entity *param_1) +{ + unkDungeonGlobal_unk181E8_sub *temp; + + temp = &gDungeon->unk181e8; + + if (temp->cameraTarget == param_1) { + sub_803F508(temp->cameraTarget); + } +} + +// https://decomp.me/scratch/2la6b - (96.72% matching - Seth) +#ifdef NONMATCHING +bool8 sub_806F660(Entity *pokemon,Entity *target) +{ + EntityInfo *pokemonInfo; + EntityInfo *targetInfo; + s32 size; + int iVar4; + s32 iVar5; + s32 uVar6; + + int recruitRate; + s32 iVar8; + s32 index; + pokemonInfo = pokemon->info; + targetInfo = target->info; + iVar8 = -1; + size = GetBodySize(targetInfo->apparentID); + if ((1 < ((u16)(gDungeon->bossBattleIndex - 4))) && (gDungeon->bossBattleIndex != 9) && (gDungeon->bossBattleIndex != 0xf)) { + if ((u16)(gDungeon->bossBattleIndex - 0x2cU) < 5) { + if (gDungeon->unk65C == 0) { + return FALSE; + } + } + else if (gDungeon->bossBattleIndex == 0x31) { + if (gDungeon->fill655[4] == 0) { + return FALSE; + } + if (sub_8097900(0x19e) == 0) { + return FALSE; + } + + } + else { + if (IsRecruitingEnabled((gDungeon->dungeonLocation).id) == 0) { + return FALSE; + } + } + } + if (gDungeon->unk65D == 0) + { + if ((( + (2 < (u16)(targetInfo->id - 0x90)) && + (targetInfo->id != 0x10d) && + (targetInfo->id != 0x10c) && + (targetInfo->id != 0x10e) && + (targetInfo->id != 0x198) && + (targetInfo->id != 0x199) && + (targetInfo->id != 0x19d) && + (targetInfo->id != 0x19c) && + (targetInfo->id != 0x19e) && + (targetInfo->id != 0x195) && + (targetInfo->id != 0x196) && + (targetInfo->id != 0x197)) || (HasRecruitedMon(targetInfo->id) == 0)) && + (sub_806F9BC(targetInfo->id) != 0)) { + iVar5 = (pokemon->pos).x - (target->pos).x; + if (iVar5 < 0) { + iVar5 = -iVar5; + } + if (iVar5 < 2) { + iVar5 = (pokemon->pos).y - (target->pos).y; + if (iVar5 < 0) { + iVar5 = -iVar5; + } + if (((iVar5 < 2) && (targetInfo->joinedAt.joinedAt != 0x4A)) && + (targetInfo->clientType != 1 && (CanSeeTarget(target,pokemon)) + )) { + sub_806F910(); + iVar4 = DungeonRandInt(1000); + recruitRate = GetRecruitRate(targetInfo->id); + if (recruitRate != -999) { + if (HasHeldItem(pokemon,0x2e)) { // FRIEND_BOW + recruitRate += gUnknown_80F5008; + } + recruitRate += gUnknown_80F5700[pokemonInfo->level]; + if (iVar4 < recruitRate) { + for (index = 0; index <= (6 - size); index++) + { + for(uVar6 = 0; uVar6 < size; uVar6++) + { + if (gUnknown_202EE70[index + uVar6] != 0) break; + } + iVar8 = index; + if (uVar6 == size) + break; + } + if (iVar8 != -1) { + for(index = 0; index < 4; index++) + { + if (((u8)(index[gRecruitedPokemonRef->pokemon2].unk0) & 1) == 0) break; + } + if (index != 4) { + + for(index = 0; index < 4; index++) + { + if (EntityExists(gDungeon->teamPokemon[index]) == 0) break; + } + if (index != 4) { + return TRUE; + } + } + } + nullsub_96(pokemon,target); + } + } + } + } + } + } + return FALSE; +} +#else +NAKED +bool8 sub_806F660(Entity *pokemon,Entity *target) +{ + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tadds r6, r0, 0\n" + "\tmov r8, r1\n" + "\tldr r0, [r6, 0x70]\n" + "\tmov r10, r0\n" + "\tldr r4, [r1, 0x70]\n" + "\tmovs r1, 0x1\n" + "\tnegs r1, r1\n" + "\tmov r9, r1\n" + "\tmovs r2, 0x4\n" + "\tldrsh r0, [r4, r2]\n" + "\tbl GetBodySize\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r0, _0806F6C0\n" + "\tldr r3, [r0]\n" + "\tldr r1, _0806F6C4\n" + "\tadds r0, r3, r1\n" + "\tldrh r2, [r0]\n" + "\tsubs r0, r2, 0x4\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbls _0806F702\n" + "\tlsls r0, r2, 16\n" + "\tasrs r1, r0, 16\n" + "\tcmp r1, 0x9\n" + "\tbeq _0806F702\n" + "\tcmp r1, 0xF\n" + "\tbeq _0806F702\n" + "\tadds r0, r2, 0\n" + "\tsubs r0, 0x2C\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x4\n" + "\tbhi _0806F6CC\n" + "\tldr r2, _0806F6C8\n" + "\tadds r0, r3, r2\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0806F702\n" + "\tb _0806F8FC\n" + "\t.align 2, 0\n" +"_0806F6C0: .4byte gDungeon\n" +"_0806F6C4: .4byte 0x00003a14\n" +"_0806F6C8: .4byte 0x0000065c\n" +"_0806F6CC:\n" + "\tcmp r1, 0x31\n" + "\tbne _0806F6F0\n" + "\tldr r1, _0806F6EC\n" + "\tadds r0, r3, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0806F6DC\n" + "\tb _0806F8FC\n" +"_0806F6DC:\n" + "\tmovs r0, 0xCF\n" + "\tlsls r0, 1\n" + "\tbl sub_8097900\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0806F702\n" + "\tb _0806F8FC\n" + "\t.align 2, 0\n" +"_0806F6EC: .4byte 0x00000659\n" +"_0806F6F0:\n" + "\tldr r2, _0806F834\n" + "\tadds r0, r3, r2\n" + "\tldrb r0, [r0]\n" + "\tbl IsRecruitingEnabled\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0806F702\n" + "\tb _0806F8FC\n" +"_0806F702:\n" + "\tldr r0, _0806F838\n" + "\tldr r0, [r0]\n" + "\tldr r3, _0806F83C\n" + "\tadds r0, r3\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0806F712\n" + "\tb _0806F8FC\n" +"_0806F712:\n" + "\tldrh r1, [r4, 0x2]\n" + "\tadds r0, r1, 0\n" + "\tsubs r0, 0x90\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x2\n" + "\tbls _0806F766\n" + "\tlsls r0, r1, 16\n" + "\tasrs r1, r0, 16\n" + "\tldr r0, _0806F840\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tsubs r0, 0x1\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x2\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x8A\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x1\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x4\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tsubs r0, 0x1\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x2\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tsubs r0, 0x9\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x1\n" + "\tcmp r1, r0\n" + "\tbeq _0806F766\n" + "\tadds r0, 0x1\n" + "\tcmp r1, r0\n" + "\tbne _0806F776\n" +"_0806F766:\n" + "\tmovs r1, 0x2\n" + "\tldrsh r0, [r4, r1]\n" + "\tbl HasRecruitedMon\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0806F776\n" + "\tb _0806F8FC\n" +"_0806F776:\n" + "\tmovs r2, 0x2\n" + "\tldrsh r0, [r4, r2]\n" + "\tbl sub_806F9BC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0806F786\n" + "\tb _0806F8FC\n" +"_0806F786:\n" + "\tmovs r3, 0x4\n" + "\tldrsh r1, [r6, r3]\n" + "\tmov r2, r8\n" + "\tmovs r3, 0x4\n" + "\tldrsh r0, [r2, r3]\n" + "\tsubs r1, r0\n" + "\tcmp r1, 0\n" + "\tbge _0806F798\n" + "\tnegs r1, r1\n" +"_0806F798:\n" + "\tcmp r1, 0x1\n" + "\tble _0806F79E\n" + "\tb _0806F8FC\n" +"_0806F79E:\n" + "\tmovs r0, 0x6\n" + "\tldrsh r1, [r6, r0]\n" + "\tmov r2, r8\n" + "\tmovs r3, 0x6\n" + "\tldrsh r0, [r2, r3]\n" + "\tsubs r1, r0\n" + "\tcmp r1, 0\n" + "\tbge _0806F7B0\n" + "\tnegs r1, r1\n" +"_0806F7B0:\n" + "\tcmp r1, 0x1\n" + "\tble _0806F7B6\n" + "\tb _0806F8FC\n" +"_0806F7B6:\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0x40\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x4A\n" + "\tbne _0806F7C2\n" + "\tb _0806F8FC\n" +"_0806F7C2:\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0xA4\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbne _0806F7CE\n" + "\tb _0806F8FC\n" +"_0806F7CE:\n" + "\tmov r0, r8\n" + "\tadds r1, r6, 0\n" + "\tbl CanSeeTarget\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0806F7DE\n" + "\tb _0806F8FC\n" +"_0806F7DE:\n" + "\tbl sub_806F910\n" + "\tmovs r0, 0xFA\n" + "\tlsls r0, 2\n" + "\tbl DungeonRandInt\n" + "\tadds r7, r0, 0\n" + "\tmovs r1, 0x2\n" + "\tldrsh r0, [r4, r1]\n" + "\tbl GetRecruitRate\n" + "\tlsls r0, 16\n" + "\tasrs r4, r0, 16\n" + "\tldr r0, _0806F844\n" + "\tcmp r4, r0\n" + "\tbne _0806F800\n" + "\tb _0806F8FC\n" +"_0806F800:\n" + "\tadds r0, r6, 0\n" + "\tmovs r1, 0x2E\n" + "\tbl HasHeldItem\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0806F816\n" + "\tldr r0, _0806F848\n" + "\tmovs r2, 0\n" + "\tldrsh r0, [r0, r2]\n" + "\tadds r4, r0\n" +"_0806F816:\n" + "\tldr r0, _0806F84C\n" + "\tmov r3, r10\n" + "\tldrb r1, [r3, 0x9]\n" + "\tlsls r1, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0\n" + "\tldrsh r0, [r1, r2]\n" + "\tadds r4, r0\n" + "\tcmp r7, r4\n" + "\tbge _0806F8FC\n" + "\tmovs r4, 0\n" + "\tmovs r0, 0x6\n" + "\tsubs r3, r0, r5\n" + "\tldr r7, _0806F850\n" + "\tb _0806F856\n" + "\t.align 2, 0\n" +"_0806F834: .4byte 0x00000644\n" +"_0806F838: .4byte gDungeon\n" +"_0806F83C: .4byte 0x0000065d\n" +"_0806F840: .4byte 0x0000010d\n" +"_0806F844: .4byte 0xfffffc19\n" +"_0806F848: .4byte gUnknown_80F5008\n" +"_0806F84C: .4byte gUnknown_80F5700\n" +"_0806F850: .4byte gUnknown_202EE70\n" +"_0806F854:\n" + "\tadds r4, 0x1\n" +"_0806F856:\n" + "\tcmp r4, r3\n" + "\tbgt _0806F878\n" + "\tmovs r2, 0\n" + "\tcmp r2, r5\n" + "\tbge _0806F872\n" + "\tadds r1, r4, r7\n" + "\tb _0806F86C\n" +"_0806F864:\n" + "\tadds r1, 0x1\n" + "\tadds r2, 0x1\n" + "\tcmp r2, r5\n" + "\tbge _0806F872\n" +"_0806F86C:\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0\n" + "\tbeq _0806F864\n" +"_0806F872:\n" + "\tcmp r2, r5\n" + "\tbne _0806F854\n" + "\tmov r9, r4\n" +"_0806F878:\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tcmp r9, r0\n" + "\tbeq _0806F8F4\n" + "\tmovs r4, 0\n" + "\tldr r3, _0806F8BC\n" + "\tldr r0, [r3]\n" + "\tldr r2, _0806F8C0\n" + "\tadds r0, r2\n" + "\tldrb r1, [r0]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0806F8B4\n" + "\tadds r7, r3, 0\n" + "\tadds r5, r2, 0\n" + "\tmovs r2, 0\n" + "\tmovs r3, 0x1\n" +"_0806F89C:\n" + "\tadds r2, 0x64\n" + "\tadds r4, 0x1\n" + "\tcmp r4, 0x3\n" + "\tbgt _0806F8B4\n" + "\tldr r0, [r7]\n" + "\tadds r0, r2, r0\n" + "\tadds r0, r5\n" + "\tldrb r1, [r0]\n" + "\tadds r0, r3, 0\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbne _0806F89C\n" +"_0806F8B4:\n" + "\tcmp r4, 0x4\n" + "\tbeq _0806F8F4\n" + "\tmovs r4, 0\n" + "\tb _0806F8C6\n" + "\t.align 2, 0\n" +"_0806F8BC: .4byte gRecruitedPokemonRef\n" +"_0806F8C0: .4byte 0x00008df8\n" +"_0806F8C4:\n" + "\tadds r4, 0x1\n" +"_0806F8C6:\n" + "\tcmp r4, 0x3\n" + "\tbgt _0806F8E2\n" + "\tldr r0, _0806F8EC\n" + "\tldr r0, [r0]\n" + "\tlsls r1, r4, 2\n" + "\tldr r3, _0806F8F0\n" + "\tadds r0, r3\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tbl EntityExists\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0806F8C4\n" +"_0806F8E2:\n" + "\tcmp r4, 0x4\n" + "\tbeq _0806F8F4\n" + "\tmovs r0, 0x1\n" + "\tb _0806F8FE\n" + "\t.align 2, 0\n" +"_0806F8EC: .4byte gDungeon\n" +"_0806F8F0: .4byte 0x0001357c\n" +"_0806F8F4:\n" + "\tadds r0, r6, 0\n" + "\tmov r1, r8\n" + "\tbl nullsub_96\n" +"_0806F8FC:\n" + "\tmovs r0, 0\n" +"_0806F8FE:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif void nullsub_96(Entity *pokemon,Entity *target) {} diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index 3375bfc16..c22ee5118 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -114,7 +114,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct if (sub_800A2A0(param_1)) break; if (((normalOrFightingType) && (targetInfo->types[index] == TYPE_GHOST)) && (targetInfo->exposed == FALSE)) { effectiveness = EFFECTIVENESS_IMMUNE; - gDungeon->pokemonExposed = TRUE; + gDungeon->unk134.pokemonExposed = TRUE; } else { effectiveness = gTypeEffectivenessChart[type][targetInfo->types[index]]; @@ -123,7 +123,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct sub_800A34C(param_1,param_1,local_48.unk0[effectiveness]); } local_38[index] = effectiveness; - gDungeon->unk13C[index] = effectiveness; + gDungeon->unk134.unk13C[index] = effectiveness; } param_5->effectiveness = gUnknown_80F54B4[local_38[0]][local_38[1]]; @@ -135,11 +135,11 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct } if (((type == TYPE_FIRE) || (type == TYPE_ICE)) && (HasAbility(target,ABILITY_THICK_FAT))) { - gDungeon->unk16D = TRUE; + gDungeon->unk134.unk16D = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F1C); } if ((type == TYPE_FIRE) && (GetFlashFireStatus(target) != FLASH_FIRE_STATUS_NONE)) { - gDungeon->fill16E[0] = TRUE; + gDungeon->unk134.fill16E[0] = TRUE; sub_800A020(param_1,0); param_5->effectiveness = EFFECTIVENESS_IMMUNE; param_5->unkD = 0; @@ -147,7 +147,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct bVar4 = FALSE; } if ((type == TYPE_GROUND) && (HasAbility(target, ABILITY_LEVITATE))) { - gDungeon->fill16E[1] = TRUE; + gDungeon->unk134.fill16E[1] = TRUE; sub_800A020(param_1,0); param_5->effectiveness = EFFECTIVENESS_IMMUNE; param_5->unkD = 0; @@ -158,7 +158,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct torrentFlag = pokemonInfo->maxHPStat / 4 >= pokemonInfo->HP; torrentVisualFlag = SetVisualFlags(pokemonInfo,0x80,torrentFlag); if (torrentFlag) { - gDungeon->fill16E[2] = TRUE; + gDungeon->unk134.fill16E[2] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F0C); } if (torrentVisualFlag) { @@ -170,7 +170,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct overgrowFlag = pokemonInfo->maxHPStat / 4 >= pokemonInfo->HP; overgrowVisualFlag = SetVisualFlags(pokemonInfo,2,overgrowFlag); if (overgrowFlag) { - gDungeon->fill16E[3] = TRUE; + gDungeon->unk134.fill16E[3] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F0C); } if (overgrowVisualFlag) { @@ -182,7 +182,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct swarmFlag = pokemonInfo->maxHPStat / 4 >= pokemonInfo->HP; swarmVisualFlag = SetVisualFlags(pokemonInfo,0x10,swarmFlag); if (swarmFlag) { - gDungeon->fill16E[4] = TRUE; + gDungeon->unk134.fill16E[4] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F0C); } if (swarmVisualFlag) { @@ -194,7 +194,7 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct blazeFlag = pokemonInfo->maxHPStat / 4 >= pokemonInfo->HP; blazeVisualFlag = SetVisualFlags(pokemonInfo,0x20,blazeFlag); if (blazeFlag) { - gDungeon->fill16E[5] = TRUE; + gDungeon->unk134.fill16E[5] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F0C); } if (blazeVisualFlag) { @@ -203,44 +203,44 @@ bool8 sub_806E100(s32 *param_1, Entity *pokemon, Entity *target, u8 type, struct } } if (!(sub_800A2A0(param_1)) && (MonsterIsType(pokemon, type))) { - gDungeon->fill16E[6] = TRUE; + gDungeon->unk134.fill16E[6] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F14); } weather = GetApparentWeather(pokemon); if (weather == WEATHER_SUNNY) { if (type == TYPE_FIRE) { - gDungeon->unk16C = TRUE; + gDungeon->unk134.unk16C = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F14); } else if (type == TYPE_WATER) { - gDungeon->unk16C = TRUE; + gDungeon->unk134.unk16C = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F1C); } } if (weather == WEATHER_RAIN) { if (type == TYPE_FIRE) { - gDungeon->unk16B = TRUE; + gDungeon->unk134.unk16B = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F1C); } else if (type == TYPE_WATER) { - gDungeon->unk16B = TRUE; + gDungeon->unk134.unk16B = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F14); } } if ((weather == WEATHER_CLOUDY) && (type != TYPE_NORMAL)) { sub_800A34C(param_1,param_1, gUnknown_8106F64); - gDungeon->unk16A = TRUE; + gDungeon->unk134.unk16A = TRUE; } if (((gDungeon->weather.mudSportTurns != 0) || (weather == WEATHER_FOG)) && (type == TYPE_ELECTRIC)) { - gDungeon->fill16E[7] = TRUE; + gDungeon->unk134.fill16E[7] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F1C); } if ((gDungeon->weather.waterSportTurns != 0) && (type == TYPE_FIRE)) { - gDungeon->fill16E[8] = TRUE; + gDungeon->unk134.fill16E[8] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F1C); } if ((type == TYPE_ELECTRIC) && (pokemonInfo->charging.chargingStatus == STATUS_CHARGING)) { - gDungeon->fill16E[9] = TRUE; + gDungeon->unk134.fill16E[9] = TRUE; sub_800A34C(param_1,param_1,gUnknown_8106F0C); } } @@ -293,7 +293,7 @@ s32 WeightWeakTypePicker(Entity *user, Entity *target, u8 moveType) if (checkExposed && *targetType == TYPE_GHOST && !targetData->exposed) { effectiveness = 0; - gDungeon->pokemonExposed = TRUE; + gDungeon->unk134.pokemonExposed = TRUE; } else { From 7b4798283a2d8111a9467e0b5273f90ed4bbfa04 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 25 Sep 2024 20:07:45 -0700 Subject: [PATCH 10/18] fix: make rebase compile ok --- src/code_806FDF4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index 9eb6dafba..e0c466bd6 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -174,7 +174,7 @@ s32 sub_806F62C(int param_1) void sub_806F63C(Entity *param_1) { - unkDungeonGlobal_unk181E8_sub *temp; + UnkDungeonGlobal_unk181E8_sub *temp; temp = &gDungeon->unk181e8; From 52d4d97a8279a7857ef395f8aa9233a3ae32fcfc Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 28 Sep 2024 07:25:27 -0700 Subject: [PATCH 11/18] document more kecleon --- include/kecleon_bros1.h | 18 +++- src/kecleon_bros1.c | 200 ++++++++++++++++++++-------------------- 2 files changed, 115 insertions(+), 103 deletions(-) diff --git a/include/kecleon_bros1.h b/include/kecleon_bros1.h index 85d25b280..be7830a92 100644 --- a/include/kecleon_bros1.h +++ b/include/kecleon_bros1.h @@ -10,17 +10,29 @@ enum KecleonStoreStates { KECLEON_STORE_INIT = 0, KECLEON_STORE_MAIN_MENU, - // 2 - 3 + KECLEON_STORE_INFO, + // 3 KECLEON_STORE_EXIT = 4, KECLEON_STORE_NO_STORE_ITEMS, KECLEON_STORE_NO_MONEY, KECLEON_STORE_TOO_MUCH_MONEY, - // 8 - KECLEON_STORE_NO_ITEMS_TO_SELL = 9, + KECLEON_STORE_NO_ITEMS_TO_SELL, + KECLEON_STORE_NO_ITEMS, KECLEON_STORE_TOO_MANY_ITEMS, // 11 KECLEON_STORE_NOT_ENOUGH_MONEY = 12, KECLEON_STORE_CANT_SELL_ITEM, + KECLEON_STORE_SELL_ITEM_TOO_MUCH_MONEY, + KECLEON_STORE_BUY_ITEM_MENU = 16, + KECLEON_STORE_BUY_ITEM_RECEIPT, + KECLEON_STORE_BUY_ITEM_INFO = 21, + KECLEON_STORE_BUY_ITEM, + KECLEON_STORE_SELL_ITEM_MENU = 24, + KECLEON_STORE_SELL_ITEM_RECEIPT = 25, + KECLEON_STORE_SELL_ITEM_INFO = 29, + KECLEON_STORE_SELL_ITEM, + KECLEON_STORE_SELL_ALL_ITEMS, + KECLEON_STORE_SELL_ALL_ITEMS_RECEIPT, }; // size: 0x148 diff --git a/src/kecleon_bros1.c b/src/kecleon_bros1.c index 92c12dcf6..18d27f805 100644 --- a/src/kecleon_bros1.c +++ b/src/kecleon_bros1.c @@ -32,22 +32,22 @@ static void SetKecleonBrosState(u32); static void UpdateKecleonStoreDialogue(void); static void sub_8018D30(void); -static void sub_80194F8(void); -static void sub_80195C0(void); -static void sub_8019660(void); -static void sub_8019700(void); -static void sub_8019730(void); -static void sub_8019850(void); -static void sub_80198E8(void); -static void sub_8019944(void); +static void BuildKecleonBrosMainMenu(void); +static void BuildKecleonBrosBuyItemMenu(void); +static void BuildKecleonBrosSellItemMenu(void); +static void BuildKecleonBrosYesNoMenu(void); +static void HandleKecleonBrosMainMenu(void); +static void HandleKecleonBrosBuyItemYesNoMenu(void); +static void HandleKecleonBrosSellItemYesNoMenu(void); +static void HandleKecleonBrosSellAllItemsMenu(void); static void sub_80199CC(void); static void sub_8019B08(void); -static void sub_8019BBC(void); -static void sub_8019C78(void); +static void HandleKecleonBrosBuyItemMenu(void); +static void HandleKecleonBrosSellItemMenu(void); static void sub_8019D30(void); static void sub_8019D4C(void); -static void sub_8019D68(void); -static void sub_8019DAC(void); +static void ProceedToKecleonBros1FallbackState(void); +static void KecleonCalcSellPriceForAllItems(void); static void sub_8019E04(bool32); enum MenuActions { @@ -125,41 +125,41 @@ u32 KecleonBrosCallback(void) switch (sKecleonBrosWork1->currState) { case KECLEON_STORE_INIT: case KECLEON_STORE_MAIN_MENU: - sub_8019730(); + HandleKecleonBrosMainMenu(); break; - case 0x12: - case 0x13: + case 18: + case 19: sub_80199CC(); break; - case 0x1a: - case 0x1b: + case 26: + case 27: sub_8019B08(); break; - case 0x14: - sub_8019BBC(); + case 20: + HandleKecleonBrosBuyItemMenu(); break; - case 0x1c: - sub_8019C78(); + case 28: + HandleKecleonBrosSellItemMenu(); break; - case 0x16: - sub_8019850(); + case KECLEON_STORE_BUY_ITEM: + HandleKecleonBrosBuyItemYesNoMenu(); break; - case 0x1e: - sub_80198E8(); + case KECLEON_STORE_SELL_ITEM: + HandleKecleonBrosSellItemYesNoMenu(); break; - case 0x1f: - sub_8019944(); + case KECLEON_STORE_SELL_ALL_ITEMS: + HandleKecleonBrosSellAllItemsMenu(); break; - case 0x15: + case KECLEON_STORE_BUY_ITEM_INFO: sub_8019D30(); break; - case 0x1d: + case KECLEON_STORE_SELL_ITEM_INFO: sub_8019D4C(); break; case KECLEON_STORE_EXIT: return 3; default: - sub_8019D68(); + ProceedToKecleonBros1FallbackState(); break; } return 0; @@ -207,11 +207,11 @@ static void sub_8018D30(void) sKecleonBrosWork1->unkE8[2] = sUnknown_80DB858; break; default: - case 21: - case 22: + case KECLEON_STORE_BUY_ITEM_INFO: + case KECLEON_STORE_BUY_ITEM: case 23: - case 24: - case 25: + case KECLEON_STORE_SELL_ITEM_MENU: + case KECLEON_STORE_SELL_ITEM_RECEIPT: for (i = 0; i < 4; i++) sKecleonBrosWork1->unkE8[i] = sUnknown_80DB840; break; @@ -225,26 +225,26 @@ static void UpdateKecleonStoreDialogue(void) { switch (sKecleonBrosWork1->currState) { case KECLEON_STORE_INIT: - sub_8019DAC(); - sub_80194F8(); + KecleonCalcSellPriceForAllItems(); + BuildKecleonBrosMainMenu(); sub_8019E04(FALSE); sub_8014248(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_00], 0, sKecleonBrosWork1->menuAction1, sKecleonBrosWork1->menuItems, sKecleonBrosWork1->unk74, 4, 0, sKecleonBrosWork1->unkE4, 12); break; case KECLEON_STORE_MAIN_MENU: - sub_8019DAC(); - sub_80194F8(); + KecleonCalcSellPriceForAllItems(); + BuildKecleonBrosMainMenu(); sub_8019E04(FALSE); sub_8014248(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_01], 0, sKecleonBrosWork1->menuAction1, sKecleonBrosWork1->menuItems, sKecleonBrosWork1->unk74, 4, 0, sKecleonBrosWork1->unkE4, 12); break; - case 2: + case KECLEON_STORE_INFO: sKecleonBrosWork1->fallbackState = KECLEON_STORE_MAIN_MENU; sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_22], 0, sKecleonBrosWork1->unkE4, 0x10D); break; case 3: - sKecleonBrosWork1->fallbackState = 4; + sKecleonBrosWork1->fallbackState = KECLEON_STORE_EXIT; sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_02], 0, sKecleonBrosWork1->unkE4, 0x30D); break; @@ -254,7 +254,7 @@ static void UpdateKecleonStoreDialogue(void) xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_12], 0, sKecleonBrosWork1->unkE4, 0x10D); break; case KECLEON_STORE_NO_MONEY: - sKecleonBrosWork1->fallbackState = 16; + sKecleonBrosWork1->fallbackState = KECLEON_STORE_BUY_ITEM_MENU; sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_13], 0, sKecleonBrosWork1->unkE4, 0x10D); break; @@ -263,12 +263,12 @@ static void UpdateKecleonStoreDialogue(void) sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_14], 0, sKecleonBrosWork1->unkE4, 0x10D); break; - case 8: + case KECLEON_STORE_NO_ITEMS_TO_SELL: sKecleonBrosWork1->fallbackState = KECLEON_STORE_MAIN_MENU; sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_15], 0, sKecleonBrosWork1->unkE4, 0x10D); break; - case KECLEON_STORE_NO_ITEMS_TO_SELL: + case KECLEON_STORE_NO_ITEMS: sKecleonBrosWork1->fallbackState = KECLEON_STORE_MAIN_MENU; sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_16], 0, sKecleonBrosWork1->unkE4, 0x10D); @@ -284,18 +284,18 @@ static void UpdateKecleonStoreDialogue(void) xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_18], 0, sKecleonBrosWork1->unkE4, 0x10D); break; case KECLEON_STORE_NOT_ENOUGH_MONEY: - sKecleonBrosWork1->fallbackState = 16; + sKecleonBrosWork1->fallbackState = KECLEON_STORE_BUY_ITEM_MENU; sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_19], 0, sKecleonBrosWork1->unkE4, 0x10D); break; case KECLEON_STORE_CANT_SELL_ITEM: sub_8090E14(gFormatItems, &sKecleonBrosWork1->soldItem, NULL); - sKecleonBrosWork1->fallbackState = 24; + sKecleonBrosWork1->fallbackState = KECLEON_STORE_SELL_ITEM_MENU; sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_20], 0, sKecleonBrosWork1->unkE4, 0x10D); break; - case 14: - sKecleonBrosWork1->fallbackState = 24; + case KECLEON_STORE_SELL_ITEM_TOO_MUCH_MONEY: + sKecleonBrosWork1->fallbackState = KECLEON_STORE_SELL_ITEM_MENU; sub_8019E04(TRUE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_21], 0, sKecleonBrosWork1->unkE4, 0x10D); break; @@ -304,7 +304,7 @@ static void UpdateKecleonStoreDialogue(void) sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_03], 0, sKecleonBrosWork1->unkE4, 0x10D); break; - case 16: + case KECLEON_STORE_BUY_ITEM_MENU: sKecleonBrosWork1->fallbackState = 19; sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_04], 0, sKecleonBrosWork1->unkE4, 0x10D); @@ -335,17 +335,17 @@ static void UpdateKecleonStoreDialogue(void) sub_801AD34(0); DrawTeamMoneyBox(1); - sub_80195C0(); + BuildKecleonBrosBuyItemMenu(); sub_8012D60(&sKecleonBrosWork1->menu, sKecleonBrosWork1->menuItems, 0, sKecleonBrosWork1->unk74, sKecleonBrosWork1->menuAction3, 2); break; - case 22: - sub_8019700(); + case KECLEON_STORE_BUY_ITEM: + BuildKecleonBrosYesNoMenu(); sub_8090E14(gFormatItems, &sKecleonBrosWork1->soldItem, 0); gFormatData_202DE30 = sKecleonBrosWork1->itemSellPrice; sub_8019E04(FALSE); sub_8014248(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_05], 0, 5,sKecleonBrosWork1->menuItems, NULL, 4, 0, sKecleonBrosWork1->unkE4, 12); break; - case 17: + case KECLEON_STORE_BUY_ITEM_RECEIPT: if (CountKecleonItems() == 0) { if (sKecleonBrosWork1->isKecleonItemShop != FALSE) sub_801A010(); @@ -362,7 +362,7 @@ static void UpdateKecleonStoreDialogue(void) sKecleonBrosWork1->fallbackState = KECLEON_STORE_MAIN_MENU; } else - sKecleonBrosWork1->fallbackState = 16; + sKecleonBrosWork1->fallbackState = KECLEON_STORE_BUY_ITEM_MENU; } sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_06], 0, sKecleonBrosWork1->unkE4, 0x10D); @@ -372,7 +372,7 @@ static void UpdateKecleonStoreDialogue(void) sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_07], 0, sKecleonBrosWork1->unkE4, 0x10D); break; - case 24: + case KECLEON_STORE_SELL_ITEM_MENU: sKecleonBrosWork1->fallbackState = 27; sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_08], 0, sKecleonBrosWork1->unkE4, 0x10D); @@ -388,38 +388,38 @@ static void UpdateKecleonStoreDialogue(void) case 28: sub_801A9E0(); DrawTeamMoneyBox(1); - sub_8019660(); + BuildKecleonBrosSellItemMenu(); sub_8012D60(&sKecleonBrosWork1->menu, sKecleonBrosWork1->menuItems, 0, sKecleonBrosWork1->unk74, sKecleonBrosWork1->menuAction2, 2); break; - case 30: - sub_8019700(); + case KECLEON_STORE_SELL_ITEM: + BuildKecleonBrosYesNoMenu(); sub_8090E14(gFormatItems, &sKecleonBrosWork1->soldItem, NULL); gFormatData_202DE30 = sKecleonBrosWork1->itemSellPrice; sub_8019E04(FALSE); sub_8014248(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_09], 0, 5, sKecleonBrosWork1->menuItems, NULL, 4, 0, sKecleonBrosWork1->unkE4, 12); break; - case 21: - case 29: + case KECLEON_STORE_BUY_ITEM_INFO: + case KECLEON_STORE_SELL_ITEM_INFO: sub_801B3C0(&sKecleonBrosWork1->soldItem); break; - case 25: + case KECLEON_STORE_SELL_ITEM_RECEIPT: if (GetNumberOfFilledInventorySlots() == 0 || gTeamInventoryRef->teamMoney >= MAX_TEAM_MONEY) { sub_801A928(); sKecleonBrosWork1->fallbackState = KECLEON_STORE_MAIN_MENU; } else - sKecleonBrosWork1->fallbackState = 24; + sKecleonBrosWork1->fallbackState = KECLEON_STORE_SELL_ITEM_MENU; sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_11], 0, sKecleonBrosWork1->unkE4, 0x10D); break; - case 31: - sub_8019700(); + case KECLEON_STORE_SELL_ALL_ITEMS: + BuildKecleonBrosYesNoMenu(); gFormatData_202DE30 = sKecleonBrosWork1->inventoryItemSellPrice; sub_8019E04(FALSE); sub_8014248(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_10], 0, 5, sKecleonBrosWork1->menuItems, NULL, 4, 0, sKecleonBrosWork1->unkE4, 12); break; - case 32: + case KECLEON_STORE_SELL_ALL_ITEMS_RECEIPT: sKecleonBrosWork1->fallbackState = KECLEON_STORE_MAIN_MENU; sub_8019E04(FALSE); xxx_info_box_80141B4(gCommonKecleonBros[sKecleonBrosWork1->mode][KECLEON_DLG_11], 0, sKecleonBrosWork1->unkE4, 0x10D); @@ -427,7 +427,7 @@ static void UpdateKecleonStoreDialogue(void) } } -static void sub_80194F8(void) +static void BuildKecleonBrosMainMenu(void) { s32 i; s32 loopMax; @@ -473,7 +473,7 @@ static void sub_80194F8(void) } } -static void sub_80195C0(void) +static void BuildKecleonBrosBuyItemMenu(void) { s32 i; s32 loopMax; @@ -507,7 +507,7 @@ static void sub_80195C0(void) } } -static void sub_8019660(void) +static void BuildKecleonBrosSellItemMenu(void) { s32 i; s32 loopMax; @@ -541,7 +541,7 @@ static void sub_8019660(void) } } -static void sub_8019700(void) +static void BuildKecleonBrosYesNoMenu(void) { s32 loopMax = 0; sKecleonBrosWork1->menuItems[loopMax].text = gCommonYes[0]; @@ -556,14 +556,14 @@ static void sub_8019700(void) sKecleonBrosWork1->menuItems[loopMax].menuAction = CANCEL_ACTION; } -static void sub_8019730(void) +static void HandleKecleonBrosMainMenu(void) { s32 menuAction; if (sub_80144A4(&menuAction) != 0) return; - if (menuAction != 1) + if (menuAction != CANCEL_ACTION) sKecleonBrosWork1->menuAction1 = menuAction; switch (menuAction) { @@ -577,9 +577,9 @@ static void sub_8019730(void) break; case SELL_ACTION: if (GetNumberOfFilledInventorySlots() == 0) - SetKecleonBrosState(KECLEON_STORE_NO_ITEMS_TO_SELL); + SetKecleonBrosState(KECLEON_STORE_NO_ITEMS); else if (sKecleonBrosWork1->numInventoryItemToSell == 0) - SetKecleonBrosState(8); + SetKecleonBrosState(KECLEON_STORE_NO_ITEMS_TO_SELL); else if (gTeamInventoryRef->teamMoney < MAX_TEAM_MONEY) SetKecleonBrosState(23); else @@ -587,16 +587,16 @@ static void sub_8019730(void) break; case SELL_ALL_ACTION: if (GetNumberOfFilledInventorySlots() == 0) - SetKecleonBrosState(KECLEON_STORE_NO_ITEMS_TO_SELL); + SetKecleonBrosState(KECLEON_STORE_NO_ITEMS); else if (sKecleonBrosWork1->numInventoryItemToSell == 0) - SetKecleonBrosState(8); + SetKecleonBrosState(KECLEON_STORE_NO_ITEMS_TO_SELL); else if (sKecleonBrosWork1->inventoryItemSellPrice + gTeamInventoryRef->teamMoney > MAX_TEAM_MONEY) SetKecleonBrosState(KECLEON_STORE_TOO_MUCH_MONEY); else - SetKecleonBrosState(31); + SetKecleonBrosState(KECLEON_STORE_SELL_ALL_ITEMS); break; case INFO_ACTION: - SetKecleonBrosState(2); + SetKecleonBrosState(KECLEON_STORE_INFO); break; case CANCEL_ACTION: SetKecleonBrosState(3); @@ -604,7 +604,7 @@ static void sub_8019730(void) } } -static void sub_8019850(void) +static void HandleKecleonBrosBuyItemYesNoMenu(void) { s32 menuAction; @@ -625,17 +625,17 @@ static void sub_8019850(void) } PlaySound(332); - SetKecleonBrosState(17); + SetKecleonBrosState(KECLEON_STORE_BUY_ITEM_RECEIPT); break; case NO_ACTION: case CANCEL_ACTION: - SetKecleonBrosState(16); + SetKecleonBrosState(KECLEON_STORE_BUY_ITEM_MENU); break; } } } -static void sub_80198E8(void) +static void HandleKecleonBrosSellItemYesNoMenu(void) { s32 menuAction; @@ -645,17 +645,17 @@ static void sub_80198E8(void) AddToTeamMoney(sKecleonBrosWork1->itemSellPrice); ShiftItemsDownFrom(sKecleonBrosWork1->soldItemInventoryIndex); PlaySound(332); - SetKecleonBrosState(25); + SetKecleonBrosState(KECLEON_STORE_SELL_ITEM_RECEIPT); break; case NO_ACTION: case CANCEL_ACTION: - SetKecleonBrosState(24); + SetKecleonBrosState(KECLEON_STORE_SELL_ITEM_MENU); break; } } } -static void sub_8019944(void) +static void HandleKecleonBrosSellAllItemsMenu(void) { s32 slotIndex; s32 menuAction; @@ -674,7 +674,7 @@ static void sub_8019944(void) FillInventoryGaps(); AddToTeamMoney(sKecleonBrosWork1->inventoryItemSellPrice); PlaySound(0x14c); - SetKecleonBrosState(32); + SetKecleonBrosState(KECLEON_STORE_SELL_ALL_ITEMS_RECEIPT); break; case CANCEL_ACTION: case NO_ACTION: @@ -695,7 +695,7 @@ static void sub_80199CC(void) menuAction = sub_801A2A8(TRUE); switch (menuAction) { - case SELL_ACTION: + case 3: if (sKecleonBrosWork1->isKecleonItemShop) { sKecleonBrosWork1->itemShopItemIndex = sub_8019FB0(); item = GetKecleonShopItem(sKecleonBrosWork1->itemShopItemIndex); @@ -710,7 +710,7 @@ static void sub_80199CC(void) sKecleonBrosWork1->itemSellPrice = GetStackBuyPrice(&sKecleonBrosWork1->soldItem); SetKecleonBrosState(20); break; - case SELL_ALL_ACTION: + case 4: if (sKecleonBrosWork1->isKecleonItemShop) { sKecleonBrosWork1->itemShopItemIndex = sub_8019FB0(); item = GetKecleonShopItem(sKecleonBrosWork1->itemShopItemIndex); @@ -723,9 +723,9 @@ static void sub_80199CC(void) xxx_init_itemslot_8090A8C(&sKecleonBrosWork1->soldItem, item->id, 0); sKecleonBrosWork1->soldItem.quantity = item->quantity; sKecleonBrosWork1->itemSellPrice = GetStackBuyPrice(&sKecleonBrosWork1->soldItem); - SetKecleonBrosState(21); + SetKecleonBrosState(KECLEON_STORE_BUY_ITEM_INFO); break; - case BUY_ACTION: + case 2: if (sKecleonBrosWork1->isKecleonItemShop) sub_801A010(); else @@ -733,7 +733,7 @@ static void sub_80199CC(void) SetKecleonBrosState(KECLEON_STORE_MAIN_MENU); break; - case CANCEL_ACTION: + case 1: sub_801AD34(0); DrawTeamMoneyBox(1); break; @@ -756,7 +756,7 @@ static void sub_8019B08(void) sKecleonBrosWork1->soldItem = gTeamInventoryRef->teamItems[sKecleonBrosWork1->soldItemInventoryIndex]; sKecleonBrosWork1->itemSellPrice = GetStackSellPrice(&sKecleonBrosWork1->soldItem); sub_8099690(0); - SetKecleonBrosState(29); + SetKecleonBrosState(KECLEON_STORE_SELL_ITEM_INFO); break; case 2: sub_801A928(); @@ -769,7 +769,7 @@ static void sub_8019B08(void) } } -static void sub_8019BBC(void) +static void HandleKecleonBrosBuyItemMenu(void) { s32 menuAction; @@ -780,7 +780,7 @@ static void sub_8019BBC(void) else sub_801A2A8(FALSE); - if (sub_8012FD8(&sKecleonBrosWork1->menu) == 0 && (sub_8013114(&sKecleonBrosWork1->menu, &menuAction), menuAction != 1)) + if (sub_8012FD8(&sKecleonBrosWork1->menu) == 0 && (sub_8013114(&sKecleonBrosWork1->menu, &menuAction), menuAction != CANCEL_ACTION)) sKecleonBrosWork1->menuAction3 = menuAction; switch (menuAction) { @@ -790,10 +790,10 @@ static void sub_8019BBC(void) else if (sKecleonBrosWork1->itemSellPrice > gTeamInventoryRef->teamMoney) SetKecleonBrosState(KECLEON_STORE_NOT_ENOUGH_MONEY); else - SetKecleonBrosState(22); + SetKecleonBrosState(KECLEON_STORE_BUY_ITEM); break; case INFO_ACTION: - SetKecleonBrosState(21); + SetKecleonBrosState(KECLEON_STORE_BUY_ITEM_INFO); break; case CANCEL_ACTION: SetKecleonBrosState(19); @@ -801,7 +801,7 @@ static void sub_8019BBC(void) } } -static void sub_8019C78(void) +static void HandleKecleonBrosSellItemMenu(void) { s32 menuAction; @@ -818,13 +818,13 @@ static void sub_8019C78(void) if (!CanSellItem(sKecleonBrosWork1->soldItem.id)) SetKecleonBrosState(KECLEON_STORE_CANT_SELL_ITEM); else if (sKecleonBrosWork1->itemSellPrice + gTeamInventoryRef->teamMoney > MAX_TEAM_MONEY) - SetKecleonBrosState(14); + SetKecleonBrosState(KECLEON_STORE_SELL_ITEM_TOO_MUCH_MONEY); else - SetKecleonBrosState(30); + SetKecleonBrosState(KECLEON_STORE_SELL_ITEM); break; case INFO_ACTION: sub_8099690(0); - SetKecleonBrosState(29); + SetKecleonBrosState(KECLEON_STORE_SELL_ITEM_INFO); break; case CANCEL_ACTION: SetKecleonBrosState(27); @@ -860,7 +860,7 @@ static void sub_8019D4C(void) } } -static void sub_8019D68(void) +static void ProceedToKecleonBros1FallbackState(void) { s32 temp; @@ -876,7 +876,7 @@ static u32 CountKecleonItems(void) return CountKecleonWareItems(); } -static void sub_8019DAC(void) +static void KecleonCalcSellPriceForAllItems(void) { s32 sellPrice; Item *item; From a2c23310bc47c445aee6ec8ef68a9c03e0e0f976 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 28 Sep 2024 07:26:09 -0700 Subject: [PATCH 12/18] more documenation --- src/felicity_bank.c | 74 +++++++++++++++++++++++---------------- src/kangaskhan_storage2.c | 36 +++++++++---------- src/wigglytuff_shop2.c | 19 +++++----- src/wigglytuff_shop3.c | 14 ++++---- src/wonder_mail_6.c | 49 +++++++++++++------------- 5 files changed, 103 insertions(+), 89 deletions(-) diff --git a/src/felicity_bank.c b/src/felicity_bank.c index 07354d547..54c84fca6 100644 --- a/src/felicity_bank.c +++ b/src/felicity_bank.c @@ -27,7 +27,7 @@ static void UpdateFelicityBankDialogue(void); static void UpdateFelicityBankState(u32 newState); static void sub_801645C(void); -static void sub_80169BC(void); +static void HandleFelicityBankShopMenu(void); static void sub_8016B00(void); static void sub_8016B24(void); static void sub_8016B48(u8 action); @@ -39,6 +39,18 @@ enum MenuActions { INFO_ACTION }; +enum FelicityBankStates { + FELICITY_BANK_INIT, + FELICITY_BANK_INFO = 3, + FELICITY_BANK_EXIT = 6, + FELICITY_BANK_STORE, + FELICITY_BANK_STORE_HOW_MUCH, + FELICITY_BANK_STORE_RECEIPT, + FELICITY_BANK_TAKE, + FELICITY_BANK_TAKE_HOW_MUCH, + FELICITY_BANK_TAKE_DEPOSIT, +}; + bool8 CreateFelicityBank(s32 mode) { u8 *monName; @@ -67,7 +79,7 @@ bool8 CreateFelicityBank(s32 mode) sFelicityBankWork->unkA2 = 0; sFelicityBankWork->unk9C = 2; sFelicityBankWork->unk9E = 8; - UpdateFelicityBankState(0); + UpdateFelicityBankState(FELICITY_BANK_INIT); return TRUE; } @@ -78,24 +90,24 @@ u32 FelicityBankCallback(void) sub_8016B24(); break; case 2: - sub_80169BC(); + HandleFelicityBankShopMenu(); break; - case 8: + case FELICITY_BANK_STORE_HOW_MUCH: Felicity_DepositMoney(); break; - case 11: + case FELICITY_BANK_TAKE_HOW_MUCH: Felicity_WithdrawMoney(); break; - case 6: + case FELICITY_BANK_EXIT: return 3; - case 0: - case 3: + case FELICITY_BANK_INIT: + case FELICITY_BANK_INFO: case 4: case 5: - case 7: - case 9: - case 10: - case 12: + case FELICITY_BANK_STORE: + case FELICITY_BANK_STORE_RECEIPT: + case FELICITY_BANK_TAKE: + case FELICITY_BANK_TAKE_DEPOSIT: default: sub_8016B00(); break; @@ -134,8 +146,8 @@ static void sub_801645C(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(sFelicityBankWork->unkA8, TRUE, FALSE); break; - case 8: - case 11: + case FELICITY_BANK_STORE_HOW_MUCH: + case FELICITY_BANK_TAKE_HOW_MUCH: sFelicityBankWork->unkA8[0].unk0 = 0x80; sFelicityBankWork->unkA8[1].unk0 = 0x80; sFelicityBankWork->unkA8[3] = sUnknown_80DB6F4; @@ -156,7 +168,7 @@ static void sub_801645C(void) static void UpdateFelicityBankDialogue(void) { switch (sFelicityBankWork->currState) { - case 0: + case FELICITY_BANK_INIT: sFelicityBankWork->fallbackState = 1; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_WELCOME], 0, sFelicityBankWork->unkA4, 0x10D); break; @@ -172,12 +184,12 @@ static void UpdateFelicityBankDialogue(void) sFelicityBankWork->unk14, sFelicityBankWork->unk54, 4, 0, sFelicityBankWork->unkA4, 0xC); } break; - case 3: + case FELICITY_BANK_INFO: sFelicityBankWork->fallbackState = 1; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_HOW_IT_WORKS], 0, sFelicityBankWork->unkA4, 0x10D); break; case 4: - sFelicityBankWork->fallbackState = 6; + sFelicityBankWork->fallbackState = FELICITY_BANK_EXIT; if (gTeamInventoryRef->teamSavings == 0) xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_BYE__NO_MONEY], 0, sFelicityBankWork->unkA4, 0x10D); else { @@ -189,7 +201,7 @@ static void UpdateFelicityBankDialogue(void) sFelicityBankWork->fallbackState = 1; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_VERY_WELL], 0, sFelicityBankWork->unkA4, 0x10D); break; - case 7: + case FELICITY_BANK_STORE: if (gTeamInventoryRef->teamMoney == 0) { sFelicityBankWork->fallbackState = 1; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_DEPOSIT__NO_MONEY], 0, sFelicityBankWork->unkA4, 0x10D); @@ -199,11 +211,11 @@ static void UpdateFelicityBankDialogue(void) xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_DEPOSIT__BANK_FULL], 0, sFelicityBankWork->unkA4, 0x10D); } else { - sFelicityBankWork->fallbackState = 8; + sFelicityBankWork->fallbackState = FELICITY_BANK_STORE_HOW_MUCH; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_DEPOSIT__HOW_MUCH], 0, sFelicityBankWork->unkA4, 0x10D); } break; - case 8: + case FELICITY_BANK_STORE_HOW_MUCH: sFelicityBankWork->unk64.unkC = MAX_TEAM_SAVINGS - gTeamInventoryRef->teamSavings; if (sFelicityBankWork->unk64.unkC > gTeamInventoryRef->teamMoney) sFelicityBankWork->unk64.unkC = gTeamInventoryRef->teamMoney; @@ -218,12 +230,12 @@ static void UpdateFelicityBankDialogue(void) sub_8016B48(FELICITY_BANK_ACTION_DEPOSIT); CreateFelicityMoneySavingsHeader(3); break; - case 9: + case FELICITY_BANK_STORE_RECEIPT: sFelicityBankWork->fallbackState = 1; gFormatData_202DE30 = sFelicityBankWork->chosenAmount; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_DEPOSIT__RECEIPT], 0, sFelicityBankWork->unkA4, 0x10D); break; - case 10: + case FELICITY_BANK_TAKE: if (gTeamInventoryRef->teamMoney >= MAX_TEAM_MONEY) { sFelicityBankWork->fallbackState = 1; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_WITHDRAW__WALLET_FULL], 0, sFelicityBankWork->unkA4, 0x10D); @@ -233,12 +245,12 @@ static void UpdateFelicityBankDialogue(void) xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_WITHDRAW__NO_MONEY], 0, sFelicityBankWork->unkA4, 0x10D); } else { - sFelicityBankWork->fallbackState = 11; + sFelicityBankWork->fallbackState = FELICITY_BANK_TAKE_HOW_MUCH; gFormatData_202DE30 = gTeamInventoryRef->teamSavings; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_WITHDRAW__HOW_MUCH], 0, sFelicityBankWork->unkA4, 0x10D); } break; - case 11: + case FELICITY_BANK_TAKE_HOW_MUCH: sFelicityBankWork->unk64.unkC = MAX_TEAM_MONEY - gTeamInventoryRef->teamMoney; if (sFelicityBankWork->unk64.unkC > gTeamInventoryRef->teamSavings) sFelicityBankWork->unk64.unkC = gTeamInventoryRef->teamSavings; @@ -256,7 +268,7 @@ static void UpdateFelicityBankDialogue(void) case 2: CreateFelicityMoneySavingsHeader(3); break; - case 12: + case FELICITY_BANK_TAKE_DEPOSIT: sFelicityBankWork->fallbackState = 1; gFormatData_202DE30 = sFelicityBankWork->chosenAmount; xxx_info_box_80141B4(gCommonFelicity[sFelicityBankWork->mode][FEL_DLG_WITHDRAW__RECEIPT], 0, sFelicityBankWork->unkA4, 0x10D); @@ -304,7 +316,7 @@ static void CreateFelicityBankShopMenu(void) } } -static void sub_80169BC(void) +static void HandleFelicityBankShopMenu(void) { s32 menuAction; @@ -314,13 +326,13 @@ static void sub_80169BC(void) sFelicityBankWork->menuAction = menuAction; switch (menuAction) { case STORE_ACTION: - UpdateFelicityBankState(7); + UpdateFelicityBankState(FELICITY_BANK_STORE); break; case TAKE_ACTION: - UpdateFelicityBankState(10); + UpdateFelicityBankState(FELICITY_BANK_TAKE); break; case INFO_ACTION: - UpdateFelicityBankState(3); + UpdateFelicityBankState(FELICITY_BANK_INFO); break; case CANCEL_ACTION: UpdateFelicityBankState(4); @@ -339,7 +351,7 @@ static void Felicity_DepositMoney(void) gTeamInventoryRef->teamSavings += sFelicityBankWork->chosenAmount; gTeamInventoryRef->teamMoney -= sFelicityBankWork->chosenAmount; PlaySound(332); - UpdateFelicityBankState(9); + UpdateFelicityBankState(FELICITY_BANK_STORE_RECEIPT); break; case 2: UpdateFelicityBankState(5); @@ -360,7 +372,7 @@ static void Felicity_WithdrawMoney(void) gTeamInventoryRef->teamMoney += sFelicityBankWork->chosenAmount; gTeamInventoryRef->teamSavings -= sFelicityBankWork->chosenAmount; PlaySound(332); - UpdateFelicityBankState(12); + UpdateFelicityBankState(FELICITY_BANK_TAKE_DEPOSIT); break; case 2: UpdateFelicityBankState(5); diff --git a/src/kangaskhan_storage2.c b/src/kangaskhan_storage2.c index 12fc70673..a299bebd7 100644 --- a/src/kangaskhan_storage2.c +++ b/src/kangaskhan_storage2.c @@ -21,15 +21,15 @@ static void UpdateKangaskhanStorage2State(u32); static void sub_8017F28(void); static void sub_8018100(void); static void sub_8018280(void); -static void sub_80182E4(void); -static void sub_801841C(void); -static void sub_80184D4(void); -static void sub_8018588(void); +static void BuildKangaskhanStorage2MainMenu(void); +static void BuildKangaskhanStorage2StoreMenu(void); +static void BuildKangaskhanStorage2TakeMenu(void); +static void HandleKangaskhanStorage2MainMenu(void); static void sub_8018620(void); static void sub_80186F8(void); static void sub_8018854(void); -static void sub_8018904(void); -static void sub_80189C8(void); +static void HandleKangaskhanStorage2StoreMenu(void); +static void HandleKangaskhanStorage2TakeMenu(void); static void sub_8018AC8(void); static void sub_8018AE4(void); @@ -59,14 +59,14 @@ u32 sub_8017E54(void) UpdateKangaskhanStorage2State(KANGASKHAN_STORAGE_2_MAIN); break; case KANGASKHAN_STORAGE_2_MAIN: - sub_8018588(); + HandleKangaskhanStorage2MainMenu(); break; case 4: case 5: sub_8018620(); break; case 6: - sub_8018904(); + HandleKangaskhanStorage2StoreMenu(); break; case 7: sub_8018AC8(); @@ -79,7 +79,7 @@ u32 sub_8017E54(void) sub_8018854(); break; case 13: - sub_80189C8(); + HandleKangaskhanStorage2TakeMenu(); break; case 14: sub_8018AE4(); @@ -116,7 +116,7 @@ static void sub_8017F28(void) sUnknown_203B20C->unkF0[0] = sUnknown_80DB7B8; sUnknown_203B20C->unkF0[1] = sUnknown_80DB7B8; sUnknown_203B20C->unkF0[0] = sUnknown_80DB7B8; - sub_80182E4(); + BuildKangaskhanStorage2MainMenu(); sUnknown_203B20C->unkF0[2] = sUnknown_80DB7D0; sub_8012CAC(&sUnknown_203B20C->unkF0[2], sUnknown_203B20C->unk20); break; @@ -165,7 +165,7 @@ static void sub_8018100(void) break; case 6: sub_801A9E0(); - sub_801841C(); + BuildKangaskhanStorage2StoreMenu(); sub_8012D60(&sUnknown_203B20C->unk70, sUnknown_203B20C->unk20, 0, sUnknown_203B20C->unk60, sUnknown_203B20C->menuAction2, 2); break; case 7: @@ -199,7 +199,7 @@ static void sub_8018100(void) case 13: sub_801CCD8(); sub_801AD34(0); - sub_80184D4(); + BuildKangaskhanStorage2TakeMenu(); sub_8012D60(&sUnknown_203B20C->unk70, sUnknown_203B20C->unk20, 0, sUnknown_203B20C->unk60, sUnknown_203B20C->menuAction3, 2); break; case 14: @@ -223,7 +223,7 @@ static void sub_8018280(void) sub_8012EA4(&sUnknown_203B20C->unk70, 0); } -static void sub_80182E4(void) +static void BuildKangaskhanStorage2MainMenu(void) { int index; s32 loopMax; @@ -266,7 +266,7 @@ static void sub_80182E4(void) } } -static void sub_801841C(void) +static void BuildKangaskhanStorage2StoreMenu(void) { s32 index; s32 loopMax; @@ -301,7 +301,7 @@ static void sub_801841C(void) } } -static void sub_80184D4(void) +static void BuildKangaskhanStorage2TakeMenu(void) { s32 index; s32 loopMax; @@ -337,7 +337,7 @@ static void sub_80184D4(void) } } -static void sub_8018588(void) +static void HandleKangaskhanStorage2MainMenu(void) { s32 menuAction; menuAction = 0; @@ -507,7 +507,7 @@ static void sub_8018854(void) } } -static void sub_8018904(void) +static void HandleKangaskhanStorage2StoreMenu(void) { s32 menuAction; @@ -553,7 +553,7 @@ static void sub_8018904(void) } } -static void sub_80189C8(void) +static void HandleKangaskhanStorage2TakeMenu(void) { BulkItem item; s32 menuAction; diff --git a/src/wigglytuff_shop2.c b/src/wigglytuff_shop2.c index 3afac4ddd..a92946ecc 100644 --- a/src/wigglytuff_shop2.c +++ b/src/wigglytuff_shop2.c @@ -22,7 +22,7 @@ static void sub_8021820(void); static void sub_8021878(void); static void PopulateWigglytuffShopFriendAreaInfoScreen(void); static void sub_8021A60(void); -static s32 sub_8021B58(s16 species); +static s32 CheckSpeciesinWigglytuffFriendArea(s16 species); bool8 CreateWigglytuffShopFriendAreaMenu(u8 friendArea, bool8 a1, s32 a2) { @@ -132,7 +132,7 @@ static void PopulateWigglytuffShopFriendAreaInfoScreen(void) static void sub_8021A60(void) { - s32 sVar4; + s32 areaIndex; s32 iVar6; s32 index; PokemonStruct1 *pokeStruct; @@ -158,9 +158,9 @@ static void sub_8021A60(void) if (!sub_8098134(index)) continue; - sVar4 = sub_8021B58(index); - if (sVar4 != -1) - sWigglytuffShop2Work->pokemonStatus[sVar4] = POKEMON_SEEN; + areaIndex = CheckSpeciesinWigglytuffFriendArea(index); + if (areaIndex != -1) + sWigglytuffShop2Work->pokemonStatus[areaIndex] = POKEMON_SEEN; } for (index = 0; index < NUM_MONSTERS; index++) { @@ -168,13 +168,14 @@ static void sub_8021A60(void) if (!((u8)pokeStruct->unk0 & 1)) continue; - sVar4 = sub_8021B58(pokeStruct->speciesNum); - if (sVar4 != -1) - sWigglytuffShop2Work->pokemonStatus[sVar4] = POKEMON_RECRUITED; + areaIndex = CheckSpeciesinWigglytuffFriendArea(pokeStruct->speciesNum); + if (areaIndex != -1) + sWigglytuffShop2Work->pokemonStatus[areaIndex] = POKEMON_RECRUITED; } } -static s32 sub_8021B58(s16 species) +/* Return index of pokemon if in the friend area, else return -1 */ +static s32 CheckSpeciesinWigglytuffFriendArea(s16 species) { s32 baseSpecies; s32 i; diff --git a/src/wigglytuff_shop3.c b/src/wigglytuff_shop3.c index 8a0ceeb84..f3d926476 100644 --- a/src/wigglytuff_shop3.c +++ b/src/wigglytuff_shop3.c @@ -43,9 +43,9 @@ static void SetWigglytuffState(s32 newState); static void UpdateWigglytuffDialogue(void); static void sub_8021D5C(void); -static void sub_80222C8(void); +static void BuildWigglytuffMainMenu(void); static void sub_8022380(void); -static void sub_8022460(void); +static void HandleWigglytuffMainMenu(void); static void sub_8022538(void); static void sub_80225C8(void); static void sub_8022668(void); @@ -93,7 +93,7 @@ u32 sub_8021C5C(void) switch (sWigglytuffShop3Work->state) { case WIGGLYTUFF_INIT: case WIGGLYTUFF_MAIN_MENU: - sub_8022460(); + HandleWigglytuffMainMenu(); break; case WIGGLYTUFF_UNK9: case WIGGLYTUFF_UNKA: @@ -176,11 +176,11 @@ static void UpdateWigglytuffDialogue(void) switch (sWigglytuffShop3Work->state) { case WIGGLYTUFF_INIT: - sub_80222C8(); + BuildWigglytuffMainMenu(); sub_8014248(gCommonWigglytuff[sWigglytuffShop3Work->mode][WIGGLY_DLG_00], 0, sWigglytuffShop3Work->menuAction1, sWigglytuffShop3Work->unk1C, sWigglytuffShop3Work->unk5C, 4, 0, sWigglytuffShop3Work->unkCC, 12); break; case WIGGLYTUFF_MAIN_MENU: - sub_80222C8(); + BuildWigglytuffMainMenu(); sub_8014248(gCommonWigglytuff[sWigglytuffShop3Work->mode][WIGGLY_DLG_01], 0, sWigglytuffShop3Work->menuAction1, sWigglytuffShop3Work->unk1C, sWigglytuffShop3Work->unk5C, 4, 0, sWigglytuffShop3Work->unkCC, 12); break; case FRIEND_AREA_SELECT_BUY: @@ -328,7 +328,7 @@ static void UpdateWigglytuffDialogue(void) } } -static void sub_80222C8(void) +static void BuildWigglytuffMainMenu(void) { s32 i; s32 index = 0; @@ -416,7 +416,7 @@ static void CreateWigglytuffConfirmFriendAreaMenu(void) sWigglytuffShop3Work->unk1C[index].menuAction = CANCEL_ACTION; } -static void sub_8022460(void) +static void HandleWigglytuffMainMenu(void) { s32 menuAction; diff --git a/src/wonder_mail_6.c b/src/wonder_mail_6.c index bdc7bac77..542238ead 100644 --- a/src/wonder_mail_6.c +++ b/src/wonder_mail_6.c @@ -88,18 +88,19 @@ ALIGNED(4) const u8 gUnknown_80E0A0C[] = _( " ...Uh{COMMA} no?\n" "You don{APOSTROPHE}t have any {COLOR_1 LIGHT_BLUE}A-OK Mail{END_COLOR_TEXT_1}."); -extern void sub_8031300(void); -extern void sub_803136C(void); -extern void sub_80313D8(u32); -extern void sub_8031498(void); -extern void sub_80310FC(); -extern void sub_8031258(); +static void sub_8031300(void); +static void HandleWonderMail6MainMenu(void); +static void HandleWonderMail6DeleteMailMenu(u32); +static void sub_8031498(void); +static void sub_80310FC(); +static void sub_8031258(); enum States { - INIT_STATE = 0, - DELETE_SINGLE_MAIL_STATE = 2, - DELETE_ALL_MAIL_STATE = 3, - INFO_STATE = 4, + INIT_STATE, + MAIN_MENU, + DELETE_SINGLE_MAIL_STATE, + DELETE_ALL_MAIL_STATE, + INFO_STATE, }; bool8 sub_8030F58(u32 wonderMailType) @@ -150,12 +151,12 @@ s32 sub_8031050(void) case INIT_STATE: sub_8031300(); break; - case 1: - sub_803136C(); + case MAIN_MENU: + HandleWonderMail6MainMenu(); break; case DELETE_SINGLE_MAIL_STATE: case DELETE_ALL_MAIL_STATE: - sub_80313D8(gUnknown_203B328->state); + HandleWonderMail6DeleteMailMenu(gUnknown_203B328->state); break; case INFO_STATE: sub_8031498(); @@ -184,7 +185,7 @@ void sub_80310E4(u32 newState) sub_8031258(); } -void sub_80310FC(void) +static void sub_80310FC(void) { RestoreUnkTextStruct_8006518(gUnknown_203B328->unkA8); switch(gUnknown_203B328->state) @@ -194,7 +195,7 @@ void sub_80310FC(void) gUnknown_203B328->unkA8[2] = gUnknown_80E0990; gUnknown_203B328->unkA8[3] = gUnknown_80E0990; break; - case 1: + case MAIN_MENU: gUnknown_203B328->unkA8[1] = gUnknown_80E09A8; gUnknown_203B328->unkA8[2] = gUnknown_80E0990; gUnknown_203B328->unkA8[3] = gUnknown_80E0990; @@ -222,14 +223,14 @@ void sub_80310FC(void) xxx_call_save_unk_text_struct_800641C(gUnknown_203B328->unkA8, TRUE, TRUE); } -void sub_8031258(void) +static void sub_8031258(void) { switch(gUnknown_203B328->state) { case INIT_STATE: sub_8030810(1); break; - case 1: + case MAIN_MENU: sub_803092C(); sub_8012D60(&gUnknown_203B328->unk8, gUnknown_80E0968, NULL, NULL, DELETE_ACTION, 1); break; @@ -249,13 +250,13 @@ void sub_8031258(void) } } -void sub_8031300(void) +static void sub_8031300(void) { switch(sub_8030768(1)) { case 3: gUnknown_203B328->mailIndex = sub_80307EC(); - sub_80310E4(1); + sub_80310E4(MAIN_MENU); break; case 4: gUnknown_203B328->mailIndex = sub_80307EC(); @@ -270,13 +271,13 @@ void sub_8031300(void) } } -void sub_803136C(void) +static void HandleWonderMail6MainMenu(void) { s32 menuAction; menuAction = 0; sub_8030768(0); - if (sub_8012FD8(&gUnknown_203B328->unk8) == '\0') { + if (!sub_8012FD8(&gUnknown_203B328->unk8)) { sub_8013114(&gUnknown_203B328->unk8,&menuAction); } @@ -298,7 +299,7 @@ void sub_803136C(void) } } -void sub_80313D8(u32 state) +static void HandleWonderMail6DeleteMailMenu(u32 state) { s32 index; s32 menuAction; @@ -307,7 +308,7 @@ void sub_80313D8(u32 state) menuAction = 0; sub_8030768(0); sub_8012FD8(&gUnknown_203B328->unk8); - if (sub_8012FD8(&gUnknown_203B328->unk58) == 0) { + if (!sub_8012FD8(&gUnknown_203B328->unk58)) { sub_8013114(&gUnknown_203B328->unk58,&menuAction); } @@ -345,7 +346,7 @@ void sub_80313D8(u32 state) } } -void sub_8031498(void) +static void sub_8031498(void) { switch(sub_8030DA0()) { From 2c47580c0610ab441209fa98740e024d952ab1b0 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 29 Sep 2024 15:46:34 -0700 Subject: [PATCH 13/18] more functions decomped --- asm/code_80718D8.s | 1260 --------------------------------- asm/code_8077274.s | 267 ------- include/structs/str_pokemon.h | 3 +- ld_script.txt | 1 - src/code_80718D8.c | 735 ++++++++++++++++++- src/status.c | 99 ++- sym_ewram.txt | 6 +- 7 files changed, 832 insertions(+), 1539 deletions(-) delete mode 100644 asm/code_8077274.s diff --git a/asm/code_80718D8.s b/asm/code_80718D8.s index 0bd90c109..76ddef32f 100644 --- a/asm/code_80718D8.s +++ b/asm/code_80718D8.s @@ -5,1266 +5,6 @@ .text - thumb_func_start sub_8071DA4 -sub_8071DA4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xD4 - str r0, [sp, 0xB4] - ldr r2, _08071E44 - ldr r1, [r2] - ldrb r0, [r1, 0xD] - cmp r0, 0 - bne _08071DBE - b _08071FE2 -_08071DBE: - movs r0, 0 - strb r0, [r1, 0xD] - ldr r0, [r2] - ldrb r0, [r0, 0x10] - cmp r0, 0 - beq _08071DCC - b _08071FE2 -_08071DCC: - ldr r0, [sp, 0xB4] - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _08071DE2 - mov r0, sp - bl sub_80457DC - mov r0, sp - str r0, [sp, 0xB4] -_08071DE2: - movs r4, 0 -_08071DE4: - movs r5, 0 - ldr r0, _08071E44 - ldr r0, [r0] - lsls r1, r4, 2 - ldr r2, _08071E48 - adds r0, r2 - adds r0, r1 - ldr r0, [r0] - mov r8, r0 - movs r0, 0 - str r0, [sp, 0xB8] - movs r1, 0 - movs r2, 0 - str r1, [sp, 0xBC] - str r2, [sp, 0xC0] - movs r0, 0 - movs r1, 0 - str r0, [sp, 0xC4] - str r1, [sp, 0xC8] - adds r1, r4, 0x1 - str r1, [sp, 0xCC] - mov r2, r8 - cmp r2, 0 - bne _08071E16 - b _08071FDA -_08071E16: - mov r0, r8 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _08071E24 - b _08071FDA -_08071E24: - mov r0, r8 - ldr r6, [r0, 0x70] - movs r1, 0xE - ldrsh r0, [r6, r1] - cmp r0, 0 - bne _08071E32 - b _08071FDA -_08071E32: - adds r1, r6, 0 - adds r1, 0xF9 - ldrb r0, [r1] - cmp r0, 0 - beq _08071E4C - add r2, sp, 0xB8 - ldrb r2, [r2] - strb r2, [r1] - b _08071FCA - .align 2, 0 -_08071E44: .4byte gDungeon -_08071E48: .4byte 0x000135cc -_08071E4C: - movs r1, 0xFE - lsls r1, 1 - adds r0, r6, r1 - ldr r0, [r0] - mov r10, r0 - cmp r0, 0 - beq _08071EB6 - ldrb r0, [r6, 0x7] - cmp r0, 0 - beq _08071E68 - ldrb r1, [r6, 0x9] - add r0, sp, 0x74 - bl GetAvailTacticsforLvl_Bool -_08071E68: - movs r0, 0x10 - ldrsh r2, [r6, r0] - str r2, [sp, 0xB8] - ldrb r1, [r6, 0x14] - str r1, [sp, 0xBC] - ldrb r2, [r6, 0x15] - str r2, [sp, 0xC0] - ldrb r0, [r6, 0x16] - str r0, [sp, 0xC4] - ldrb r1, [r6, 0x17] - str r1, [sp, 0xC8] - ldrb r0, [r6, 0x9] - cmp r0, 0x64 - beq _08071EB6 - ldr r0, [r6, 0x18] - add r0, r10 - str r0, [r6, 0x18] - mov r2, r10 - ldr r0, _08071EE8 - str r2, [r0] - ldr r0, _08071EEC - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument_2 - ldr r0, _08071EF0 - ldr r2, [r0] - ldr r0, [sp, 0xB4] - mov r1, r8 - bl sub_80522F4 - ldr r0, [sp, 0xB4] - mov r1, r8 - movs r2, 0x1 - movs r3, 0x1 - bl sub_80723D0 - lsls r0, 24 - lsrs r5, r0, 24 -_08071EB6: - ldr r1, _08071EF4 - adds r0, r6, r1 - ldrb r0, [r0] - adds r4, 0x1 - str r4, [sp, 0xCC] - cmp r0, 0 - beq _08071F3A - movs r2, 0x2 - ldrsh r0, [r6, r2] - add r1, sp, 0x8C - movs r2, 0 - movs r3, 0 - bl sub_808E400 - adds r7, r0, 0 - add r0, sp, 0x8C - mov r9, r0 - cmp r7, 0 - beq _08071F38 - adds r0, r7, 0 - bl DungeonRandInt - adds r4, r0, 0 - movs r1, 0 - b _08071F02 - .align 2, 0 -_08071EE8: .4byte gFormatData_202DE30 -_08071EEC: .4byte gAvailablePokemonNames -_08071EF0: .4byte gUnknown_80F9E64 -_08071EF4: .4byte 0x00000149 -_08071EF8: - adds r4, 0x1 - cmp r4, r7 - blt _08071F00 - movs r4, 0 -_08071F00: - adds r1, 0x1 -_08071F02: - cmp r1, r7 - bge _08071F38 - lsls r0, r4, 1 - mov r2, r9 - adds r5, r2, r0 - movs r2, 0 - ldrsh r0, [r5, r2] - str r1, [sp, 0xD0] - bl sub_803D930 - lsls r0, 24 - ldr r1, [sp, 0xD0] - cmp r0, 0 - beq _08071EF8 - movs r2, 0 - ldrsh r0, [r5, r2] - bl GetSpriteData - ldr r1, [sp, 0xD0] - cmp r0, 0 - beq _08071EF8 - movs r0, 0 - ldrsh r2, [r5, r0] - ldr r0, [sp, 0xB4] - mov r1, r8 - bl sub_8072B78 -_08071F38: - movs r5, 0 -_08071F3A: - cmp r5, 0 - beq _08071F7A - ldrb r0, [r6, 0x6] - cmp r0, 0 - bne _08071F7A - movs r1, 0x10 - ldrsh r0, [r6, r1] - ldr r2, [sp, 0xB8] - subs r0, r2 - ldr r1, _08071FF4 - str r0, [r1] - ldrb r0, [r6, 0x14] - ldr r2, [sp, 0xBC] - subs r0, r2 - str r0, [r1, 0x4] - ldrb r0, [r6, 0x16] - ldr r1, [sp, 0xC4] - subs r0, r1 - ldr r2, _08071FF4 - str r0, [r2, 0x8] - ldrb r0, [r6, 0x15] - ldr r1, [sp, 0xC0] - subs r0, r1 - str r0, [r2, 0xC] - ldrb r0, [r6, 0x17] - ldr r2, [sp, 0xC8] - subs r0, r2 - ldr r1, _08071FF4 - str r0, [r1, 0x10] - mov r0, r8 - bl sub_807218C -_08071F7A: - mov r2, r10 - cmp r2, 0 - beq _08071FCA - ldrb r0, [r6, 0x7] - cmp r0, 0 - beq _08071FCA - ldrb r1, [r6, 0x9] - add r0, sp, 0x80 - bl GetAvailTacticsforLvl_Bool - movs r4, 0 - add r7, sp, 0x74 - add r5, sp, 0x80 -_08071F94: - adds r0, r7, r4 - ldrb r0, [r0] - cmp r0, 0 - bne _08071FC4 - adds r0, r5, r4 - ldrb r0, [r0] - cmp r0, 0x1 - bne _08071FC4 - ldr r0, _08071FF8 - mov r1, r8 - movs r2, 0 - bl SetMessageArgument - lsls r1, r4, 24 - lsrs r1, 24 - ldr r0, _08071FFC - bl CopyTacticsNameToBuffer - ldr r0, _08072000 - ldr r2, [r0] - ldr r0, [sp, 0xB4] - mov r1, r8 - bl sub_80522F4 -_08071FC4: - adds r4, 0x1 - cmp r4, 0xB - ble _08071F94 -_08071FCA: - movs r1, 0xFE - lsls r1, 1 - adds r0, r6, r1 - movs r1, 0 - str r1, [r0] - ldr r2, _08072004 - adds r0, r6, r2 - strb r1, [r0] -_08071FDA: - ldr r4, [sp, 0xCC] - cmp r4, 0x13 - bgt _08071FE2 - b _08071DE4 -_08071FE2: - add sp, 0xD4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08071FF4: .4byte gFormatData_202DE30 -_08071FF8: .4byte gAvailablePokemonNames -_08071FFC: .4byte gFormatItems -_08072000: .4byte gUnknown_80FF730 -_08072004: .4byte 0x00000149 - thumb_func_end sub_8071DA4 - - thumb_func_start sub_8072008 -sub_8072008: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x38 - mov r9, r0 - mov r8, r1 - adds r4, r2, 0 - ldr r0, [sp, 0x58] - lsls r3, 24 - lsrs r3, 24 - mov r10, r3 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] - mov r0, r8 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _08072036 - b _08072162 -_08072036: - movs r0, 0 - str r0, [sp, 0x28] - mov r1, r8 - ldr r5, [r1, 0x70] - ldrb r0, [r5, 0x7] - cmp r0, 0 - beq _0807204C - add r0, sp, 0xC - ldrb r1, [r5, 0x9] - bl GetAvailTacticsforLvl_Bool -_0807204C: - movs r0, 0x10 - ldrsh r2, [r5, r0] - str r2, [sp, 0x2C] - ldrb r6, [r5, 0x14] - ldrb r7, [r5, 0x15] - ldrb r1, [r5, 0x16] - str r1, [sp, 0x30] - ldrb r2, [r5, 0x17] - str r2, [sp, 0x34] - adds r0, r5, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _0807206C - cmp r0, 0x47 - bne _08072070 -_0807206C: - movs r0, 0x1 - b _08072072 -_08072070: - movs r0, 0 -_08072072: - cmp r0, 0 - bne _080720E6 - ldrb r0, [r5, 0x9] - adds r2, r0, r4 - cmp r2, 0x63 - ble _08072080 - movs r2, 0x64 -_08072080: - cmp r2, r0 - beq _080720E6 - movs r0, 0x2 - ldrsh r1, [r5, r0] - mov r0, sp - bl GetPokemonLevelData - ldr r0, [sp] - str r0, [r5, 0x18] - mov r0, r9 - mov r1, r8 - mov r2, r10 - ldr r3, [sp, 0x24] - bl sub_80723D0 - ldr r1, [sp, 0x28] - orrs r1, r0 - lsls r0, r1, 24 - lsrs r0, 24 - str r0, [sp, 0x28] - cmp r0, 0 - beq _080720E6 - ldrb r0, [r5, 0x6] - cmp r0, 0 - bne _080720E6 - ldr r1, _08072174 - movs r2, 0x10 - ldrsh r0, [r5, r2] - ldr r2, [sp, 0x2C] - subs r0, r2 - str r0, [r1] - ldrb r0, [r5, 0x14] - subs r0, r6 - str r0, [r1, 0x4] - ldrb r0, [r5, 0x16] - ldr r2, [sp, 0x30] - subs r0, r2 - str r0, [r1, 0x8] - ldrb r0, [r5, 0x15] - subs r0, r7 - str r0, [r1, 0xC] - ldrb r0, [r5, 0x17] - ldr r2, [sp, 0x34] - subs r0, r2 - str r0, [r1, 0x10] - mov r0, r10 - cmp r0, 0 - beq _080720E6 - mov r0, r8 - bl sub_807218C -_080720E6: - ldrb r0, [r5, 0x7] - cmp r0, 0 - beq _08072130 - add r4, sp, 0x18 - ldrb r1, [r5, 0x9] - adds r0, r4, 0 - bl GetAvailTacticsforLvl_Bool - movs r6, 0 - add r7, sp, 0xC -_080720FA: - adds r0, r7, r6 - ldrb r0, [r0] - cmp r0, 0 - bne _0807212A - adds r0, r4, r6 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0807212A - ldr r0, _08072178 - mov r1, r8 - movs r2, 0 - bl SetMessageArgument - lsls r1, r6, 24 - lsrs r1, 24 - ldr r0, _0807217C - bl CopyTacticsNameToBuffer - ldr r0, _08072180 - ldr r2, [r0] - mov r0, r9 - mov r1, r8 - bl sub_80522F4 -_0807212A: - adds r6, 0x1 - cmp r6, 0xB - ble _080720FA -_08072130: - movs r1, 0xFE - lsls r1, 1 - adds r0, r5, r1 - movs r1, 0 - str r1, [r0] - ldr r2, _08072184 - adds r0, r5, r2 - strb r1, [r0] - ldr r0, [sp, 0x28] - cmp r0, 0 - bne _08072162 - mov r1, r10 - cmp r1, 0 - beq _08072162 - ldr r0, _08072178 - mov r1, r8 - movs r2, 0 - bl SetMessageArgument - ldr r0, _08072188 - ldr r2, [r0] - mov r0, r9 - mov r1, r8 - bl sub_80522F4 -_08072162: - add sp, 0x38 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08072174: .4byte gFormatData_202DE30 -_08072178: .4byte gAvailablePokemonNames -_0807217C: .4byte gFormatItems -_08072180: .4byte gUnknown_80FF730 -_08072184: .4byte 0x00000149 -_08072188: .4byte gUnknown_80F9B74 - thumb_func_end sub_8072008 - - thumb_func_start sub_807218C -sub_807218C: - push {r4-r6,lr} - sub sp, 0x190 - adds r4, r0, 0 - movs r6, 0 - ldr r5, [r4, 0x70] - movs r1, 0 - bl sub_806A2BC - ldr r0, _080721C8 - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument_2 - adds r0, r4, 0 - bl sub_8070BC0 - lsls r0, 24 - cmp r0, 0 - beq _08072200 - movs r3, 0 - movs r0, 0x2 - ldrsh r1, [r5, r0] - adds r0, r5, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - bne _080721CC - movs r1, 0xD2 - lsls r1, 1 - b _080721EC - .align 2, 0 -_080721C8: .4byte gAvailablePokemonNames -_080721CC: - cmp r0, 0x47 - bne _080721D8 - ldr r1, _080721D4 - b _080721EC - .align 2, 0 -_080721D4: .4byte 0x000001a5 -_080721D8: - cmp r0, 0x41 - bne _080721EC - ldr r0, _080721F8 - ldr r0, [r0] - ldr r2, _080721FC - adds r0, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _080721EC - movs r3, 0x1 -_080721EC: - mov r0, sp - movs r2, 0x3 - bl sub_806A3D4 - b _0807220A - .align 2, 0 -_080721F8: .4byte gDungeon -_080721FC: .4byte 0x0000065c -_08072200: - ldr r0, _08072308 - ldr r1, [r0] - mov r0, sp - bl strcpy -_0807220A: - movs r0, 0 - mov r1, sp - movs r2, 0x1 - bl PrintFieldMessage - mov r0, sp - movs r1, 0 - strb r1, [r0] - ldr r4, _0807230C - ldr r0, [r4] - cmp r0, 0 - ble _0807222E - ldr r0, _08072310 - ldr r1, [r0] - mov r0, sp - bl strcat - adds r6, 0x1 -_0807222E: - ldr r0, [r4, 0x4] - cmp r0, 0 - ble _0807225A - ldr r0, _08072314 - adds r1, r6, r0 - ldrb r0, [r1] - cmp r0, 0 - beq _0807224E - ldr r0, _08072318 - ldrb r1, [r1] - lsls r1, 2 - adds r1, r0 - ldr r1, [r1] - mov r0, sp - bl strcat -_0807224E: - ldr r0, _0807231C - ldr r1, [r0] - mov r0, sp - bl strcat - adds r6, 0x1 -_0807225A: - ldr r0, _0807230C - ldr r0, [r0, 0x8] - cmp r0, 0 - ble _08072288 - ldr r0, _08072314 - adds r1, r6, r0 - ldrb r0, [r1] - cmp r0, 0 - beq _0807227C - ldr r0, _08072318 - ldrb r1, [r1] - lsls r1, 2 - adds r1, r0 - ldr r1, [r1] - mov r0, sp - bl strcat -_0807227C: - ldr r0, _08072320 - ldr r1, [r0] - mov r0, sp - bl strcat - adds r6, 0x1 -_08072288: - ldr r0, _0807230C - ldr r0, [r0, 0xC] - cmp r0, 0 - ble _080722B6 - ldr r0, _08072314 - adds r1, r6, r0 - ldrb r0, [r1] - cmp r0, 0 - beq _080722AA - ldr r0, _08072318 - ldrb r1, [r1] - lsls r1, 2 - adds r1, r0 - ldr r1, [r1] - mov r0, sp - bl strcat -_080722AA: - ldr r0, _08072324 - ldr r1, [r0] - mov r0, sp - bl strcat - adds r6, 0x1 -_080722B6: - ldr r0, _0807230C - ldr r0, [r0, 0x10] - cmp r0, 0 - ble _080722E2 - ldr r0, _08072314 - adds r1, r6, r0 - ldrb r0, [r1] - cmp r0, 0 - beq _080722D8 - ldr r0, _08072318 - ldrb r1, [r1] - lsls r1, 2 - adds r1, r0 - ldr r1, [r1] - mov r0, sp - bl strcat -_080722D8: - ldr r0, _08072328 - ldr r1, [r0] - mov r0, sp - bl strcat -_080722E2: - mov r0, sp - ldrb r0, [r0] - cmp r0, 0 - beq _080722F4 - movs r0, 0 - mov r1, sp - movs r2, 0x1 - bl PrintFieldMessage -_080722F4: - bl GetLeader - movs r1, 0 - bl sub_806A2BC - add sp, 0x190 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08072308: .4byte gUnknown_80FCF18 -_0807230C: .4byte gFormatData_202DE30 -_08072310: .4byte gUnknown_80F9ACC -_08072314: .4byte gUnknown_8107010 -_08072318: .4byte gUnknown_8107018 -_0807231C: .4byte gUnknown_80F9AEC -_08072320: .4byte gUnknown_80F9B10 -_08072324: .4byte gUnknown_80F9B34 -_08072328: .4byte gUnknown_80F9B58 - thumb_func_end sub_807218C - - thumb_func_start LevelDownTarget -LevelDownTarget: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0xC - mov r8, r0 - adds r5, r1, 0 - adds r7, r2, 0 - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _080723B6 - movs r6, 0 - ldr r4, [r5, 0x70] - adds r0, r4, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08072358 - cmp r0, 0x47 - bne _0807235C -_08072358: - movs r0, 0x1 - b _0807235E -_0807235C: - movs r0, 0 -_0807235E: - cmp r0, 0 - bne _0807238C - ldrb r0, [r4, 0x9] - subs r2, r0, r7 - cmp r2, 0 - bgt _0807236C - movs r2, 0x1 -_0807236C: - cmp r2, r0 - beq _0807238C - movs r0, 0x2 - ldrsh r1, [r4, r0] - mov r0, sp - bl GetPokemonLevelData - ldr r0, [sp] - str r0, [r4, 0x18] - mov r0, r8 - adds r1, r5, 0 - bl sub_80725A4 - orrs r6, r0 - lsls r0, r6, 24 - lsrs r6, r0, 24 -_0807238C: - movs r1, 0xFE - lsls r1, 1 - adds r0, r4, r1 - movs r1, 0 - str r1, [r0] - ldr r2, _080723C4 - adds r0, r4, r2 - strb r1, [r0] - cmp r6, 0 - bne _080723B6 - ldr r0, _080723C8 - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _080723CC - ldr r2, [r0] - mov r0, r8 - adds r1, r5, 0 - bl sub_80522F4 -_080723B6: - add sp, 0xC - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080723C4: .4byte 0x00000149 -_080723C8: .4byte gAvailablePokemonNames -_080723CC: .4byte gUnknown_80F9B94 - thumb_func_end LevelDownTarget - - thumb_func_start sub_80723D0 -sub_80723D0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - str r0, [sp, 0xC] - mov r10, r1 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x10] - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0x14] - movs r0, 0 - str r0, [sp, 0x18] - mov r0, r10 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08072422 - mov r1, r10 - ldr r5, [r1, 0x70] - movs r0, 0x2 - ldrsh r3, [r5, r0] - str r3, [sp, 0x1C] - ldr r1, [r5, 0x18] - str r1, [sp, 0x20] - adds r0, r5, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08072418 - cmp r0, 0x47 - bne _0807241C -_08072418: - movs r0, 0x1 - b _0807241E -_0807241C: - movs r0, 0 -_0807241E: - cmp r0, 0 - beq _08072426 -_08072422: - movs r0, 0 - b _08072576 -_08072426: - ldrb r0, [r5, 0x9] - adds r0, 0x1 - mov r8, r0 - mov r9, sp - b _0807255A -_08072430: - mov r3, r8 - strb r3, [r5, 0x9] - ldr r0, [sp, 0x20] - str r0, [r5, 0x18] - ldr r1, [sp, 0x10] - cmp r1, 0 - beq _080724A4 - ldrb r0, [r5, 0x6] - cmp r0, 0 - bne _08072480 - mov r0, r10 - movs r1, 0 - bl sub_806A2BC - ldr r3, [sp, 0x18] - cmp r3, 0 - bne _08072456 - bl sub_8083D58 -_08072456: - ldr r0, _08072474 - mov r1, r8 - str r1, [r0] - ldr r0, _08072478 - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument_2 - ldr r0, _0807247C - ldr r1, [r0] - mov r0, r10 - bl sub_80528F4 - b _080724A4 - .align 2, 0 -_08072474: .4byte gFormatData_202DE30 -_08072478: .4byte gAvailablePokemonNames -_0807247C: .4byte gUnknown_80F9E80 -_08072480: - ldr r3, [sp, 0x18] - cmp r3, 0 - bne _0807248A - bl sub_8083D58 -_0807248A: - ldr r0, _08072588 - mov r1, r8 - str r1, [r0] - ldr r0, _0807258C - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument_2 - ldr r0, _08072590 - ldr r1, [r0] - mov r0, r10 - bl sub_805239C -_080724A4: - movs r3, 0x1 - str r3, [sp, 0x18] - mov r1, r9 - ldrh r0, [r1, 0x4] - ldrh r3, [r5, 0x10] - adds r0, r3 - movs r2, 0 - strh r0, [r5, 0x10] - ldrh r1, [r1, 0x4] - ldrh r3, [r5, 0xE] - adds r1, r3 - strh r1, [r5, 0xE] - lsls r0, 16 - ldr r1, _08072594 - cmp r0, r1 - ble _080724C8 - ldr r0, _08072598 - strh r0, [r5, 0x10] -_080724C8: - movs r0, 0xE - ldrsh r1, [r5, r0] - ldrh r2, [r5, 0x10] - movs r3, 0x10 - ldrsh r0, [r5, r3] - cmp r1, r0 - blt _080724D8 - strh r2, [r5, 0xE] -_080724D8: - ldr r7, _0807259C - ldrb r4, [r5, 0x14] - str r4, [r7] - ldrb r1, [r5, 0x15] - str r1, [r7, 0x4] - ldr r6, _080725A0 - ldrb r2, [r5, 0x16] - str r2, [r6] - ldrb r0, [r5, 0x17] - mov r12, r0 - mov r3, r9 - ldrb r0, [r3, 0x6] - adds r4, r0 - str r4, [r7] - ldrb r0, [r3, 0x7] - adds r1, r0 - str r1, [r7, 0x4] - ldrb r0, [r3, 0x8] - adds r2, r0 - str r2, [r6] - ldrb r0, [r3, 0x9] - mov r1, r12 - adds r3, r1, r0 - str r3, [r6, 0x4] - cmp r4, 0xFE - ble _08072510 - movs r3, 0xFF - str r3, [r7] -_08072510: - ldr r0, [r7, 0x4] - cmp r0, 0xFE - ble _0807251A - movs r0, 0xFF - str r0, [r7, 0x4] -_0807251A: - ldr r0, [r6] - cmp r0, 0xFE - ble _08072524 - movs r1, 0xFF - str r1, [r6] -_08072524: - ldr r0, [r6, 0x4] - cmp r0, 0xFE - ble _0807252E - movs r3, 0xFF - str r3, [r6, 0x4] -_0807252E: - mov r0, r10 - bl LoadIQSkills - mov r0, r10 - bl sub_8079764 - ldr r0, [r7] - strb r0, [r5, 0x14] - ldr r0, [r7, 0x4] - strb r0, [r5, 0x15] - ldr r0, [r6] - strb r0, [r5, 0x16] - ldr r0, [r6, 0x4] - strb r0, [r5, 0x17] - ldr r0, [sp, 0xC] - mov r1, r10 - ldr r2, [sp, 0x10] - ldr r3, [sp, 0x14] - bl sub_8072778 - movs r0, 0x1 - add r8, r0 -_0807255A: - mov r1, r8 - cmp r1, 0x64 - bgt _08072574 - mov r0, sp - ldr r1, [sp, 0x1C] - mov r2, r8 - bl GetPokemonLevelData - ldr r0, [sp] - ldr r3, [sp, 0x20] - cmp r0, r3 - bgt _08072574 - b _08072430 -_08072574: - ldr r0, [sp, 0x18] -_08072576: - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08072588: .4byte gFormatData_202DE30 -_0807258C: .4byte gAvailablePokemonNames -_08072590: .4byte gUnknown_80F9E80 -_08072594: .4byte 0x03e60000 -_08072598: .4byte 0x000003e7 -_0807259C: .4byte gUnknown_202F31C -_080725A0: .4byte gUnknown_202F324 - thumb_func_end sub_80723D0 - - thumb_func_start sub_80725A4 -sub_80725A4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - str r0, [sp, 0xC] - str r1, [sp, 0x10] - adds r0, r1, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _080725C2 - b _0807272E -_080725C2: - ldr r0, [sp, 0x10] - ldr r5, [r0, 0x70] - movs r2, 0x2 - ldrsh r1, [r5, r2] - str r1, [sp, 0x18] - ldr r3, [r5, 0x18] - str r3, [sp, 0x1C] - ldrb r0, [r5, 0x9] - str r0, [sp, 0x20] - adds r0, r5, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _080725E2 - cmp r0, 0x47 - bne _080725E6 -_080725E2: - movs r0, 0x1 - b _080725E8 -_080725E6: - movs r0, 0 -_080725E8: - cmp r0, 0 - beq _080725EE - b _0807272E -_080725EE: - movs r1, 0x1 - mov r8, r1 - b _080725F8 -_080725F4: - movs r2, 0x1 - add r8, r2 -_080725F8: - ldrb r3, [r5, 0x9] - cmp r8, r3 - bge _08072610 - mov r0, sp - ldr r1, [sp, 0x18] - mov r2, r8 - bl GetPokemonLevelData - ldr r0, [sp] - ldr r1, [sp, 0x1C] - cmp r0, r1 - blt _080725F4 -_08072610: - mov r2, r8 - subs r2, 0x1 - str r2, [sp, 0x14] - ldrb r3, [r5, 0x9] - mov r8, r3 - cmp r8, r2 - ble _08072710 - mov r9, sp - movs r0, 0x1 - mov r10, r0 -_08072624: - mov r4, r8 - adds r4, 0x1 - mov r1, r8 - cmp r1, 0x63 - bgt _08072640 - mov r0, sp - ldr r1, [sp, 0x18] - adds r2, r4, 0 - bl GetPokemonLevelData - ldr r0, [sp] - subs r0, 0x1 - str r0, [r5, 0x18] - b _08072644 -_08072640: - ldr r2, [sp, 0x1C] - str r2, [r5, 0x18] -_08072644: - ldr r3, [sp, 0x20] - cmp r3, r8 - ble _08072704 - mov r0, sp - ldr r1, [sp, 0x18] - adds r2, r4, 0 - bl GetPokemonLevelData - mov r0, r8 - strb r0, [r5, 0x9] - ldrh r0, [r5, 0x10] - mov r2, r9 - ldrh r1, [r2, 0x4] - subs r0, r1 - strh r0, [r5, 0x10] - ldrh r0, [r5, 0xE] - ldrh r1, [r2, 0x4] - subs r0, r1 - strh r0, [r5, 0xE] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x1 - bgt _08072676 - mov r3, r10 - strh r3, [r5, 0xE] -_08072676: - movs r1, 0x10 - ldrsh r0, [r5, r1] - cmp r0, 0x1 - bgt _08072682 - mov r2, r10 - strh r2, [r5, 0x10] -_08072682: - movs r3, 0xE - ldrsh r1, [r5, r3] - ldrh r2, [r5, 0x10] - movs r3, 0x10 - ldrsh r0, [r5, r3] - cmp r1, r0 - blt _08072692 - strh r2, [r5, 0xE] -_08072692: - ldr r7, _08072734 - ldrb r4, [r5, 0x14] - str r4, [r7] - ldrb r1, [r5, 0x15] - str r1, [r7, 0x4] - ldr r6, _08072738 - ldrb r2, [r5, 0x16] - str r2, [r6] - ldrb r0, [r5, 0x17] - mov r12, r0 - mov r3, r9 - ldrb r0, [r3, 0x6] - subs r4, r0 - str r4, [r7] - ldrb r0, [r3, 0x7] - subs r1, r0 - str r1, [r7, 0x4] - ldrb r0, [r3, 0x8] - subs r2, r0 - str r2, [r6] - ldrb r0, [r3, 0x9] - mov r1, r12 - subs r3, r1, r0 - str r3, [r6, 0x4] - cmp r4, 0x1 - bgt _080726CA - mov r2, r10 - str r2, [r7] -_080726CA: - ldr r0, [r7, 0x4] - cmp r0, 0x1 - bgt _080726D4 - mov r3, r10 - str r3, [r7, 0x4] -_080726D4: - ldr r0, [r6] - cmp r0, 0x1 - bgt _080726DE - mov r0, r10 - str r0, [r6] -_080726DE: - ldr r0, [r6, 0x4] - cmp r0, 0x1 - bgt _080726E8 - mov r1, r10 - str r1, [r6, 0x4] -_080726E8: - ldr r0, [sp, 0x10] - bl LoadIQSkills - ldr r0, [sp, 0x10] - bl sub_8079764 - ldr r0, [r7] - strb r0, [r5, 0x14] - ldr r0, [r7, 0x4] - strb r0, [r5, 0x15] - ldr r0, [r6] - strb r0, [r5, 0x16] - ldr r0, [r6, 0x4] - strb r0, [r5, 0x17] -_08072704: - movs r2, 0x1 - negs r2, r2 - add r8, r2 - ldr r3, [sp, 0x14] - cmp r8, r3 - bgt _08072624 -_08072710: - ldr r0, _0807273C - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument_2 - ldrb r1, [r5, 0x9] - ldr r0, [sp, 0x20] - cmp r1, r0 - bne _08072744 - ldr r0, _08072740 - ldr r2, [r0] - ldr r0, [sp, 0xC] - ldr r1, [sp, 0x10] - bl sub_80522F4 -_0807272E: - movs r0, 0 - b _08072760 - .align 2, 0 -_08072734: .4byte gUnknown_202F31C -_08072738: .4byte gUnknown_202F324 -_0807273C: .4byte gAvailablePokemonNames -_08072740: .4byte gUnknown_80F9EEC -_08072744: - ldr r0, _08072770 - str r1, [r0] - movs r1, 0xD3 - lsls r1, 1 - ldr r0, [sp, 0x10] - bl sub_80421C0 - ldr r0, _08072774 - ldr r2, [r0] - ldr r0, [sp, 0xC] - ldr r1, [sp, 0x10] - bl sub_80522F4 - movs r0, 0x1 -_08072760: - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08072770: .4byte gFormatData_202DE30 -_08072774: .4byte gUnknown_80F9EC8 - thumb_func_end sub_80725A4 - thumb_func_start sub_8072778 sub_8072778: push {r4-r7,lr} diff --git a/asm/code_8077274.s b/asm/code_8077274.s deleted file mode 100644 index 4b80e0978..000000000 --- a/asm/code_8077274.s +++ /dev/null @@ -1,267 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8078B5C -sub_8078B5C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - mov r9, r0 - adds r6, r1, 0 - mov r10, r2 - str r3, [sp, 0x1C] - ldr r0, [sp, 0x48] - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - adds r0, r6, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _08078B86 - b _08078D78 -_08078B86: - ldr r7, [r6, 0x70] - ldrb r0, [r7, 0x7] - cmp r0, 0 - bne _08078BB8 - adds r0, r6, 0 - movs r1, 0x1B - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _08078BB8 - mov r0, r8 - cmp r0, 0 - bne _08078BA4 - b _08078D78 -_08078BA4: - ldr r0, _08078BB4 - ldr r2, [r0] - mov r0, r9 - adds r1, r6, 0 - bl sub_80522F4 - b _08078D78 - .align 2, 0 -_08078BB4: .4byte gUnknown_80FBEA0 -_08078BB8: - movs r5, 0 - ldr r1, [sp, 0x1C] - cmp r1, 0 - beq _08078BE8 - movs r1, 0x9E - lsls r1, 1 - adds r0, r7, r1 - ldr r0, [r0] - bl FixedPointToInt - adds r4, r0, 0 - movs r1, 0xA0 - lsls r1, 1 - adds r0, r7, r1 - ldr r0, [r0] - bl FixedPointToInt - cmp r4, r0 - blt _08078BE0 - movs r5, 0x1 -_08078BE0: - ldr r0, _08078C8C - cmp r10, r0 - bne _08078BE8 - movs r5, 0x1 -_08078BE8: - cmp r5, 0 - beq _08078CC0 - movs r0, 0xA0 - lsls r0, 1 - adds r5, r7, r0 - ldr r1, [r5] - str r1, [sp, 0x20] - subs r0, 0x4 - adds r0, r7 - mov r10, r0 - ldr r0, [r0] - bl FixedPointToInt - adds r4, r0, 0 - ldr r0, [r5] - bl FixedPointToInt - movs r1, 0 - str r1, [sp, 0x24] - cmp r4, r0 - bne _08078C16 - movs r0, 0x1 - str r0, [sp, 0x24] -_08078C16: - mov r0, sp - ldr r1, [sp, 0x1C] - bl IntToFixedPoint - ldr r2, [sp] - ldr r1, [r5] - add r0, sp, 0x4 - bl FixedPoint_Add - ldr r4, [sp, 0x4] - str r4, [r5] - add r0, sp, 0x8 - movs r1, 0xC8 - bl IntToFixedPoint - ldr r2, [sp, 0x8] - add r0, sp, 0xC - adds r1, r4, 0 - bl FixedPoint_Min - ldr r0, [sp, 0xC] - str r0, [r5] - mov r1, r10 - str r0, [r1] - ldr r0, [sp, 0x24] - cmp r0, 0 - bne _08078C5E - mov r1, r8 - cmp r1, 0 - beq _08078C5E - ldr r0, _08078C90 - ldr r2, [r0] - mov r0, r9 - adds r1, r6, 0 - bl sub_80522F4 -_08078C5E: - ldr r0, [sp, 0x20] - bl FixedPointToInt - adds r4, r0, 0 - movs r1, 0xA0 - lsls r1, 1 - adds r0, r7, r1 - ldr r0, [r0] - bl FixedPointToInt - cmp r4, r0 - bne _08078C9C - ldr r0, _08078C94 - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - mov r0, r8 - cmp r0, 0 - beq _08078D72 - ldr r0, _08078C98 - b _08078D4E - .align 2, 0 -_08078C8C: .4byte 0x000003e7 -_08078C90: .4byte gUnknown_80FBE64 -_08078C94: .4byte gAvailablePokemonNames -_08078C98: .4byte gUnknown_80FBDF0 -_08078C9C: - adds r0, r6, 0 - bl sub_8041DB0 - ldr r0, _08078CB8 - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - mov r1, r8 - cmp r1, 0 - beq _08078D72 - ldr r0, _08078CBC - b _08078D4E - .align 2, 0 -_08078CB8: .4byte gAvailablePokemonNames -_08078CBC: .4byte gUnknown_80FBDC4 -_08078CC0: - movs r0, 0x9E - lsls r0, 1 - adds r5, r7, r0 - ldr r4, [r5] - add r0, sp, 0x10 - mov r1, r10 - bl IntToFixedPoint - ldr r2, [sp, 0x10] - ldr r1, [r5] - add r0, sp, 0x14 - bl FixedPoint_Add - ldr r1, [sp, 0x14] - str r1, [r5] - movs r0, 0xA0 - lsls r0, 1 - adds r7, r0 - ldr r2, [r7] - add r0, sp, 0x18 - bl FixedPoint_Min - ldr r0, [sp, 0x18] - str r0, [r5] - ldr r0, _08078D28 - cmp r10, r0 - bne _08078CFA - ldr r0, [r7] - str r0, [r5] -_08078CFA: - adds r0, r6, 0 - bl nullsub_85 - ldr r0, _08078D2C - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - adds r0, r4, 0 - bl FixedPointToInt - adds r4, r0, 0 - ldr r0, [r5] - bl FixedPointToInt - cmp r4, r0 - bne _08078D34 - mov r1, r8 - cmp r1, 0 - beq _08078D72 - ldr r0, _08078D30 - b _08078D4E - .align 2, 0 -_08078D28: .4byte 0x000003e7 -_08078D2C: .4byte gAvailablePokemonNames -_08078D30: .4byte gUnknown_80FBE14 -_08078D34: - ldr r0, [r5] - bl FixedPointToInt - adds r4, r0, 0 - ldr r0, [r7] - bl FixedPointToInt - cmp r4, r0 - blt _08078D60 - mov r0, r8 - cmp r0, 0 - beq _08078D72 - ldr r0, _08078D5C -_08078D4E: - ldr r2, [r0] - mov r0, r9 - adds r1, r6, 0 - bl sub_80522F4 - b _08078D72 - .align 2, 0 -_08078D5C: .4byte gUnknown_80FBE64 -_08078D60: - mov r1, r8 - cmp r1, 0 - beq _08078D72 - ldr r0, _08078D88 - ldr r2, [r0] - mov r0, r9 - adds r1, r6, 0 - bl sub_80522F4 -_08078D72: - adds r0, r6, 0 - bl EntityUpdateStatusSprites -_08078D78: - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08078D88: .4byte gUnknown_80FBE84 - thumb_func_end sub_8078B5C - - .align 2,0 diff --git a/include/structs/str_pokemon.h b/include/structs/str_pokemon.h index aa01421aa..ec30e81b0 100644 --- a/include/structs/str_pokemon.h +++ b/include/structs/str_pokemon.h @@ -148,8 +148,7 @@ typedef struct MonsterDataEntry typedef struct LevelData { /* 0x0 */ s32 expRequired; - /* 0x4 */ u8 gainHP; - /* 0x5 */ u8 gainUnused; + /* 0x4 */ u16 gainHP; /* 0x6 */ u8 gainAtt; /* 0x7 */ u8 gainSPAtt; /* 0x8 */ u8 gainDef; diff --git a/ld_script.txt b/ld_script.txt index 783e507a0..cad5fe6e7 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -273,7 +273,6 @@ SECTIONS { src/dungeon_ai.o(.text); src/move_effects_target.o(.text); src/status.o(.text); - asm/code_8077274.o(.text); src/code_8077274_1.o(.text); asm/code_8077274_1.o(.text); src/dungeon_ai_movement.o(.text); diff --git a/src/code_80718D8.c b/src/code_80718D8.c index 3b5740b1c..2523fdfe7 100644 --- a/src/code_80718D8.c +++ b/src/code_80718D8.c @@ -1,11 +1,17 @@ #include "global.h" +#include "constants/tactic.h" +#include "dungeon_capabilities.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_leader.h" #include "code_8045A00.h" +#include "code_8077274_1.h" #include "constants/dungeon.h" #include "dungeon_map_access.h" #include "dungeon_random.h" #include "dungeon_util.h" #include "dungeon.h" -#include "structs/str_dungeon.h" +#include "pokemon_3.h" +#include "status_checks_1.h" struct unkStruct_806B7F8 { @@ -18,13 +24,47 @@ struct unkStruct_806B7F8 u8 unk10; }; +EWRAM_DATA s32 gUnknown_202F31C[2] = {0, 0}; +EWRAM_DATA s32 gUnknown_202F324[2] = {0, 0}; + + +extern s32 gFormatData_202DE30[5]; extern u8 gAvailablePokemonNames[]; +extern u8 gFormatItems[]; + extern s16 gUnknown_80F4DA6; extern s16 gUnknown_80F4DA8; extern s16 gUnknown_80F4DAA; extern s16 gUnknown_80F4DAC; -extern u8 *gUnknown_80FED68[]; +extern u8 *gUnknown_80F9ACC[]; +extern u8 *gUnknown_80F9AEC[]; +extern u8 *gUnknown_80F9B10[]; +extern u8 *gUnknown_80F9B34[]; +extern u8 *gUnknown_80F9B58[]; +extern u8 *gUnknown_80F9B74[]; +extern u8 *gUnknown_80F9B94[]; +extern u8 *gUnknown_80F9E64[]; +extern u8 *gUnknown_80F9E80[]; +extern u8 *gUnknown_80F9EC8[]; +extern u8 *gUnknown_80F9EEC[]; +extern u8 *gUnknown_80FCF18[]; +extern u8 *gUnknown_80FED68[]; +extern u8 *gUnknown_80FF730[]; +extern u8 gUnknown_8107010[8]; +extern u8 *gUnknown_8107018[3]; + +extern void sub_80421C0(Entity *pokemon, u16 r1); +void sub_80528F4(Entity *, u8 *); +void sub_8083D58(void); +void sub_8072778(Entity *, Entity *, u8, u8); +bool8 sub_80725A4(Entity *, Entity *); +void GetAvailTacticsforLvl_Bool(u8 *tacticsBuffer, s32 pokeLevel); +bool8 sub_80723D0(Entity *, Entity *, u8, u8); +void sub_807218C(Entity *); +void sub_806A2BC(Entity *, u32); +void sub_806A3D4(u8 *, s32, s32, s32); +extern void PrintFieldMessage(u32, u8 *, u32); extern Entity* sub_806B7F8(struct unkStruct_806B7F8 *, bool8); extern void sub_805239C(struct Entity *r0, const char r1[]); extern void sub_8042920(struct Entity *r0); @@ -32,6 +72,8 @@ extern s16 sub_803D970(u32); extern s32 sub_803DA20(s32 param_1); extern bool8 sub_806AA0C(s32, u32); extern bool8 sub_8083660(struct Position *param_1); +extern void sub_80522F4(Entity *pokemon, Entity *r1, const u8[]); +void GetPokemonLevelData(LevelData* a1, s32 _id, s32 level); // TODO: change to s32 void sub_8071B48(void) { @@ -151,3 +193,692 @@ void sub_8071D4C(Entity *pokemon, Entity *target, s32 exp) } } } + +// https://decomp.me/scratch/Wcmvb - (98.45% matching - Seth) +NAKED +void sub_8071DA4(Entity *entity) +{ + asm_unified( +" push {r4-r7,lr}\n" +" mov r7, r10\n" +" mov r6, r9\n" +" mov r5, r8\n" +" push {r5-r7}\n" +" sub sp, 0xD4\n" +" str r0, [sp, 0xB4]\n" +" ldr r2, _08071E44\n" +" ldr r1, [r2]\n" +" ldrb r0, [r1, 0xD]\n" +" cmp r0, 0\n" +" bne _08071DBE\n" +" b _08071FE2\n" +"_08071DBE:\n" +" movs r0, 0\n" +" strb r0, [r1, 0xD]\n" +" ldr r0, [r2]\n" +" ldrb r0, [r0, 0x10]\n" +" cmp r0, 0\n" +" beq _08071DCC\n" +" b _08071FE2\n" +"_08071DCC:\n" +" ldr r0, [sp, 0xB4]\n" +" bl EntityExists\n" +" lsls r0, 24\n" +" cmp r0, 0\n" +" bne _08071DE2\n" +" mov r0, sp\n" +" bl sub_80457DC\n" +" mov r0, sp\n" +" str r0, [sp, 0xB4]\n" +"_08071DE2:\n" +" movs r4, 0\n" +"_08071DE4:\n" +" movs r5, 0\n" +" ldr r0, _08071E44\n" +" ldr r0, [r0]\n" +" lsls r1, r4, 2\n" +" ldr r2, _08071E48\n" +" adds r0, r2\n" +" adds r0, r1\n" +" ldr r0, [r0]\n" +" mov r8, r0\n" +" movs r0, 0\n" +" str r0, [sp, 0xB8]\n" +" movs r1, 0\n" +" movs r2, 0\n" +" str r1, [sp, 0xBC]\n" +" str r2, [sp, 0xC0]\n" +" movs r0, 0\n" +" movs r1, 0\n" +" str r0, [sp, 0xC4]\n" +" str r1, [sp, 0xC8]\n" +" adds r1, r4, 0x1\n" +" str r1, [sp, 0xCC]\n" +" mov r2, r8\n" +" cmp r2, 0\n" +" bne _08071E16\n" +" b _08071FDA\n" +"_08071E16:\n" +" mov r0, r8\n" +" bl EntityExists\n" +" lsls r0, 24\n" +" cmp r0, 0\n" +" bne _08071E24\n" +" b _08071FDA\n" +"_08071E24:\n" +" mov r0, r8\n" +" ldr r6, [r0, 0x70]\n" +" movs r1, 0xE\n" +" ldrsh r0, [r6, r1]\n" +" cmp r0, 0\n" +" bne _08071E32\n" +" b _08071FDA\n" +"_08071E32:\n" +" adds r1, r6, 0\n" +" adds r1, 0xF9\n" +" ldrb r0, [r1]\n" +" cmp r0, 0\n" +" beq _08071E4C\n" +" add r2, sp, 0xB8\n" +" ldrb r2, [r2]\n" +" strb r2, [r1]\n" +" b _08071FCA\n" +" .align 2, 0\n" +"_08071E44: .4byte gDungeon\n" +"_08071E48: .4byte 0x000135cc\n" +"_08071E4C:\n" +" movs r1, 0xFE\n" +" lsls r1, 1\n" +" adds r0, r6, r1\n" +" ldr r0, [r0]\n" +" mov r10, r0\n" +" cmp r0, 0\n" +" beq _08071EB6\n" +" ldrb r0, [r6, 0x7]\n" +" cmp r0, 0\n" +" beq _08071E68\n" +" ldrb r1, [r6, 0x9]\n" +" add r0, sp, 0x74\n" +" bl GetAvailTacticsforLvl_Bool\n" +"_08071E68:\n" +" movs r0, 0x10\n" +" ldrsh r2, [r6, r0]\n" +" str r2, [sp, 0xB8]\n" +" ldrb r1, [r6, 0x14]\n" +" str r1, [sp, 0xBC]\n" +" ldrb r2, [r6, 0x15]\n" +" str r2, [sp, 0xC0]\n" +" ldrb r0, [r6, 0x16]\n" +" str r0, [sp, 0xC4]\n" +" ldrb r1, [r6, 0x17]\n" +" str r1, [sp, 0xC8]\n" +" ldrb r0, [r6, 0x9]\n" +" cmp r0, 0x64\n" +" beq _08071EB6\n" +" ldr r0, [r6, 0x18]\n" +" add r0, r10\n" +" str r0, [r6, 0x18]\n" +" mov r2, r10\n" +" ldr r0, _08071EE8\n" +" str r2, [r0]\n" +" ldr r0, _08071EEC\n" +" adds r1, r6, 0\n" +" movs r2, 0\n" +" bl SetMessageArgument_2\n" +" ldr r0, _08071EF0\n" +" ldr r2, [r0]\n" +" ldr r0, [sp, 0xB4]\n" +" mov r1, r8\n" +" bl sub_80522F4\n" +" ldr r0, [sp, 0xB4]\n" +" mov r1, r8\n" +" movs r2, 0x1\n" +" movs r3, 0x1\n" +" bl sub_80723D0\n" +" lsls r0, 24\n" +" lsrs r5, r0, 24\n" +"_08071EB6:\n" +" ldr r1, _08071EF4\n" +" adds r0, r6, r1\n" +" ldrb r0, [r0]\n" +" adds r4, 0x1\n" +" str r4, [sp, 0xCC]\n" +" cmp r0, 0\n" +" beq _08071F3A\n" +" movs r2, 0x2\n" +" ldrsh r0, [r6, r2]\n" +" add r1, sp, 0x8C\n" +" movs r2, 0\n" +" movs r3, 0\n" +" bl sub_808E400\n" +" adds r7, r0, 0\n" +" add r0, sp, 0x8C\n" +" mov r9, r0\n" +" cmp r7, 0\n" +" beq _08071F38\n" +" adds r0, r7, 0\n" +" bl DungeonRandInt\n" +" adds r4, r0, 0\n" +" movs r1, 0\n" +" b _08071F02\n" +" .align 2, 0\n" +"_08071EE8: .4byte gFormatData_202DE30\n" +"_08071EEC: .4byte gAvailablePokemonNames\n" +"_08071EF0: .4byte gUnknown_80F9E64\n" +"_08071EF4: .4byte 0x00000149\n" +"_08071EF8:\n" +" adds r4, 0x1\n" +" cmp r4, r7\n" +" blt _08071F00\n" +" movs r4, 0\n" +"_08071F00:\n" +" adds r1, 0x1\n" +"_08071F02:\n" +" cmp r1, r7\n" +" bge _08071F38\n" +" lsls r0, r4, 1\n" +" mov r2, r9\n" +" adds r5, r2, r0\n" +" movs r2, 0\n" +" ldrsh r0, [r5, r2]\n" +" str r1, [sp, 0xD0]\n" +" bl sub_803D930\n" +" lsls r0, 24\n" +" ldr r1, [sp, 0xD0]\n" +" cmp r0, 0\n" +" beq _08071EF8\n" +" movs r2, 0\n" +" ldrsh r0, [r5, r2]\n" +" bl GetSpriteData\n" +" ldr r1, [sp, 0xD0]\n" +" cmp r0, 0\n" +" beq _08071EF8\n" +" movs r0, 0\n" +" ldrsh r2, [r5, r0]\n" +" ldr r0, [sp, 0xB4]\n" +" mov r1, r8\n" +" bl sub_8072B78\n" +"_08071F38:\n" +" movs r5, 0\n" +"_08071F3A:\n" +" cmp r5, 0\n" +" beq _08071F7A\n" +" ldrb r0, [r6, 0x6]\n" +" cmp r0, 0\n" +" bne _08071F7A\n" +" movs r1, 0x10\n" +" ldrsh r0, [r6, r1]\n" +" ldr r2, [sp, 0xB8]\n" +" subs r0, r2\n" +" ldr r1, _08071FF4\n" +" str r0, [r1]\n" +" ldrb r0, [r6, 0x14]\n" +" ldr r2, [sp, 0xBC]\n" +" subs r0, r2\n" +" str r0, [r1, 0x4]\n" +" ldrb r0, [r6, 0x16]\n" +" ldr r1, [sp, 0xC4]\n" +" subs r0, r1\n" +" ldr r2, _08071FF4\n" +" str r0, [r2, 0x8]\n" +" ldrb r0, [r6, 0x15]\n" +" ldr r1, [sp, 0xC0]\n" +" subs r0, r1\n" +" str r0, [r2, 0xC]\n" +" ldrb r0, [r6, 0x17]\n" +" ldr r2, [sp, 0xC8]\n" +" subs r0, r2\n" +" ldr r1, _08071FF4\n" +" str r0, [r1, 0x10]\n" +" mov r0, r8\n" +" bl sub_807218C\n" +"_08071F7A:\n" +" mov r2, r10\n" +" cmp r2, 0\n" +" beq _08071FCA\n" +" ldrb r0, [r6, 0x7]\n" +" cmp r0, 0\n" +" beq _08071FCA\n" +" ldrb r1, [r6, 0x9]\n" +" add r0, sp, 0x80\n" +" bl GetAvailTacticsforLvl_Bool\n" +" movs r4, 0\n" +" add r7, sp, 0x74\n" +" add r5, sp, 0x80\n" +"_08071F94:\n" +" adds r0, r7, r4\n" +" ldrb r0, [r0]\n" +" cmp r0, 0\n" +" bne _08071FC4\n" +" adds r0, r5, r4\n" +" ldrb r0, [r0]\n" +" cmp r0, 0x1\n" +" bne _08071FC4\n" +" ldr r0, _08071FF8\n" +" mov r1, r8\n" +" movs r2, 0\n" +" bl SetMessageArgument\n" +" lsls r1, r4, 24\n" +" lsrs r1, 24\n" +" ldr r0, _08071FFC\n" +" bl CopyTacticsNameToBuffer\n" +" ldr r0, _08072000\n" +" ldr r2, [r0]\n" +" ldr r0, [sp, 0xB4]\n" +" mov r1, r8\n" +" bl sub_80522F4\n" +"_08071FC4:\n" +" adds r4, 0x1\n" +" cmp r4, 0xB\n" +" ble _08071F94\n" +"_08071FCA:\n" +" movs r1, 0xFE\n" +" lsls r1, 1\n" +" adds r0, r6, r1\n" +" movs r1, 0\n" +" str r1, [r0]\n" +" ldr r2, _08072004\n" +" adds r0, r6, r2\n" +" strb r1, [r0]\n" +"_08071FDA:\n" +" ldr r4, [sp, 0xCC]\n" +" cmp r4, 0x13\n" +" bgt _08071FE2\n" +" b _08071DE4\n" +"_08071FE2:\n" +" add sp, 0xD4\n" +" pop {r3-r5}\n" +" mov r8, r3\n" +" mov r9, r4\n" +" mov r10, r5\n" +" pop {r4-r7}\n" +" pop {r0}\n" +" bx r0\n" +" .align 2, 0\n" +"_08071FF4: .4byte gFormatData_202DE30\n" +"_08071FF8: .4byte gAvailablePokemonNames\n" +"_08071FFC: .4byte gFormatItems\n" +"_08072000: .4byte gUnknown_80FF730\n" +"_08072004: .4byte 0x00000149"); +} + +void sub_8072008(Entity *pokemon, Entity *target, s32 level, u8 param_4, u8 param_5) +{ + bool8 flag; + s32 newLevel; + EntityInfo *info; + s32 tacticIndex; + LevelData leveldata; + u8 tacticsBuffer1 [NUM_TACTICS]; + u8 tacticsBuffer2 [NUM_TACTICS]; + s32 maxHP; + u32 atk[2]; + u32 def[2]; + + if (EntityExists(target)) { + flag = 0; + info = target->info; + if (info->isTeamLeader) { + GetAvailTacticsforLvl_Bool(tacticsBuffer1,info->level); + } + maxHP = info->maxHPStat; + atk[0] = info->atk; + atk[1] = info->spAtk; + def[0] = info->def; + def[1] = info->spDef; + if (!IsClientOrTeamBase(info->joinedAt.joinedAt)) { + newLevel = info->level + level; + if (99 < newLevel) { + newLevel = 100; + } + if (newLevel != info->level) { + GetPokemonLevelData(&leveldata,info->id,newLevel); + info->exp = leveldata.expRequired; + flag |= (sub_80723D0(pokemon,target,param_4,param_5)); + if ((flag != 0) && (!info->isNotTeamMember)) { + gFormatData_202DE30[0] = info->maxHPStat - maxHP; + gFormatData_202DE30[1] = info->atk - atk[0]; + gFormatData_202DE30[2] = info->def - def[0]; + gFormatData_202DE30[3] = info->spAtk - atk[1]; + gFormatData_202DE30[4] = info->spDef - def[1]; + if (param_4 != 0) { + sub_807218C(target); + } + } + } + } + if (info->isTeamLeader) { + GetAvailTacticsforLvl_Bool(tacticsBuffer2,info->level); + for(tacticIndex = 0; tacticIndex < NUM_TACTICS; tacticIndex++) + { + if ((tacticsBuffer1[tacticIndex] == 0) && (tacticsBuffer2[tacticIndex] == 1)) { + SetMessageArgument(gAvailablePokemonNames,target,0); + CopyTacticsNameToBuffer(gFormatItems,tacticIndex); + sub_80522F4(pokemon,target,*gUnknown_80FF730); + } + } + } + info->expGainedInTurn = 0; + info->unk149 = 0; + if ((flag == 0) && (param_4 != 0)) { + SetMessageArgument(gAvailablePokemonNames,target,0); + sub_80522F4(pokemon,target,*gUnknown_80F9B74); + } + } +} + +void sub_807218C(Entity *pokemon) +{ + EntityInfo *info; + u8 buffer [400]; + s32 r1; + s32 r6; + s32 r3; + + r6 = 0; + info = pokemon->info; + + sub_806A2BC(pokemon, 0); + SetMessageArgument_2(gAvailablePokemonNames, info, 0); + if(sub_8070BC0(pokemon)) + { + r3 = 0; + r1 = info->id; + if(info->joinedAt.joinedAt == DUNGEON_JOIN_LOCATION_CLIENT_POKEMON) + { + r1 = 0x1A4; + } + else if(info->joinedAt.joinedAt == DUNGEON_RESCUE_TEAM_BASE) + { + r1 = 0x1A5; + } + else if(info->joinedAt.joinedAt == DUNGEON_JOIN_LOCATION_PARTNER) + { + if(gDungeon->unk65C == 0) + r3 = 1; + } + sub_806A3D4(buffer, r1, 3, r3); + } + else + { + strcpy(buffer, *gUnknown_80FCF18); + } + PrintFieldMessage(0, buffer, 1); + buffer[0] = 0; + + + if(gFormatData_202DE30[0]> 0) + { + strcat(buffer, *gUnknown_80F9ACC); + r6++; + } + + if(gFormatData_202DE30[1]> 0) + { + if(gUnknown_8107010[r6] != 0) + strcat(buffer, gUnknown_8107018[gUnknown_8107010[r6]]); + strcat(buffer, *gUnknown_80F9AEC); + r6++; + } + if(gFormatData_202DE30[2]> 0) + { + if(gUnknown_8107010[r6] != 0) + strcat(buffer, gUnknown_8107018[gUnknown_8107010[r6]]); + strcat(buffer, *gUnknown_80F9B10); + r6++; + } + if(gFormatData_202DE30[3]> 0) + { + if(gUnknown_8107010[r6] != 0) + strcat(buffer, gUnknown_8107018[gUnknown_8107010[r6]]); + strcat(buffer, *gUnknown_80F9B34); + r6++; + } + if(gFormatData_202DE30[4]> 0) + { + if(gUnknown_8107010[r6] != 0) + strcat(buffer, gUnknown_8107018[gUnknown_8107010[r6]]); + strcat(buffer, *gUnknown_80F9B58); + } + + if(buffer[0]) + PrintFieldMessage(0, buffer, 1); + + sub_806A2BC(GetLeader(), 0); +} + +void LevelDownTarget(Entity *pokemon, Entity *target, u32 level) +{ + EntityInfo *info; + u8 flag; + s32 newLevel; + LevelData leveldata; + + if(EntityExists(target)) + { + flag = FALSE; + info = target->info; + if(!IsClientOrTeamBase(info->joinedAt.joinedAt)) + { + newLevel = info->level - level; + if(newLevel <= 0) + newLevel = 1; + + if(newLevel != info->level) + { + GetPokemonLevelData(&leveldata, info->id, newLevel); + info->exp = leveldata.expRequired; + flag |= sub_80725A4(pokemon, target); + } + } + info->expGainedInTurn = 0; + info->unk149 = 0; + + if(!flag) + { + SetMessageArgument(gAvailablePokemonNames, target, 0); + sub_80522F4(pokemon, target, *gUnknown_80F9B94); + } + } +} + +bool8 sub_80723D0(Entity *pokemon, Entity *target, u8 param_3, u8 param_4) +{ + EntityInfo *info; + LevelData leveldata; + bool8 flag = FALSE; + s32 id; + s32 level; + s32 exp; + + if(!EntityExists(target)) return FALSE; + info = target->info; + id = info->id; + exp = info->exp; + + + if(IsClientOrTeamBase(info->joinedAt.joinedAt)) + return FALSE; + + for(level = info->level + 1; level <= 100; level++) + { + GetPokemonLevelData(&leveldata, id, level); + if(leveldata.expRequired > exp) break; + + info->level = level; + info->exp = exp; + + if(param_3) + { + if(!info->isNotTeamMember) + { + sub_806A2BC(target, 0); + if(!flag) + sub_8083D58(); + gFormatData_202DE30[0] = level; + + SetMessageArgument_2(gAvailablePokemonNames, info, 0); + sub_80528F4(target, *gUnknown_80F9E80); + } + else + { + if(!flag) + sub_8083D58(); + gFormatData_202DE30[0] = level; + SetMessageArgument_2(gAvailablePokemonNames, info, 0); + sub_805239C(target, *gUnknown_80F9E80); + } + } + flag = TRUE; + + info->maxHPStat += leveldata.gainHP; + info->HP += leveldata.gainHP; + + if(info->maxHPStat > 0x3E6) + info->maxHPStat = 0x3E7; + + if(info->HP >= info->maxHPStat) + { + info->HP = info->maxHPStat; + } + + gUnknown_202F31C[0] = info->atk; + gUnknown_202F31C[1] = info->spAtk; + gUnknown_202F324[0] = info->def; + gUnknown_202F324[1] = info->spDef; + + gUnknown_202F31C[0] += leveldata.gainAtt; + gUnknown_202F31C[1] += leveldata.gainSPAtt; + gUnknown_202F324[0] += leveldata.gainDef; + gUnknown_202F324[1] += leveldata.gainSPDef; + + if(gUnknown_202F31C[0] > 0xFE) + gUnknown_202F31C[0] = 0xFF; + if(gUnknown_202F31C[1] > 0xFE) + gUnknown_202F31C[1] = 0xFF; + if(gUnknown_202F324[0] > 0xFE) + gUnknown_202F324[0] = 0xFF; + if(gUnknown_202F324[1] > 0xFE) + gUnknown_202F324[1] = 0xFF; + + + LoadIQSkills(target); + sub_8079764(target); + + info->atk = gUnknown_202F31C[0]; + info->spAtk = gUnknown_202F31C[1]; + info->def = gUnknown_202F324[0]; + info->spDef = gUnknown_202F324[1]; + + sub_8072778(pokemon, target, param_3, param_4); + } + + return flag; +} + +bool8 sub_80725A4(Entity *pokemon, Entity *target) +{ + EntityInfo *info; + LevelData leveldata; + s32 level; + s32 levelMax; + s32 id; + s32 exp; + s32 oldLevel; + + + if(!EntityExists(target)) return FALSE; + info = target->info; + id = info->id; + exp = info->exp; + oldLevel = info->level; + + + if(IsClientOrTeamBase(info->joinedAt.joinedAt)) return FALSE; + + for(level = 1; level < info->level; level++) + { + GetPokemonLevelData(&leveldata, id, level); + if(leveldata.expRequired >= exp) break; + } + + levelMax = level - 1; + + for(level = info->level; level > levelMax; level--) + { + if(level < 100) + { + GetPokemonLevelData(&leveldata, id, level + 1); + info->exp = leveldata.expRequired - 1; + } + else + { + info->exp = exp; + } + + if(oldLevel > level) + { + GetPokemonLevelData(&leveldata, id, level + 1); + + info->level = level; + + info->maxHPStat -= leveldata.gainHP; + info->HP -= leveldata.gainHP; + + if(info->HP <= 1) + info->HP = 1; + + if(info->maxHPStat <= 1) + info->maxHPStat = 1; + + if(info->HP >= info->maxHPStat) + { + info->HP = info->maxHPStat; + } + + gUnknown_202F31C[0] = info->atk; + gUnknown_202F31C[1] = info->spAtk; + gUnknown_202F324[0] = info->def; + gUnknown_202F324[1] = info->spDef; + + gUnknown_202F31C[0] -= leveldata.gainAtt; + gUnknown_202F31C[1] -= leveldata.gainSPAtt; + gUnknown_202F324[0] -= leveldata.gainDef; + gUnknown_202F324[1] -= leveldata.gainSPDef; + + if(gUnknown_202F31C[0] <= 1) + gUnknown_202F31C[0] = 1; + if(gUnknown_202F31C[1] <= 1) + gUnknown_202F31C[1] = 1; + if(gUnknown_202F324[0] <= 1) + gUnknown_202F324[0] = 1; + if(gUnknown_202F324[1] <= 1) + gUnknown_202F324[1] = 1; + + + LoadIQSkills(target); + sub_8079764(target); + + info->atk = gUnknown_202F31C[0]; + info->spAtk = gUnknown_202F31C[1]; + info->def = gUnknown_202F324[0]; + info->spDef = gUnknown_202F324[1]; + } + } + + + SetMessageArgument_2(gAvailablePokemonNames, info, 0); + + if(info->level != oldLevel) + { + gFormatData_202DE30[0] = info->level; + sub_80421C0(target, 0xD3 << 1); + sub_80522F4(pokemon, target, *gUnknown_80F9EC8); // $m0 dropped to Level $d0! + return TRUE; + } + else + { + sub_80522F4(pokemon, target, *gUnknown_80F9EEC); // $m0's level didn't drop! + return FALSE; + } +} diff --git a/src/status.c b/src/status.c index 4be7b775d..4d343e9d4 100644 --- a/src/status.c +++ b/src/status.c @@ -129,6 +129,12 @@ extern u8 *gUnknown_80FBBD4[]; extern u8 *gUnknown_80FBBB8[]; extern u8 *gUnknown_80FBB94[]; extern s16 gUnknown_80F4EF4[]; +extern u8 *gUnknown_80FBE84[]; +extern u8 *gUnknown_80FBEA0[]; +extern u8 *gUnknown_80FBE64[]; +extern u8 *gUnknown_80FBDF0[]; +extern u8 *gUnknown_80FBDC4[]; +extern u8 *gUnknown_80FBE14[]; extern s32 gFormatData_202DE30[10]; @@ -152,11 +158,12 @@ extern void nullsub_81(Entity *); extern void nullsub_82(Entity *); extern void nullsub_83(Entity *); extern void nullsub_84(Entity *); - -extern void sub_8041D9C(Entity *); +extern void nullsub_85(Entity *); extern void sub_803F580(u32); extern void sub_8040A84(void); +extern void sub_8041D9C(Entity *); +extern void sub_8041DB0(Entity *pokemon); extern void sub_8041CA8(Entity *); extern void sub_8041C94(Entity *); extern bool8 sub_8045888(Entity *r0); @@ -1275,3 +1282,91 @@ void sub_8078A58(struct Entity *pokemon, struct Entity *target, s32 param_3, s32 EntityUpdateStatusSprites(target); } + +void sub_8078B5C(Entity *pokemon, Entity *target, u32 param_3, s32 param_4, bool8 displayMessage) +{ + bool8 bVar1; + FixedPoint uVar7; + FixedPoint *bellyPtr; + EntityInfo *targetInfo; + FixedPoint *puVar8; + FixedPoint sp_0x0; + FixedPoint sp_0x4; + FixedPoint sp_0x8; + FixedPoint sp_0x10; + FixedPoint sp_0x14; + FixedPoint sp_0x18; + FixedPoint sp_0x20; + u32 sp_0x24; + + if (!EntityExists(target)) { + return; + } + targetInfo = target->info; + if ((!targetInfo->isTeamLeader) && (HasHeldItem(target,0x1b))) { + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBEA0); + return; + } + bVar1 = FALSE; + if (param_4 != 0) { + if(FixedPointToInt(targetInfo->belly) >= FixedPointToInt(targetInfo->maxBelly)) + { + bVar1 = TRUE; + } + if (param_3 == 999) + { + bVar1 = TRUE; + } + } + if (bVar1) { + bellyPtr = &targetInfo->maxBelly; + sp_0x20 = *bellyPtr; + sp_0x24 = (FixedPointToInt(targetInfo->belly) == FixedPointToInt(*bellyPtr)); + sp_0x0 = IntToFixedPoint(param_4); + sp_0x4 = FixedPoint_Add(*bellyPtr,sp_0x0); + *bellyPtr = sp_0x4; + sp_0x8 = IntToFixedPoint(200); + *bellyPtr = FixedPoint_Min(sp_0x4,sp_0x8); + targetInfo->belly = *bellyPtr; + if ((sp_0x24 == 0) && (displayMessage)) { + sub_80522F4(pokemon,target,*gUnknown_80FBE64); + } + if (FixedPointToInt(sp_0x20) == FixedPointToInt(targetInfo->maxBelly)) { + SetMessageArgument(gAvailablePokemonNames,target,0); + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBDF0); + } + else { + sub_8041DB0(target); + SetMessageArgument(gAvailablePokemonNames,target,0); + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBDC4); + } + } + else { + bellyPtr = &targetInfo->belly; + uVar7 = *bellyPtr; + sp_0x10 = IntToFixedPoint(param_3); + sp_0x14 = FixedPoint_Add(*bellyPtr,sp_0x10); + *bellyPtr = sp_0x14; + puVar8 = &targetInfo->maxBelly; + sp_0x18 = FixedPoint_Min(sp_0x14,*puVar8); + *bellyPtr = sp_0x18; + if (param_3 == 999) { + *bellyPtr = *puVar8; + } + nullsub_85(target); + SetMessageArgument(gAvailablePokemonNames,target,0); + if (FixedPointToInt(uVar7) == FixedPointToInt(*bellyPtr)) { + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE14); + } + else { + if (FixedPointToInt(*bellyPtr) >= FixedPointToInt(*puVar8)) { + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE64); + } + else + { + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE84); + } + } + } + EntityUpdateStatusSprites(target); +} diff --git a/sym_ewram.txt b/sym_ewram.txt index b80e32636..d17364d46 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -488,11 +488,7 @@ gUnknown_202F310: /* 202F310 (sub_8067A80 - sub_8068310) */ .space 0x4 .include "src/dungeon_movement.o" - -gUnknown_202F31C: /* 202F31C (sub_80723D0 - sub_80725A4) */ - .space 0x8 -gUnknown_202F324: /* 202F324 (sub_80723D0 - sub_80725A4) */ - .space 0x8 + .include "src/code_80718D8.o" gUnknown_202F32C: /* 202F32C (xxx_dungeon_8042F6C - sub_8072CF4) */ .space 0x1 From 614a8ed0ebb16858cee4fe0400599aeaeddadf0e Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 29 Sep 2024 15:59:35 -0700 Subject: [PATCH 14/18] document parameters of func --- src/status.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/status.c b/src/status.c index 4d343e9d4..e1924e11e 100644 --- a/src/status.c +++ b/src/status.c @@ -1283,10 +1283,10 @@ void sub_8078A58(struct Entity *pokemon, struct Entity *target, s32 param_3, s32 EntityUpdateStatusSprites(target); } -void sub_8078B5C(Entity *pokemon, Entity *target, u32 param_3, s32 param_4, bool8 displayMessage) +void sub_8078B5C(Entity *pokemon, Entity *target, u32 bellyIncrement, s32 maxBellyIncrement, bool8 displayMessage) { - bool8 bVar1; - FixedPoint uVar7; + bool8 bellySizeIncreased; + FixedPoint oldBelly; FixedPoint *bellyPtr; EntityInfo *targetInfo; FixedPoint *puVar8; @@ -1297,7 +1297,7 @@ void sub_8078B5C(Entity *pokemon, Entity *target, u32 param_3, s32 param_4, bool FixedPoint sp_0x14; FixedPoint sp_0x18; FixedPoint sp_0x20; - u32 sp_0x24; + bool32 bellySame; if (!EntityExists(target)) { return; @@ -1307,64 +1307,64 @@ void sub_8078B5C(Entity *pokemon, Entity *target, u32 param_3, s32 param_4, bool if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBEA0); return; } - bVar1 = FALSE; - if (param_4 != 0) { + bellySizeIncreased = FALSE; + if (maxBellyIncrement != 0) { if(FixedPointToInt(targetInfo->belly) >= FixedPointToInt(targetInfo->maxBelly)) { - bVar1 = TRUE; + bellySizeIncreased = TRUE; } - if (param_3 == 999) + if (bellyIncrement == 999) { - bVar1 = TRUE; + bellySizeIncreased = TRUE; } } - if (bVar1) { + if (bellySizeIncreased) { bellyPtr = &targetInfo->maxBelly; sp_0x20 = *bellyPtr; - sp_0x24 = (FixedPointToInt(targetInfo->belly) == FixedPointToInt(*bellyPtr)); - sp_0x0 = IntToFixedPoint(param_4); + bellySame = (FixedPointToInt(targetInfo->belly) == FixedPointToInt(*bellyPtr)); + sp_0x0 = IntToFixedPoint(maxBellyIncrement); sp_0x4 = FixedPoint_Add(*bellyPtr,sp_0x0); *bellyPtr = sp_0x4; sp_0x8 = IntToFixedPoint(200); *bellyPtr = FixedPoint_Min(sp_0x4,sp_0x8); targetInfo->belly = *bellyPtr; - if ((sp_0x24 == 0) && (displayMessage)) { - sub_80522F4(pokemon,target,*gUnknown_80FBE64); + if ((!bellySame) && (displayMessage)) { + sub_80522F4(pokemon,target,*gUnknown_80FBE64); // $m0's belly filled up full! } if (FixedPointToInt(sp_0x20) == FixedPointToInt(targetInfo->maxBelly)) { SetMessageArgument(gAvailablePokemonNames,target,0); - if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBDF0); + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBDF0); // $m0's belly won't get any bigger! } else { sub_8041DB0(target); SetMessageArgument(gAvailablePokemonNames,target,0); - if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBDC4); + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBDC4); // m0's max belly size increased! } } else { bellyPtr = &targetInfo->belly; - uVar7 = *bellyPtr; - sp_0x10 = IntToFixedPoint(param_3); + oldBelly = *bellyPtr; + sp_0x10 = IntToFixedPoint(bellyIncrement); sp_0x14 = FixedPoint_Add(*bellyPtr,sp_0x10); *bellyPtr = sp_0x14; puVar8 = &targetInfo->maxBelly; sp_0x18 = FixedPoint_Min(sp_0x14,*puVar8); *bellyPtr = sp_0x18; - if (param_3 == 999) { + if (bellyIncrement == 999) { *bellyPtr = *puVar8; } nullsub_85(target); SetMessageArgument(gAvailablePokemonNames,target,0); - if (FixedPointToInt(uVar7) == FixedPointToInt(*bellyPtr)) { - if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE14); + if (FixedPointToInt(oldBelly) == FixedPointToInt(*bellyPtr)) { + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE14); // $m0's belly didn't change! } else { if (FixedPointToInt(*bellyPtr) >= FixedPointToInt(*puVar8)) { - if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE64); + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE64); // $m0's belly filled up full! } else - { - if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE84); + { + if (displayMessage) sub_80522F4(pokemon,target,*gUnknown_80FBE84); // $m0's belly was filled! } } } From 639bd7a26a7e6dab0771c66d30fa72dc3053192b Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 2 Oct 2024 07:42:51 -0700 Subject: [PATCH 15/18] address most of the review comments --- include/kecleon_bros1.h | 26 +++++++++++++++++--------- src/code_806FDF4.c | 14 +++++++------- src/code_80718D8.c | 24 ++++++++++++------------ src/thank_you_wonder_mail.c | 8 ++++---- 4 files changed, 40 insertions(+), 32 deletions(-) diff --git a/include/kecleon_bros1.h b/include/kecleon_bros1.h index be7830a92..399ae7b7a 100644 --- a/include/kecleon_bros1.h +++ b/include/kecleon_bros1.h @@ -11,25 +11,33 @@ enum KecleonStoreStates KECLEON_STORE_INIT = 0, KECLEON_STORE_MAIN_MENU, KECLEON_STORE_INFO, - // 3 - KECLEON_STORE_EXIT = 4, + KECLEON_STORE_UNK3, + KECLEON_STORE_EXIT, KECLEON_STORE_NO_STORE_ITEMS, KECLEON_STORE_NO_MONEY, KECLEON_STORE_TOO_MUCH_MONEY, KECLEON_STORE_NO_ITEMS_TO_SELL, KECLEON_STORE_NO_ITEMS, KECLEON_STORE_TOO_MANY_ITEMS, - // 11 - KECLEON_STORE_NOT_ENOUGH_MONEY = 12, + KECLEON_STORE_UNK11, + KECLEON_STORE_NOT_ENOUGH_MONEY, KECLEON_STORE_CANT_SELL_ITEM, KECLEON_STORE_SELL_ITEM_TOO_MUCH_MONEY, - KECLEON_STORE_BUY_ITEM_MENU = 16, + KECLEON_STORE_UNK15, + KECLEON_STORE_BUY_ITEM_MENU, KECLEON_STORE_BUY_ITEM_RECEIPT, - KECLEON_STORE_BUY_ITEM_INFO = 21, + KECLEON_STORE_UNK18, + KECLEON_STORE_UNK19, + KECLEON_STORE_UNK20, + KECLEON_STORE_BUY_ITEM_INFO, KECLEON_STORE_BUY_ITEM, - KECLEON_STORE_SELL_ITEM_MENU = 24, - KECLEON_STORE_SELL_ITEM_RECEIPT = 25, - KECLEON_STORE_SELL_ITEM_INFO = 29, + KECLEON_STORE_UNK23, + KECLEON_STORE_SELL_ITEM_MENU, + KECLEON_STORE_SELL_ITEM_RECEIPT, + KECLEON_STORE_UNK26, + KECLEON_STORE_UNK27, + KECLEON_STORE_UNK28, + KECLEON_STORE_SELL_ITEM_INFO, KECLEON_STORE_SELL_ITEM, KECLEON_STORE_SELL_ALL_ITEMS, KECLEON_STORE_SELL_ALL_ITEMS_RECEIPT, diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index e0c466bd6..2818e7588 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -62,17 +62,17 @@ void SetShopkeeperAggression(Entity *pokemon, Entity *target) info = GetEntInfo(target); - if(info->shopkeeper != 0) + if(info->shopkeeper != SHOPKEEPER_MODE_NORMAL) { if(GetEntityType(pokemon) == ENTITY_MONSTER) { if(pokemon->info->isNotTeamMember) { - info->shopkeeper = 2; + info->shopkeeper = SHOPKEEPER_MODE_ATTACK_ENEMIES; } else { - info->shopkeeper = 3; + info->shopkeeper = SHOPKEEPER_MODE_ATTACK_TEAM; } } } @@ -84,15 +84,15 @@ void sub_806F480(Entity *pokemon, u8 r1) info = GetEntInfo(pokemon); - if(info->shopkeeper != 0) + if(info->shopkeeper != SHOPKEEPER_MODE_NORMAL) { if(r1) { - info->shopkeeper = 2; + info->shopkeeper = SHOPKEEPER_MODE_ATTACK_ENEMIES; } else { - info->shopkeeper = 3; + info->shopkeeper = SHOPKEEPER_MODE_ATTACK_TEAM; } } } @@ -254,7 +254,7 @@ bool8 sub_806F660(Entity *pokemon,Entity *target) iVar4 = DungeonRandInt(1000); recruitRate = GetRecruitRate(targetInfo->id); if (recruitRate != -999) { - if (HasHeldItem(pokemon,0x2e)) { // FRIEND_BOW + if (HasHeldItem(pokemon, ITEM_FRIEND_BOW)) { // FRIEND_BOW recruitRate += gUnknown_80F5008; } recruitRate += gUnknown_80F5700[pokemonInfo->level]; diff --git a/src/code_80718D8.c b/src/code_80718D8.c index 2523fdfe7..8f18b086b 100644 --- a/src/code_80718D8.c +++ b/src/code_80718D8.c @@ -287,7 +287,7 @@ void sub_8071DA4(Entity *entity) "_08071E44: .4byte gDungeon\n" "_08071E48: .4byte 0x000135cc\n" "_08071E4C:\n" -" movs r1, 0xFE\n" +" movs r1, 254\n" " lsls r1, 1\n" " adds r0, r6, r1\n" " ldr r0, [r0]\n" @@ -472,7 +472,7 @@ void sub_8071DA4(Entity *entity) " cmp r4, 0xB\n" " ble _08071F94\n" "_08071FCA:\n" -" movs r1, 0xFE\n" +" movs r1, 254\n" " lsls r1, 1\n" " adds r0, r6, r1\n" " movs r1, 0\n" @@ -734,8 +734,8 @@ bool8 sub_80723D0(Entity *pokemon, Entity *target, u8 param_3, u8 param_4) info->maxHPStat += leveldata.gainHP; info->HP += leveldata.gainHP; - if(info->maxHPStat > 0x3E6) - info->maxHPStat = 0x3E7; + if(info->maxHPStat > 998) + info->maxHPStat = 999; if(info->HP >= info->maxHPStat) { @@ -752,14 +752,14 @@ bool8 sub_80723D0(Entity *pokemon, Entity *target, u8 param_3, u8 param_4) gUnknown_202F324[0] += leveldata.gainDef; gUnknown_202F324[1] += leveldata.gainSPDef; - if(gUnknown_202F31C[0] > 0xFE) - gUnknown_202F31C[0] = 0xFF; - if(gUnknown_202F31C[1] > 0xFE) - gUnknown_202F31C[1] = 0xFF; - if(gUnknown_202F324[0] > 0xFE) - gUnknown_202F324[0] = 0xFF; - if(gUnknown_202F324[1] > 0xFE) - gUnknown_202F324[1] = 0xFF; + if(gUnknown_202F31C[0] > 254) + gUnknown_202F31C[0] = 255; + if(gUnknown_202F31C[1] > 254) + gUnknown_202F31C[1] = 255; + if(gUnknown_202F324[0] > 254) + gUnknown_202F324[0] = 255; + if(gUnknown_202F324[1] > 254) + gUnknown_202F324[1] = 255; LoadIQSkills(target); diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 9674d84f9..27b4fcd03 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -60,9 +60,9 @@ enum menuActions { CANCEL_ACTION, SEND_THANK_YOU_MAIL_ACTION, GET_THANK_YOU_MAIL_ACTION, - // 3 - GAME_LINK + GAME_LINK_ACTION, // 4 - ??? - // 5 - PASSWORD + PASSWORD_ACTION = 5, YES_ACTION = 0x7, NO_ACTION, SEND_ITEM_ACTION, @@ -132,8 +132,8 @@ const MenuItem gThankYouMailMainMenuItems[4] = const MenuItem gUnknown_80DEE08[4] = { - {"Game Link cable", WONDER_MAIL_GAME_LINK}, - {"Password", WONDER_MAIL_PASSWORD}, + {"Game Link cable", GAME_LINK_ACTION}, + {"Password", PASSWORD_ACTION}, {"Cancel", CANCEL_ACTION}, {NULL, CANCEL_ACTION}, }; From 15362a977274a8c2a953eae281d53bca57ff70cd Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 4 Oct 2024 08:43:51 -0700 Subject: [PATCH 16/18] address more review comments --- include/code_8069D4C.h | 12 +++++++++--- src/code_8069D4C.c | 8 ++++---- src/code_806FDF4.c | 30 +++++++++++++++--------------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/include/code_8069D4C.h b/include/code_8069D4C.h index a2872dd70..d42f3c05e 100644 --- a/include/code_8069D4C.h +++ b/include/code_8069D4C.h @@ -1,14 +1,20 @@ #ifndef GUARD_CODE_8069D4C_H #define GUARD_CODE_8069D4C_H +// NOTE: basically Offense struct but packed to match +struct unkStruct_8069D4C_sub +{ + + u8 att[2]; // Atk, SpAtk + u8 def[2]; // Def, SpDef +} __attribute__((packed)); + struct unkStruct_8069D4C { s16 id; Position pos; s16 HP; - // NOTE: cannot re-use offense struct as it pads. - u8 att[2]; // Atk, SpAtk - u8 def[2]; // Def, SpDef + struct unkStruct_8069D4C_sub offense; u16 level; u32 exp; FixedPoint belly; diff --git a/src/code_8069D4C.c b/src/code_8069D4C.c index d72280641..528823965 100644 --- a/src/code_8069D4C.c +++ b/src/code_8069D4C.c @@ -33,10 +33,10 @@ void sub_8069D4C(struct unkStruct_8069D4C *r0, Entity *target) GetPokemonLevelData(&leveldata, info->id, info->level); r0->exp = leveldata.expRequired; - r0->att[0] = info->atk; - r0->att[1] = info->spAtk; - r0->def[0] = info->def; - r0->def[1] = info->spDef; + r0->offense.att[0] = info->atk; + r0->offense.att[1] = info->spAtk; + r0->offense.def[0] = info->def; + r0->offense.def[1] = info->spDef; r0->heldItem = info->heldItem; memcpy(r0->moves.moves, info->moves.moves, sizeof(r0->moves)); r0->belly = info->belly; diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index 2818e7588..90b948bf8 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -226,17 +226,17 @@ bool8 sub_806F660(Entity *pokemon,Entity *target) { if ((( (2 < (u16)(targetInfo->id - 0x90)) && - (targetInfo->id != 0x10d) && - (targetInfo->id != 0x10c) && - (targetInfo->id != 0x10e) && - (targetInfo->id != 0x198) && - (targetInfo->id != 0x199) && - (targetInfo->id != 0x19d) && - (targetInfo->id != 0x19c) && - (targetInfo->id != 0x19e) && - (targetInfo->id != 0x195) && - (targetInfo->id != 0x196) && - (targetInfo->id != 0x197)) || (HasRecruitedMon(targetInfo->id) == 0)) && + (targetInfo->id != MONSTER_RAIKOU) && + (targetInfo->id != MONSTER_ENTEI) && + (targetInfo->id != MONSTER_SUICUNE) && + (targetInfo->id != MONSTER_LATIAS) && + (targetInfo->id != MONSTER_LATIOS) && + (targetInfo->id != MONSTER_JIRACHI) && + (targetInfo->id != MONSTER_RAYQUAZA) && + (targetInfo->id != MONSTER_DEOXYS_NORMAL) && + (targetInfo->id != 0MONSTER_REGIROCK && + (targetInfo->id != MONSTER_REGICE) && + (targetInfo->id != MONSTER_REGISTEEL)) || (HasRecruitedMon(targetInfo->id) == 0)) && (sub_806F9BC(targetInfo->id) != 0)) { iVar5 = (pokemon->pos).x - (target->pos).x; if (iVar5 < 0) { @@ -792,8 +792,8 @@ bool8 sub_806FA5C(Entity *entity1, Entity *entity2, struct unkStruct_8069D4C *pa for(iVar2 = 0; iVar2 < 2; iVar2++) { - pokeStruct2->offense.att[iVar2] = param_3->att[iVar2]; - pokeStruct2->offense.def[iVar2] = param_3->def[iVar2]; + pokeStruct2->offense.att[iVar2] = param_3->offense.att[iVar2]; + pokeStruct2->offense.def[iVar2] = param_3->offense.def[iVar2]; } pokeStruct2->currExp = param_3->exp; @@ -1052,8 +1052,8 @@ bool8 sub_806FDF4(Entity *entity1,Entity *entity2,Entity **entityPtr) for(index2 = 0; index2 < 2; index2++) { - pokeStruct2->offense.att[index2] = local_74.att[index2]; - pokeStruct2->offense.def[index2] = local_74.def[index2]; + pokeStruct2->offense.att[index2] = local_74.offense.att[index2]; + pokeStruct2->offense.def[index2] = local_74.offense.def[index2]; } pokeStruct2->currExp = local_74.exp; From b6e90631fe21d285b2da73ac1cb9b3b051b55a40 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 4 Oct 2024 08:45:55 -0700 Subject: [PATCH 17/18] fix: fix up conflicts --- include/code_8069D4C.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/code_8069D4C.h b/include/code_8069D4C.h index d42f3c05e..6e4ab6f9a 100644 --- a/include/code_8069D4C.h +++ b/include/code_8069D4C.h @@ -1,6 +1,8 @@ #ifndef GUARD_CODE_8069D4C_H #define GUARD_CODE_8069D4C_H +#include "structs/dungeon_entity.h" + // NOTE: basically Offense struct but packed to match struct unkStruct_8069D4C_sub { From b6499587e59bf9bf8d11fb54a4098d4fb1806fb1 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 6 Oct 2024 12:37:30 -0700 Subject: [PATCH 18/18] address final review comment --- src/thank_you_wonder_mail.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 27b4fcd03..8b3401cc1 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -103,11 +103,11 @@ const UnkTextStruct2 gUnknown_80DED60 = extern const u8 SendItem_Text[]; extern const u8 DontSendItem_Text[]; -const MenuItem gUnknown_80DED78[3] = +const MenuItem gUnknown_80DED78[] = { {"Confirm", CONFIRM_ACTION}, {"Info", INFO_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; // Unused @@ -122,60 +122,60 @@ const UnkTextStruct2 gUnknown_80DEDA0 = }; -const MenuItem gThankYouMailMainMenuItems[4] = +const MenuItem gThankYouMailMainMenuItems[] = { {"Send Thank-You Mail", SEND_THANK_YOU_MAIL_ACTION}, {"Get Thank-You Mail", GET_THANK_YOU_MAIL_ACTION}, {"Cancel", CANCEL_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; -const MenuItem gUnknown_80DEE08[4] = +const MenuItem gUnknown_80DEE08[] = { {"Game Link cable", GAME_LINK_ACTION}, {"Password", PASSWORD_ACTION}, {"Cancel", CANCEL_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; -const MenuItem gUnknown_80DEE44[3] = +const MenuItem gUnknown_80DEE44[] = { {"Yes", YES_ACTION}, {"Cancel", CANCEL_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; -const MenuItem gUnknown_80DEE60[3] = +const MenuItem gUnknown_80DEE60[] = { {"Yes", YES_ACTION}, {"No", NO_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; -const MenuItem gUnknown_80DEE7C[4] = +const MenuItem gUnknown_80DEE7C[] = { {SendItem_Text, SEND_ITEM_ACTION}, {DontSendItem_Text, NO_SEND_ITEM_ACTION}, {"Cancel", CANCEL_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; ALIGNED(4) static const u8 DontSendItem_Text[] = _("Don{APOSTROPHE}t Send Item"); ALIGNED(4) static const u8 SendItem_Text[] = "Send Item"; -const MenuItem gUnknown_80DEEBC[3] = +const MenuItem gUnknown_80DEEBC[] = { {"Send w/o Item", NO_SEND_ITEM_ACTION}, {"Cancel", CANCEL_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; -const MenuItem gUnknown_80DEEE4[4] = +const MenuItem gUnknown_80DEEE4[] = { {"Yes", YES_ACTION}, {"No", NO_ACTION}, {"Cancel", CANCEL_ACTION}, - {NULL, CANCEL_ACTION}, + {}, }; #include "data/thank_you_wonder_mail.h"