From f972f7b3be77a82c635f537a7a8b73840bacfe03 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 23 Nov 2024 21:26:58 +0100 Subject: [PATCH] sub_806B404 --- Makefile | 2 +- asm/code_8069E0C.s | 1002 --------------------------------- include/pokemon.h | 5 + include/pokemon_3.h | 1 + include/structs/str_dungeon.h | 2 +- src/code_8069E0C.c | 331 ++++++++++- src/pokemon_3.c | 9 +- 7 files changed, 339 insertions(+), 1013 deletions(-) diff --git a/Makefile b/Makefile index 83b4e20b0..51c25f931 100755 --- a/Makefile +++ b/Makefile @@ -76,7 +76,7 @@ TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE)) ASFLAGS := -mcpu=arm7tdmi -override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Wunused -Werror -O2 -fhex-asm +override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Wunused -Werror -O2 -fhex-asm -g INCLUDE_PATHS := -I include -I tools/agbcc/include CPPFLAGS := -iquote include -I tools/agbcc/include -nostdinc -undef diff --git a/asm/code_8069E0C.s b/asm/code_8069E0C.s index 99b6e924f..185f8292d 100644 --- a/asm/code_8069E0C.s +++ b/asm/code_8069E0C.s @@ -5,1008 +5,6 @@ .text - - - thumb_func_start sub_806AED8 -sub_806AED8: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - mov r10, r0 - str r1, [sp, 0x8] - str r2, [sp, 0xC] - str r3, [sp, 0x10] - ldr r0, [sp, 0x38] - ldr r1, [sp, 0x3C] - mov r8, r1 - lsls r0, 16 - asrs r7, r0, 16 - ldr r1, _0806AF04 - ldr r0, [r1] - ldr r4, _0806AF08 - adds r6, r0, r4 - movs r3, 0 - b _0806AF7A - .align 2, 0 -_0806AF04: .4byte gDungeon -_0806AF08: .4byte 0x00002f3c -_0806AF0C: - lsls r0, r2, 16 - asrs r0, 16 - cmp r0, r7 - bne _0806AF6E - movs r2, 0x2 - ldrsh r0, [r6, r2] - cmp r0, r8 - bne _0806AF6E - movs r5, 0xE - adds r5, r6 - mov r8, r5 - movs r0, 0x10 - adds r0, r6 - mov r9, r0 - mov r1, r10 - adds r1, 0x20 - str r1, [sp, 0x14] - adds r5, r6, 0x4 - mov r4, r10 - movs r7, 0x3 -_0806AF34: - ldrh r1, [r5] - adds r0, r4, 0 - bl sub_8092AA8 - adds r5, 0x2 - adds r4, 0x8 - subs r7, 0x1 - cmp r7, 0 - bge _0806AF34 - ldrh r0, [r6, 0xC] - ldr r2, [sp, 0x8] - strh r0, [r2] - movs r5, 0 - mov r3, r8 - mov r2, r9 -_0806AF52: - ldr r0, [sp, 0xC] - adds r1, r0, r5 - adds r0, r3, r5 - ldrb r0, [r0] - strb r0, [r1] - ldr r0, [sp, 0x10] - adds r1, r0, r5 - adds r0, r2, r5 - ldrb r0, [r0] - strb r0, [r1] - adds r5, 0x1 - cmp r5, 0x1 - ble _0806AF52 - b _0806B084 -_0806AF6E: - adds r4, 0x14 - adds r3, 0x1 - cmp r3, 0x3F - bgt _0806AF84 - ldr r0, [r1] - adds r6, r0, r4 -_0806AF7A: - ldrh r2, [r6] - movs r5, 0 - ldrsh r0, [r6, r5] - cmp r0, 0 - bne _0806AF0C -_0806AF84: - cmp r3, 0x40 - bne _0806AFE6 - mov r0, sp - adds r1, r7, 0 - mov r2, r8 - bl sub_8072AC8 - mov r0, r10 - adds r0, 0x20 - str r0, [sp, 0x14] - mov r5, sp - mov r4, r10 - movs r6, 0x3 -_0806AF9E: - ldrh r1, [r5] - adds r0, r4, 0 - bl sub_8092AA8 - adds r5, 0x2 - adds r4, 0x8 - subs r6, 0x1 - cmp r6, 0 - bge _0806AF9E - adds r0, r7, 0 - mov r1, r8 - bl sub_806C444 - ldr r1, [sp, 0x8] - strh r0, [r1] - movs r5, 0 -_0806AFBE: - adds r0, r7, 0 - mov r1, r8 - adds r2, r5, 0 - bl sub_806C488 - ldr r2, [sp, 0xC] - adds r1, r2, r5 - strb r0, [r1] - adds r0, r7, 0 - mov r1, r8 - adds r2, r5, 0 - bl sub_806C4D4 - ldr r2, [sp, 0x10] - adds r1, r2, r5 - strb r0, [r1] - adds r5, 0x1 - cmp r5, 0x1 - ble _0806AFBE - b _0806B084 -_0806AFE6: - strh r7, [r6] - mov r5, r8 - strh r5, [r6, 0x2] - adds r4, r6, 0x4 - adds r0, r4, 0 - adds r1, r7, 0 - mov r2, r8 - bl sub_8072AC8 - movs r1, 0 - ldrsh r0, [r6, r1] - movs r2, 0x2 - ldrsh r1, [r6, r2] - bl sub_806C444 - strh r0, [r6, 0xC] - movs r5, 0 - movs r0, 0xE - adds r0, r6 - mov r8, r0 - movs r1, 0x10 - adds r1, r6 - mov r9, r1 - mov r2, r10 - adds r2, 0x20 - str r2, [sp, 0x14] -_0806B01A: - movs r1, 0 - ldrsh r0, [r6, r1] - movs r2, 0x2 - ldrsh r1, [r6, r2] - adds r2, r5, 0 - bl sub_806C488 - mov r2, r8 - adds r1, r2, r5 - strb r0, [r1] - movs r1, 0 - ldrsh r0, [r6, r1] - movs r2, 0x2 - ldrsh r1, [r6, r2] - adds r2, r5, 0 - bl sub_806C4D4 - mov r2, r9 - adds r1, r2, r5 - strb r0, [r1] - adds r5, 0x1 - cmp r5, 0x1 - ble _0806B01A - mov r5, r10 - movs r7, 0x3 -_0806B04C: - ldrh r1, [r4] - adds r0, r5, 0 - bl sub_8092AA8 - adds r4, 0x2 - adds r5, 0x8 - subs r7, 0x1 - cmp r7, 0 - bge _0806B04C - ldrh r0, [r6, 0xC] - ldr r5, [sp, 0x8] - strh r0, [r5] - movs r5, 0 - mov r3, r8 - mov r2, r9 -_0806B06A: - ldr r0, [sp, 0xC] - adds r1, r0, r5 - adds r0, r3, r5 - ldrb r0, [r0] - strb r0, [r1] - ldr r0, [sp, 0x10] - adds r1, r0, r5 - adds r0, r2, r5 - ldrb r0, [r0] - strb r0, [r1] - adds r5, 0x1 - cmp r5, 0x1 - ble _0806B06A -_0806B084: - movs r0, 0 - ldr r1, [sp, 0x14] - strb r0, [r1] - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806AED8 - - thumb_func_start sub_806B09C -sub_806B09C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r8, r0 - lsls r1, 24 - lsrs r1, 24 - str r1, [sp] - movs r7, 0 - movs r2, 0 - mov r6, r8 - adds r6, 0x2 - mov r9, r8 -_0806B0BA: - movs r0, 0x64 - muls r0, r2 - ldr r1, _0806B0E4 - adds r0, r1 - ldr r3, _0806B0E8 - ldr r1, [r3] - adds r5, r1, r0 - ldrh r1, [r5] - movs r0, 0x1 - ands r0, r1 - adds r2, 0x1 - mov r10, r2 - cmp r0, 0 - beq _0806B124 - lsrs r0, r1, 1 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0806B124 - movs r4, 0 - b _0806B0EE - .align 2, 0 -_0806B0E4: .4byte 0x00008df8 -_0806B0E8: .4byte gRecruitedPokemonRef -_0806B0EC: - adds r4, 0x1 -_0806B0EE: - cmp r4, r7 - bge _0806B106 - lsls r0, r4, 3 - add r0, r8 - bl ExtractSpeciesIndex - lsls r0, 16 - asrs r0, 16 - movs r2, 0xE - ldrsh r1, [r5, r2] - cmp r0, r1 - bne _0806B0EC -_0806B106: - cmp r4, r7 - bne _0806B124 - movs r3, 0xE - ldrsh r2, [r5, r3] - mov r0, r9 - movs r1, 0 - bl sub_808E9D8 - movs r0, 0 - strh r0, [r6] - strh r0, [r6, 0x2] - adds r6, 0x8 - movs r0, 0x8 - add r9, r0 - adds r7, 0x1 -_0806B124: - mov r2, r10 - cmp r2, 0x3 - ble _0806B0BA - mov r0, r8 - adds r1, r7, 0 - bl sub_803D808 - adds r7, r0, 0 - ldr r1, [sp] - cmp r1, 0 - beq _0806B150 - lsls r4, r7, 3 - add r4, r8 - ldr r2, _0806B164 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_808E9D8 - movs r0, 0 - strh r0, [r4, 0x2] - strh r0, [r4, 0x4] - adds r7, 0x1 -_0806B150: - adds r0, r7, 0 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0806B164: .4byte 0x000001a5 - thumb_func_end sub_806B09C - - thumb_func_start sub_806B168 -sub_806B168: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x3C - ldr r0, _0806B324 - ldr r1, [r0] - ldr r2, _0806B328 - adds r0, r1, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - ldr r4, _0806B32C - adds r1, r4 - movs r2, 0 - ldrsh r1, [r1, r2] - bl GetTile - ldrb r0, [r0, 0x9] - str r0, [sp, 0x2C] - movs r3, 0 - mov r4, sp - adds r4, 0x1C - str r4, [sp, 0x30] - ldr r2, _0806B330 - ldr r1, _0806B334 -_0806B19C: - ldr r0, [r2] - adds r0, r1 - strh r3, [r0, 0xC] - adds r1, 0x64 - adds r3, 0x1 - cmp r3, 0x3 - ble _0806B19C - movs r4, 0 - movs r3, 0 - ldr r0, _0806B324 - mov r8, r0 - ldr r0, _0806B330 - ldr r7, [r0] - movs r5, 0x1 - add r6, sp, 0xC -_0806B1BA: - movs r0, 0x64 - muls r0, r3 - ldr r1, _0806B334 - adds r0, r1 - adds r2, r7, r0 - ldrh r1, [r2] - adds r0, r5, 0 - ands r0, r1 - cmp r0, 0 - beq _0806B1DA - lsrs r0, r1, 1 - ands r0, r5 - cmp r0, 0 - beq _0806B1DA - stm r6!, {r2} - adds r4, 0x1 -_0806B1DA: - adds r3, 0x1 - cmp r3, 0x3 - ble _0806B1BA - cmp r4, 0x3 - bgt _0806B1F4 - movs r1, 0 - lsls r0, r4, 2 - add r0, sp - adds r0, 0xC -_0806B1EC: - stm r0!, {r1} - adds r4, 0x1 - cmp r4, 0x3 - ble _0806B1EC -_0806B1F4: - movs r4, 0 - movs r6, 0 - add r2, sp, 0xC - ldr r5, [sp, 0x30] - movs r3, 0x3 -_0806B1FE: - ldr r1, [r2] - cmp r1, 0 - beq _0806B210 - ldrb r0, [r1, 0x2] - cmp r0, 0 - beq _0806B210 - str r6, [r2] - stm r5!, {r1} - adds r4, 0x1 -_0806B210: - adds r2, 0x4 - subs r3, 0x1 - cmp r3, 0 - bge _0806B1FE - mov r2, r8 - ldr r0, [r2] - ldr r3, _0806B338 - adds r0, r3 - ldrb r0, [r0] - cmp r0, 0 - bne _0806B24C - movs r6, 0 - add r2, sp, 0xC - lsls r0, r4, 2 - ldr r1, [sp, 0x30] - adds r5, r0, r1 - movs r3, 0x3 -_0806B232: - ldr r1, [r2] - cmp r1, 0 - beq _0806B244 - ldrb r0, [r1, 0x4] - cmp r0, 0x41 - bne _0806B244 - str r6, [r2] - stm r5!, {r1} - adds r4, 0x1 -_0806B244: - adds r2, 0x4 - subs r3, 0x1 - cmp r3, 0 - bge _0806B232 -_0806B24C: - movs r5, 0 - add r2, sp, 0xC - lsls r0, r4, 2 - ldr r3, [sp, 0x30] - adds r0, r3 - movs r3, 0x3 -_0806B258: - ldr r1, [r2] - cmp r1, 0 - beq _0806B264 - str r5, [r2] - stm r0!, {r1} - adds r4, 0x1 -_0806B264: - adds r2, 0x4 - subs r3, 0x1 - cmp r3, 0 - bge _0806B258 - cmp r4, 0x3 - bgt _0806B280 - movs r1, 0 - lsls r0, r4, 2 - ldr r2, [sp, 0x30] - adds r0, r2 -_0806B278: - stm r0!, {r1} - adds r4, 0x1 - cmp r4, 0x3 - ble _0806B278 -_0806B280: - movs r3, 0 -_0806B282: - lsls r0, r3, 2 - ldr r4, [sp, 0x30] - adds r0, r4, r0 - ldr r0, [r0] - mov r8, r0 - adds r0, r3, 0x1 - str r0, [sp, 0x34] - mov r1, r8 - cmp r1, 0 - bne _0806B298 - b _0806B3E8 -_0806B298: - movs r2, 0xE - ldrsh r1, [r1, r2] - ldr r0, _0806B33C - cmp r1, r0 - beq _0806B2AE - adds r0, 0x2 - cmp r1, r0 - beq _0806B2AE - subs r0, 0x1 - cmp r1, r0 - bne _0806B2B6 -_0806B2AE: - movs r0, 0xBC - lsls r0, 1 - mov r4, r8 - strh r0, [r4, 0xE] -_0806B2B6: - ldr r0, _0806B340 - ldr r2, [r0] - movs r1, 0 - ldrsh r0, [r0, r1] - adds r3, 0x1 - str r3, [sp, 0x34] - ldr r3, _0806B340 - cmp r0, 0x63 - beq _0806B350 - ldr r4, _0806B324 - mov r9, r4 - ldr r0, _0806B328 - mov r10, r0 - adds r5, r3, 0 -_0806B2D2: - lsls r0, r2, 16 - asrs r7, r0, 16 - mov r4, r9 - ldr r1, [r4] - mov r4, r10 - adds r0, r1, r4 - movs r4, 0 - ldrsh r0, [r0, r4] - adds r0, r7, r0 - asrs r6, r2, 16 - ldr r2, _0806B32C - adds r1, r2 - movs r4, 0 - ldrsh r1, [r1, r4] - adds r1, r6, r1 - str r3, [sp, 0x38] - bl GetTile - adds r1, r0, 0 - ldrb r0, [r1, 0x9] - ldr r3, [sp, 0x38] - ldr r2, [sp, 0x2C] - cmp r0, r2 - bne _0806B344 - mov r4, r8 - movs r2, 0xE - ldrsh r0, [r4, r2] - bl sub_807034C - lsls r0, 24 - lsrs r4, r0, 24 - ldr r3, [sp, 0x38] - cmp r4, 0 - bne _0806B344 - mov r3, r8 - movs r1, 0xE - ldrsh r0, [r3, r1] - mov r3, r9 - ldr r2, [r3] - mov r3, r10 - b _0806B3A8 - .align 2, 0 -_0806B324: .4byte gDungeon -_0806B328: .4byte 0x0000e218 -_0806B32C: .4byte 0x0000e21a -_0806B330: .4byte gRecruitedPokemonRef -_0806B334: .4byte 0x00008df8 -_0806B338: .4byte 0x0000065c -_0806B33C: .4byte 0x00000179 -_0806B340: .4byte gUnknown_80F4598 -_0806B344: - adds r5, 0x4 - ldr r2, [r5] - movs r4, 0 - ldrsh r0, [r5, r4] - cmp r0, 0x63 - bne _0806B2D2 -_0806B350: - movs r0, 0 - cmp r0, 0 - bne _0806B3E8 - ldr r2, [r3] - movs r1, 0 - ldrsh r0, [r3, r1] - cmp r0, 0x63 - beq _0806B3E8 - ldr r3, _0806B3CC - mov r9, r3 - ldr r5, _0806B3D0 -_0806B366: - lsls r0, r2, 16 - asrs r7, r0, 16 - mov r4, r9 - ldr r1, [r4] - ldr r3, _0806B3D4 - adds r0, r1, r3 - movs r4, 0 - ldrsh r0, [r0, r4] - adds r0, r7, r0 - asrs r6, r2, 16 - ldr r2, _0806B3D8 - adds r1, r2 - movs r3, 0 - ldrsh r1, [r1, r3] - adds r1, r6, r1 - bl GetTile - adds r1, r0, 0 - mov r4, r8 - movs r2, 0xE - ldrsh r0, [r4, r2] - bl sub_807034C - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _0806B3DC - mov r3, r8 - movs r1, 0xE - ldrsh r0, [r3, r1] - mov r3, r9 - ldr r2, [r3] - ldr r3, _0806B3D4 -_0806B3A8: - adds r1, r2, r3 - movs r3, 0 - ldrsh r1, [r1, r3] - adds r1, r7, r1 - ldr r3, _0806B3D8 - adds r2, r3 - movs r3, 0 - ldrsh r2, [r2, r3] - adds r2, r6, r2 - str r4, [sp] - movs r3, 0x1 - str r3, [sp, 0x4] - str r4, [sp, 0x8] - mov r3, r8 - bl sub_806B8CC - b _0806B3E8 - .align 2, 0 -_0806B3CC: .4byte gDungeon -_0806B3D0: .4byte gUnknown_80F4598 -_0806B3D4: .4byte 0x0000e218 -_0806B3D8: .4byte 0x0000e21a -_0806B3DC: - adds r5, 0x4 - ldr r2, [r5] - movs r4, 0 - ldrsh r0, [r5, r4] - cmp r0, 0x63 - bne _0806B366 -_0806B3E8: - ldr r3, [sp, 0x34] - cmp r3, 0x3 - bgt _0806B3F0 - b _0806B282 -_0806B3F0: - bl sub_806B678 - add sp, 0x3C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806B168 - - thumb_func_start sub_806B404 -sub_806B404: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x30 - movs r5, 0 - movs r2, 0 - ldr r0, _0806B480 - mov r9, r0 - ldr r0, _0806B484 - ldr r7, [r0] - movs r6, 0x1 - ldr r1, _0806B488 - mov r8, r1 -_0806B422: - movs r0, 0x64 - muls r0, r2 - ldr r3, _0806B48C - adds r0, r3 - adds r3, r7, r0 - ldrh r1, [r3] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _0806B446 - lsrs r0, r1, 1 - ands r0, r6 - cmp r0, 0 - beq _0806B446 - movs r1, 0xA - ldrsh r0, [r3, r1] - cmp r0, r8 - beq _0806B490 -_0806B446: - adds r2, 0x1 - cmp r2, 0x3 - ble _0806B422 -_0806B44C: - cmp r5, 0x3 - bgt _0806B460 - movs r1, 0 - lsls r0, r5, 2 - add r0, sp - adds r0, 0xC -_0806B458: - stm r0!, {r1} - adds r5, 0x1 - cmp r5, 0x3 - ble _0806B458 -_0806B460: - movs r0, 0 - mov r2, r9 - str r0, [r2] - bl GetLeader - adds r5, r0, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0806B49C - ldrh r0, [r5, 0x6] - lsls r0, 16 - ldrh r4, [r5, 0x4] - b _0806B4AE - .align 2, 0 -_0806B480: .4byte gLeaderPointer -_0806B484: .4byte gRecruitedPokemonRef -_0806B488: .4byte 0x000055aa -_0806B48C: .4byte 0x00008df8 -_0806B490: - lsls r0, r5, 2 - add r0, sp - adds r0, 0xC - str r3, [r0] - adds r5, 0x1 - b _0806B44C -_0806B49C: - ldr r0, _0806B560 - ldr r0, [r0] - ldr r3, _0806B564 - adds r1, r0, r3 - ldr r2, _0806B568 - adds r0, r2 - ldrh r0, [r0] - lsls r0, 16 - ldrh r4, [r1] -_0806B4AE: - orrs r4, r0 - lsls r5, r4, 16 - asrs r0, r5, 16 - asrs r4, 16 - adds r1, r4, 0 - bl GetTile - ldrb r0, [r0, 0x9] - str r0, [sp, 0x20] - movs r2, 0 - str r5, [sp, 0x24] - mov r10, r4 -_0806B4C6: - lsls r0, r2, 2 - add r0, sp - adds r0, 0xC - ldr r6, [r0] - adds r2, 0x1 - str r2, [sp, 0x28] - cmp r6, 0 - bne _0806B4D8 - b _0806B65E -_0806B4D8: - ldrh r1, [r6] - movs r2, 0x1 - adds r0, r2, 0 - ands r0, r1 - cmp r0, 0 - bne _0806B4E6 - b _0806B65E -_0806B4E6: - lsrs r0, r1, 1 - ands r0, r2 - cmp r0, 0 - bne _0806B4F0 - b _0806B65E -_0806B4F0: - movs r3, 0xA - ldrsh r1, [r6, r3] - ldr r0, _0806B56C - cmp r1, r0 - beq _0806B4FC - b _0806B65E -_0806B4FC: - ldr r0, _0806B570 - strh r0, [r6, 0xA] - movs r7, 0 - ldr r2, _0806B574 - ldr r0, [r2] - str r0, [sp, 0x1C] - add r0, sp, 0x1C - movs r3, 0 - ldrsh r1, [r0, r3] - mov r9, r2 - adds r2, r0, 0 - cmp r1, 0x63 - beq _0806B58C - ldr r0, [sp, 0x24] - asrs r0, 16 - mov r8, r0 -_0806B51C: - movs r1, 0 - ldrsh r0, [r2, r1] - add r0, r8 - ldr r1, [sp, 0x1C] - asrs r1, 16 - mov r5, r10 - adds r1, r5 - str r2, [sp, 0x2C] - bl GetTile - adds r1, r0, 0 - ldrb r0, [r1, 0x9] - ldr r2, [sp, 0x2C] - ldr r3, [sp, 0x20] - cmp r0, r3 - bne _0806B578 - movs r3, 0xE - ldrsh r0, [r6, r3] - bl sub_807034C - lsls r0, 24 - lsrs r4, r0, 24 - ldr r2, [sp, 0x2C] - cmp r4, 0 - bne _0806B578 - movs r1, 0xE - ldrsh r0, [r6, r1] - movs r3, 0 - ldrsh r1, [r2, r3] - add r1, r8 - ldr r2, [sp, 0x1C] - asrs r2, 16 - adds r2, r5 - b _0806B642 - .align 2, 0 -_0806B560: .4byte gDungeon -_0806B564: .4byte 0x0000e218 -_0806B568: .4byte 0x0000e21a -_0806B56C: .4byte 0x000055aa -_0806B570: .4byte 0x00005aa5 -_0806B574: .4byte gUnknown_80F4598 -_0806B578: - adds r7, 0x1 - ldr r1, _0806B5E4 - lsls r0, r7, 2 - adds r0, r1 - ldr r0, [r0] - str r0, [sp, 0x1C] - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0x63 - bne _0806B51C -_0806B58C: - movs r3, 0 - cmp r3, 0 - bne _0806B65E - movs r7, 0 - mov r1, r9 - ldr r0, [r1] - str r0, [sp, 0x1C] - movs r3, 0 - ldrsh r0, [r2, r3] - cmp r0, 0x63 - beq _0806B5FC - ldr r0, [sp, 0x24] - asrs r0, 16 - mov r8, r0 -_0806B5A8: - movs r1, 0 - ldrsh r0, [r2, r1] - add r0, r8 - ldr r1, [sp, 0x1C] - asrs r1, 16 - mov r5, r10 - adds r1, r5 - str r2, [sp, 0x2C] - bl GetTile - adds r1, r0, 0 - movs r3, 0xE - ldrsh r0, [r6, r3] - bl sub_807034C - lsls r0, 24 - lsrs r4, r0, 24 - ldr r2, [sp, 0x2C] - cmp r4, 0 - bne _0806B5E8 - movs r1, 0xE - ldrsh r0, [r6, r1] - movs r3, 0 - ldrsh r1, [r2, r3] - add r1, r8 - ldr r2, [sp, 0x1C] - asrs r2, 16 - adds r2, r5 - b _0806B642 - .align 2, 0 -_0806B5E4: .4byte gUnknown_80F4598 -_0806B5E8: - adds r7, 0x1 - ldr r1, _0806B654 - lsls r0, r7, 2 - adds r0, r1 - ldr r0, [r0] - str r0, [sp, 0x1C] - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0x63 - bne _0806B5A8 -_0806B5FC: - movs r3, 0 - cmp r3, 0 - bne _0806B65E - movs r7, 0 - adds r5, r2, 0 -_0806B606: - adds r0, r5, 0 - str r2, [sp, 0x2C] - bl sub_8083660 - lsls r0, 24 - ldr r2, [sp, 0x2C] - cmp r0, 0 - beq _0806B658 - movs r1, 0 - ldrsh r0, [r2, r1] - movs r3, 0x2 - ldrsh r1, [r5, r3] - bl GetTile - adds r1, r0, 0 - movs r3, 0xE - ldrsh r0, [r6, r3] - bl sub_807034C - lsls r0, 24 - lsrs r4, r0, 24 - ldr r2, [sp, 0x2C] - cmp r4, 0 - bne _0806B658 - movs r1, 0xE - ldrsh r0, [r6, r1] - movs r3, 0 - ldrsh r1, [r2, r3] - movs r3, 0x2 - ldrsh r2, [r5, r3] -_0806B642: - str r4, [sp] - movs r3, 0x1 - str r3, [sp, 0x4] - str r4, [sp, 0x8] - adds r3, r6, 0 - bl sub_806B8CC - b _0806B65E - .align 2, 0 -_0806B654: .4byte gUnknown_80F4598 -_0806B658: - adds r7, 0x1 - cmp r7, 0x63 - ble _0806B606 -_0806B65E: - ldr r2, [sp, 0x28] - cmp r2, 0x3 - bgt _0806B666 - b _0806B4C6 -_0806B666: - add sp, 0x30 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806B404 - thumb_func_start sub_806B678 sub_806B678: push {r4,r5,lr} diff --git a/include/pokemon.h b/include/pokemon.h index 79496cbc4..19bbfb6e4 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -112,6 +112,11 @@ static inline bool8 PokemonFlag2(PokemonStruct1 *mon) return (mon->unk0 >> (FLAG_ON_TEAM - 1)) & 1; } +static inline bool8 PokemonFlag2Struct2(PokemonStruct2 *mon) +{ + return (mon->unk0 >> (FLAG_ON_TEAM - 1)) & 1; +} + static inline void SetPokemonFlag2(PokemonStruct1 *mon) { mon->unk0 |= FLAG_ON_TEAM; diff --git a/include/pokemon_3.h b/include/pokemon_3.h index fe4b90f7c..f1b602862 100644 --- a/include/pokemon_3.h +++ b/include/pokemon_3.h @@ -32,6 +32,7 @@ void SetDefaultIQSkills(u8 *param_1, bool8 enableSelfCurer); void sub_808F468(PokemonStruct1 *param_1, EvolveStatus *evolveStatus, u8 param_3); u32 sub_808F734(PokemonStruct1 *pokemon, s16 _species); s16 ExtractSpeciesIndex(UnkDungeonGlobal_unk1CD98 *r0); +void SetSpeciesLevelToExtract(UnkDungeonGlobal_unk1CD98 *r0, s32 level, s32 species); s32 ExtractLevel(UnkDungeonGlobal_unk1CD98 *r0); // pokemon_3.s diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 755fa87d9..f64f2ff2e 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -160,7 +160,7 @@ typedef struct UnkDungeonGlobal_unk1C590 typedef struct UnkDungeonGlobal_unk1CD98 { - s16 unk0; // species + u16 unk0; // species and level s16 unk2[2]; } UnkDungeonGlobal_unk1CD98; diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index 90bf41ae0..c969dd5ea 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -7,7 +7,9 @@ #include "constants/status.h" #include "constants/type.h" #include "constants/weather.h" +#include "dungeon_leader.h" #include "dungeon_map_access.h" +#include "dungeon_movement.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_random.h" #include "dungeon_message.h" @@ -562,6 +564,7 @@ void sub_806A5B8(Entity *entity) extern void sub_803F580(s32); extern void sub_8040A84(void); +extern void sub_806B678(void); void sub_806A6E8(Entity *entity) { @@ -858,11 +861,11 @@ void MarkLastUsedMonMove(Entity *entity, Move *move) } extern s32 sub_803D808(UnkDungeonGlobal_unk1CD98 *strPtr, s32 id); -extern void sub_8072AC8(u16 *param_1, s16 species, s32 param_3); +extern void sub_8072AC8(u16 *param_1, s32 species, s32 param_3); -s32 sub_806C444(s16 species, s32 level); -s32 sub_806C488(s16 species, s32 level, s32 categoryIndex); -s32 sub_806C4D4(s16 species, s32 level, s32 categoryIndex); +s32 sub_806C444(s32 species, s32 level); +s32 sub_806C488(s32 species, s32 level, s32 categoryIndex); +s32 sub_806C4D4(s32 species, s32 level, s32 categoryIndex); void sub_806AD3C(void) { @@ -926,3 +929,323 @@ void sub_806AD3C(void) } } } + +void sub_806AED8(Moves *moves, s16 *maxHPStat, u8 *atk, u8 *def, s16 _species, s32 level) +{ + s32 i; + s32 moveCategory; + s32 species = _species; + unkDungeon2F3C *structPtr = gDungeon->unk2F3C; + + for (i = 0; i < 64; i++) { + s16 loopSpecies; + + structPtr = &gDungeon->unk2F3C[i]; + loopSpecies = SpeciesId(structPtr->species); + if (structPtr->species == 0) + break; + + if (loopSpecies == species && structPtr->level == level) { + s32 moveIndex; + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { + sub_8092AA8(&moves->moves[moveIndex], structPtr->moves[moveIndex]); + } + *maxHPStat = structPtr->unkC; + for (moveCategory = 0; moveCategory < 2; moveCategory++) { + atk[moveCategory] = structPtr->unkE[moveCategory]; + def[moveCategory] = structPtr->unk10[moveCategory]; + } + + moves->struggleMoveFlags = 0; + return; + } + } + + if (i == 64) { + s32 moveIndex; + u16 spMoves[MAX_MON_MOVES]; + + sub_8072AC8(spMoves, species, level); + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { + sub_8092AA8(&moves->moves[moveIndex], spMoves[moveIndex]); + } + *maxHPStat = sub_806C444(species, level); + for (moveCategory = 0; moveCategory < 2; moveCategory++) { + atk[moveCategory] = sub_806C488(species, level, moveCategory); + def[moveCategory] = sub_806C4D4(species, level, moveCategory); + } + + + } + else { + s32 moveIndex; + + structPtr->species = species; + structPtr->level = level; + sub_8072AC8(structPtr->moves, species, level); + structPtr->unkC = sub_806C444(structPtr->species, structPtr->level); + for (moveCategory = 0; moveCategory < 2; moveCategory++) { + structPtr->unkE[moveCategory] = sub_806C488(structPtr->species, structPtr->level, moveCategory); + structPtr->unk10[moveCategory] = sub_806C4D4(structPtr->species, structPtr->level, moveCategory); + } + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { + sub_8092AA8(&moves->moves[moveIndex], structPtr->moves[moveIndex]); + } + + *maxHPStat = structPtr->unkC; + for (moveCategory = 0; moveCategory < 2; moveCategory++) { + atk[moveCategory] = structPtr->unkE[moveCategory]; + def[moveCategory] = structPtr->unk10[moveCategory]; + } + } + + moves->struggleMoveFlags = 0; +} + +UNUSED static s32 sub_806B09C(UnkDungeonGlobal_unk1CD98 *unkPtr, bool8 a1) +{ + s32 i, j; + s32 count = 0; + s16 *unk2Field; + UnkDungeonGlobal_unk1CD98 *loopPtr; + + for (i = 0, unk2Field = unkPtr->unk2, loopPtr = unkPtr; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *monStructPtr = &gRecruitedPokemonRef->pokemon2[i]; + + if (PokemonFlag1Struct2(monStructPtr) && PokemonFlag2Struct2(monStructPtr)) + { + for (j = 0; j < count; j++) { + if (ExtractSpeciesIndex(&unkPtr[j]) == monStructPtr->speciesNum) + break; + } + + if (j == count) { + SetSpeciesLevelToExtract(loopPtr, 0, monStructPtr->speciesNum); + unk2Field[0] = 0; + unk2Field[1] = 0; + unk2Field += sizeof(*unkPtr) / sizeof(unkPtr->unk2[0]); // Hacky solution, because loopPtr->unk2[0/1] = 0; doesn't match + loopPtr++; + count++; + } + } + } + + count = sub_803D808(unkPtr, count); + if (a1) { + SetSpeciesLevelToExtract(&unkPtr[count], 1, MONSTER_DECOY); + unkPtr[count].unk2[0] = 0; + unkPtr[count].unk2[1] = 0; + count++; + } + + return count; +} + +extern const DungeonPos gUnknown_80F4598[]; + +bool8 sub_806B8CC(s16 species, s32 x, s32 y, PokemonStruct2 *monPtr, u32 *a4, bool8 a5, u8 a6); + +void sub_806B168(void) +{ + s32 count; + PokemonStruct2 *monPtrs[MAX_TEAM_MEMBERS]; + PokemonStruct2 *monPtrs2[MAX_TEAM_MEMBERS]; // Leader and partner? + u8 playerSpawnRoomId = GetTile(gDungeon->playerSpawn.x, gDungeon->playerSpawn.y)->room; + s32 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = &gRecruitedPokemonRef->pokemon2[i]; + currMonPtr->unkC = i; + } + + // Populate monPtrs + count = 0; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = &gRecruitedPokemonRef->pokemon2[i]; + if (PokemonFlag1Struct2(currMonPtr) && PokemonFlag2Struct2(currMonPtr)) { + monPtrs[count++] = currMonPtr; + } + } + for (; count < MAX_TEAM_MEMBERS; count++) { + monPtrs[count] = NULL; + } + + // Populate monPtrs2 + count = 0; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = monPtrs[i]; + if (currMonPtr != NULL && currMonPtr->isTeamLeader) { + monPtrs[i] = NULL; + monPtrs2[count++] = currMonPtr; + } + } + + if (gDungeon->unk644.unk18 == 0) { + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = monPtrs[i]; + if (currMonPtr != NULL && currMonPtr->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER) { + monPtrs[i] = NULL; + monPtrs2[count++] = currMonPtr; + } + } + } + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = monPtrs[i]; + if (monPtrs[i] != NULL) { + monPtrs[i] = NULL; + monPtrs2[count++] = currMonPtr; + } + } + for (; count < MAX_TEAM_MEMBERS; count++) { + monPtrs2[count] = NULL; + } + + // Do something else + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = monPtrs2[i]; + + if (currMonPtr != NULL) { + s32 j; + const Tile *tile; + bool8 skipSecondLoop; + + if (currMonPtr->speciesNum == MONSTER_CASTFORM_SNOWY || currMonPtr->speciesNum == MONSTER_CASTFORM_RAINY || currMonPtr->speciesNum == MONSTER_CASTFORM_SUNNY) { + currMonPtr->speciesNum = MONSTER_CASTFORM; + } + + skipSecondLoop = FALSE; + j = 0; + while (1) { + DungeonPos unkPosition = gUnknown_80F4598[j]; + if (unkPosition.x == 99) + break; + + tile = GetTile(unkPosition.x + gDungeon->playerSpawn.x, unkPosition.y + gDungeon->playerSpawn.y); + if (tile->room == playerSpawnRoomId && !sub_807034C(currMonPtr->speciesNum, tile)) { + sub_806B8CC(currMonPtr->speciesNum, unkPosition.x + gDungeon->playerSpawn.x, unkPosition.y + gDungeon->playerSpawn.y, currMonPtr, NULL, TRUE, 0); + skipSecondLoop = TRUE; + break; + } + j++; + } + + if (skipSecondLoop) + continue; + + j = 0; + while (1) { + DungeonPos unkPosition = gUnknown_80F4598[j]; + if (unkPosition.x == 99) + break; + + tile = GetTile(unkPosition.x + gDungeon->playerSpawn.x, unkPosition.y + gDungeon->playerSpawn.y); + if (!sub_807034C(currMonPtr->speciesNum, tile)) { + sub_806B8CC(currMonPtr->speciesNum, unkPosition.x + gDungeon->playerSpawn.x, unkPosition.y + gDungeon->playerSpawn.y, currMonPtr, NULL, TRUE, 0); + break; + } + j++; + } + } + } + + sub_806B678(); +} + +extern bool8 sub_8083660(const DungeonPos *param_1); +extern Entity *gLeaderPointer; + +void sub_806B404(void) +{ + Entity *leader; + s32 i; + PokemonStruct2 *monPtrs[MAX_TEAM_MEMBERS]; + u8 roomId; + DungeonPos pos; + s32 count = 0; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *currMonPtr = &gRecruitedPokemonRef->pokemon2[i]; + if (PokemonFlag1Struct2(currMonPtr) && PokemonFlag2Struct2(currMonPtr) && currMonPtr->unkA == 0x55AA) { + monPtrs[count++] = currMonPtr; + break; + } + } + for (; count < MAX_TEAM_MEMBERS; count++) { + monPtrs[count] = NULL; + } + + gLeaderPointer = NULL; + leader = GetLeader(); + if (EntityExists(leader)) { + pos.x = leader->pos.x; + pos.y = leader->pos.y; + } + else { + pos.x = gDungeon->playerSpawn.x; + pos.y = gDungeon->playerSpawn.y; + } + + roomId = GetTile(pos.x, pos.y)->room; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + DungeonPos unkPosition; + bool8 skipNextLoop; + const Tile *tile; + s32 j; + PokemonStruct2 *currMonPtr = monPtrs[i]; + + if (currMonPtr != NULL && PokemonFlag1Struct2(currMonPtr) && PokemonFlag2Struct2(currMonPtr) && currMonPtr->unkA == 0x55AA) { + currMonPtr->unkA = 0x5AA5; + skipNextLoop = FALSE; + j = 0; + while (1) { + unkPosition = gUnknown_80F4598[j]; + if (unkPosition.x == 99) + break; + + tile = GetTile(unkPosition.x + pos.x, unkPosition.y + pos.y); + if (tile->room == roomId && !sub_807034C(currMonPtr->speciesNum, tile)) { + sub_806B8CC(currMonPtr->speciesNum, unkPosition.x + pos.x, unkPosition.y + pos.y, currMonPtr, NULL, TRUE, 0); + skipNextLoop = TRUE; + break; + } + j++; + } + + if (skipNextLoop) + continue; + + skipNextLoop = FALSE; + j = 0; + while (1) { + unkPosition = gUnknown_80F4598[j]; + if (unkPosition.x == 99) + break; + + tile = GetTile(unkPosition.x + pos.x, unkPosition.y + pos.y); + if (!sub_807034C(currMonPtr->speciesNum, tile)) { + sub_806B8CC(currMonPtr->speciesNum, unkPosition.x + pos.x, unkPosition.y + pos.y, currMonPtr, NULL, TRUE, 0); + skipNextLoop = TRUE; + break; + } + j++; + } + + if (skipNextLoop) + continue; + + for (j = 0; j <= 99; j++) { + if (sub_8083660(&unkPosition)) { + const Tile *tile = GetTile(unkPosition.x, unkPosition.y); + if (!sub_807034C(currMonPtr->speciesNum, tile)) { + sub_806B8CC(currMonPtr->speciesNum, unkPosition.x, unkPosition.y, currMonPtr, NULL, TRUE, 0); + break; + } + } + } + } + } +} + +// diff --git a/src/pokemon_3.c b/src/pokemon_3.c index f91bf096b..95028ea56 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -285,16 +285,15 @@ void sub_808E9C4(PokemonStruct1 *r0, s16 r1) r0->unk0 = ((0xFE << 8) & r0->unk0) | r1_s32 ; } -void sub_808E9D8(PokemonStruct1 *r0, s32 r1, s16 r2) +void SetSpeciesLevelToExtract(UnkDungeonGlobal_unk1CD98 *r0, s32 level, s32 species) { - s32 r2_32 = r2; // dumb cast to match - r0->unk0 = r2_32 | (r1 << 9) ; + species = SpeciesId(species); + r0->unk0 = species | (level << 9) ; } s32 ExtractLevel(UnkDungeonGlobal_unk1CD98 *r0) { - u16 bitfield = r0->unk0; - return (bitfield >> 9); + return (r0->unk0 >> 9); } // Unused