diff --git a/asm/code_8045A00.s b/asm/code_8045A00.s index c7aac6f24..6adcff979 100644 --- a/asm/code_8045A00.s +++ b/asm/code_8045A00.s @@ -1315,7 +1315,7 @@ _080467BE: movs r2, 0 bl sub_80462AC movs r0, 0x13 - bl sub_803E46C + bl DungeonRunFrameActions ldr r2, [sp, 0x10] adds r2, 0x55 str r2, [sp, 0x10] @@ -1351,7 +1351,7 @@ _08046822: movs r3, 0xFF bl sub_80462AC movs r0, 0x13 - bl sub_803E46C + bl DungeonRunFrameActions add sp, 0x18 pop {r3-r5} mov r8, r3 @@ -1837,7 +1837,7 @@ _08046C06: blt _08046BAA _08046C14: movs r0, 0x13 - bl sub_803E46C + bl DungeonRunFrameActions movs r0, 0xA7 lsls r0, 3 add r0, sp diff --git a/asm/code_8046CE4.s b/asm/code_8046CE4.s index 34c302ab3..6a0fc46dd 100644 --- a/asm/code_8046CE4.s +++ b/asm/code_8046CE4.s @@ -249,7 +249,7 @@ _08047370: cmp r4, 0 beq _0804737A movs r0, 0x12 - bl sub_803E46C + bl DungeonRunFrameActions _0804737A: subs r5, 0x1 cmp r5, 0 @@ -788,7 +788,7 @@ _080477B2: cmp r3, 0 beq _080477BE movs r0, 0x17 - bl sub_803E46C + bl DungeonRunFrameActions _080477BE: ldr r0, [sp, 0x34] add r8, r0 diff --git a/asm/code_805D8C8.s b/asm/code_805D8C8.s deleted file mode 100644 index 5b37919c1..000000000 --- a/asm/code_805D8C8.s +++ /dev/null @@ -1,9639 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - - - thumb_func_start sub_8061A38 -sub_8061A38: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x130 - adds r5, r0, 0 - lsls r1, 24 - lsrs r6, r1, 24 - add r4, sp, 0xB0 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [r4, 0x4] - movs r1, 0x2 - strh r1, [r4, 0x8] - strh r1, [r4, 0xA] - movs r2, 0x12 - strh r2, [r4, 0xC] - movs r0, 0xE - strh r0, [r4, 0xE] - strh r2, [r4, 0x10] - strh r1, [r4, 0x12] - ldr r0, _08061AA4 - str r0, [r4, 0x14] - movs r0, 0x3 - str r0, [r4, 0x1C] - str r0, [r4, 0x34] - str r0, [r4, 0x4C] - movs r0, 0 - str r0, [sp, 0x114] - mov r8, r0 - ldr r0, _08061AA8 - ldr r1, [r0] - ldrb r0, [r5, 0x4] - lsls r0, 2 - ldr r2, _08061AAC - adds r1, r2 - adds r1, r0 - ldr r1, [r1] - str r1, [sp, 0x110] - ldr r0, [r1, 0x70] - str r0, [sp, 0x11C] - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08061AA0 - cmp r0, 0x47 - bne _08061AB0 -_08061AA0: - movs r0, 0x1 - b _08061AB2 - .align 2, 0 -_08061AA4: .4byte gUnknown_202F270 -_08061AA8: .4byte gDungeon -_08061AAC: .4byte 0x0001357c -_08061AB0: - movs r0, 0 -_08061AB2: - adds r1, r0, 0 - cmp r1, 0 - beq _08061ACE - movs r0, 0x1 - str r0, [sp, 0x4] - movs r0, 0 - str r0, [sp, 0x8] - str r0, [sp, 0xC] - str r0, [sp, 0x10] - str r0, [sp, 0x14] - str r0, [sp, 0x18] - movs r1, 0x1 - str r1, [sp, 0x118] - b _08061AFE -_08061ACE: - cmp r6, 0 - beq _08061AE6 - movs r0, 0x4 - str r0, [sp, 0x4] - str r1, [sp, 0x8] - str r1, [sp, 0xC] - str r1, [sp, 0x10] - str r1, [sp, 0x14] - str r1, [sp, 0x18] - movs r2, 0x1 - str r2, [sp, 0x118] - b _08061AFE -_08061AE6: - movs r0, 0x2 - str r0, [sp, 0x4] - movs r0, 0x1 - str r0, [sp, 0x8] - movs r0, 0x3 - str r0, [sp, 0xC] - movs r0, 0x5 - str r0, [sp, 0x10] - str r6, [sp, 0x14] - str r6, [sp, 0x18] - movs r0, 0x4 - str r0, [sp, 0x118] -_08061AFE: - add r2, sp, 0x5C - movs r0, 0 - strh r0, [r2] - mov r1, sp - adds r1, 0x72 - strh r0, [r1] - ldr r3, _08061BB4 - strh r0, [r3, 0x18] - subs r1, 0x56 - str r1, [sp, 0x12C] - add r2, sp, 0x80 - mov r9, r2 - adds r7, r3, 0 -_08061B18: - movs r0, 0 - mov r10, r0 - movs r1, 0 - str r1, [sp, 0x120] - movs r2, 0 - str r2, [sp, 0x124] - movs r0, 0x1 - str r0, [sp, 0x128] - ldr r4, _08061BB8 - ldr r1, _08061BBC - add r2, sp, 0x118 - ldrb r2, [r2] - strb r2, [r1] - add r0, sp, 0x114 - ldrb r0, [r0] - strb r0, [r1, 0x1] - movs r0, 0xA - strb r0, [r1, 0x2] - mov r2, r10 - strb r2, [r1, 0x3] - add r0, sp, 0xB0 - movs r1, 0x1 - bl sub_803ECB4 - ldr r0, [sp, 0x12C] - ldr r1, [sp, 0x110] - bl sub_8069844 - ldr r1, [sp, 0x114] - lsls r0, r1, 2 - mov r5, sp - adds r5, r0 - adds r5, 0x4 - ldr r0, [r5] - mov r2, r10 - str r2, [sp] - ldr r2, [sp, 0x12C] - add r3, sp, 0x80 - bl CreatePokemonInfoTabScreen - add r0, sp, 0x114 - ldrh r0, [r0] - strh r0, [r7, 0x1E] - add r1, sp, 0x118 - ldrh r1, [r1] - strh r1, [r7, 0x20] - movs r2, 0 - ldrsh r0, [r4, r2] - adds r0, 0xF - lsls r0, 3 - strh r0, [r7, 0xC] - movs r1, 0x2 - ldrsh r0, [r4, r1] - adds r0, 0x1 - lsls r0, 3 - subs r0, 0x2 - strh r0, [r7, 0xE] - mov r2, r10 - strh r2, [r7, 0x14] - strh r2, [r7, 0x4] - movs r0, 0x10 - strh r0, [r7, 0x6] - mov r0, r10 - str r0, [r7] - adds r0, r7, 0 - adds r0, 0x28 - bl sub_801317C - mov r1, r10 - strh r1, [r7, 0x18] - strh r1, [r7, 0x1A] - strh r1, [r7, 0x1C] - ldr r5, [r5] - cmp r5, 0x1 - bne _08061C10 - movs r2, 0 - add r1, sp, 0x8C - b _08061BC8 - .align 2, 0 -_08061BB4: .4byte gUnknown_202EE10 -_08061BB8: .4byte gUnknown_2027370 -_08061BBC: .4byte gUnknown_202F270 -_08061BC0: - adds r1, 0x4 - adds r2, 0x1 - cmp r2, 0x7 - bgt _08061BCE -_08061BC8: - ldr r0, [r1] - cmp r0, 0 - bne _08061BC0 -_08061BCE: - cmp r2, 0 - beq _08061C44 - movs r0, 0x1 - str r0, [sp, 0x124] - strh r2, [r7, 0x1A] - b _08061C38 -_08061BDA: - movs r0, 0x18 - ldrsh r2, [r7, r0] - lsls r1, r2, 2 - add r0, sp, 0x8C - adds r0, r1 - ldr r4, [r0] - mov r8, r2 - bl sub_8083D44 - adds r0, r4, 0 - bl sub_806285C - movs r1, 0 - str r1, [sp, 0x128] - b _080621E4 -_08061BF8: - movs r2, 0x18 - ldrsh r0, [r7, r2] - mov r2, r9 - adds r1, r2, r0 - ldrb r4, [r1] - mov r8, r0 - bl sub_8083D44 - adds r0, r4, 0 - bl sub_806262C - b _08062082 -_08061C10: - cmp r5, 0x4 - bne _08061C48 - movs r1, 0 - add r2, sp, 0x80 - ldrb r0, [r2] - cmp r0, 0 - beq _08061C2E - mov r2, r9 -_08061C20: - adds r1, 0x1 - cmp r1, 0x7 - bgt _08061C2E - adds r0, r2, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _08061C20 -_08061C2E: - cmp r1, 0 - beq _08061C44 - movs r0, 0x1 - str r0, [sp, 0x120] - strh r1, [r7, 0x1A] -_08061C38: - movs r0, 0x8 - strh r0, [r7, 0x1C] - adds r0, r7, 0 - movs r1, 0 - bl sub_80137B0 -_08061C44: - mov r1, r8 - strh r1, [r7, 0x18] -_08061C48: - ldr r0, _08061CF8 - bl AddMenuCursorSprite - movs r0, 0 - ldr r1, _08061CFC - bl sub_8014140 - adds r4, r0, 0 - movs r5, 0 - movs r6, 0 - ldr r2, [sp, 0x120] - cmp r2, 0 - beq _08061C80 - mov r1, r9 - ldrb r0, [r1, 0x8] - cmp r0, 0 - beq _08061C70 - movs r5, 0x1 - bl sub_80623B0 -_08061C70: - add r1, sp, 0x5C - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _08061C80 - movs r6, 0x1 - bl sub_8062230 -_08061C80: - ldr r2, [sp, 0x124] - cmp r2, 0 - beq _08061CA6 - mov r1, r9 - ldr r0, [r1, 0x2C] - cmp r0, 0 - beq _08061C94 - movs r5, 0x1 - bl sub_80623B0 -_08061C94: - movs r1, 0x72 - add r1, sp - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _08061CA6 - movs r6, 0x1 - bl sub_8062230 -_08061CA6: - movs r0, 0x1C - bl sub_803E46C - ldr r0, _08061D00 - ldrb r0, [r0] - cmp r0, 0x1 - bls _08061D4E - bl sub_80048C8 - lsls r0, 24 - cmp r0, 0 - bne _08061D4E - ldr r0, _08061D04 - ldrh r1, [r0, 0x2] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08061CD6 - ldr r2, _08061CF8 - adds r0, r2, 0 - adds r0, 0x2B - ldrb r0, [r0] - cmp r0, 0 - beq _08061D08 -_08061CD6: - movs r0, 0 - bl sub_8083CE0 - ldr r2, [sp, 0x114] - adds r2, 0x1 - str r2, [sp, 0x114] - lsls r0, r2, 2 - add r0, sp - adds r0, 0x4 - ldr r0, [r0] - cmp r0, 0 - beq _08061CF0 - b _080621E6 -_08061CF0: - movs r0, 0 - str r0, [sp, 0x114] - b _080621E6 - .align 2, 0 -_08061CF8: .4byte gUnknown_202EE10 -_08061CFC: .4byte gUnknown_8106B8C -_08061D00: .4byte gUnknown_202F270 -_08061D04: .4byte gRealInputs -_08061D08: - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - bne _08061D1A - adds r0, r2, 0 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0 - beq _08061D4E -_08061D1A: - movs r0, 0 - bl sub_8083CE0 - ldr r1, [sp, 0x114] - subs r1, 0x1 - str r1, [sp, 0x114] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _08061D30 - b _080621E6 -_08061D30: - movs r2, 0x5 - str r2, [sp, 0x114] - ldr r0, [sp, 0x18] - cmp r0, 0 - beq _08061D3C - b _080621E6 -_08061D3C: - add r1, sp, 0x18 -_08061D3E: - subs r1, 0x4 - ldr r0, [sp, 0x114] - subs r0, 0x1 - str r0, [sp, 0x114] - ldr r0, [r1] - cmp r0, 0 - beq _08061D3E - b _080621E6 -_08061D4E: - ldr r1, [sp, 0x124] - cmp r1, 0 - bne _08061D56 - b _08061E8A -_08061D56: - cmp r4, 0x2 - bne _08061D98 - cmp r5, 0 - beq _08061D98 - movs r0, 0 - bl sub_8083CE0 - mov r2, r9 - ldr r0, [r2, 0x2C] - cmp r0, 0 - beq _08061D8E - ldr r5, _08061D94 - movs r4, 0x5 -_08061D70: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061D70 - movs r1, 0x72 - add r1, sp - ldrh r0, [r1] - adds r0, 0x1 - strh r0, [r1] -_08061D8E: - movs r2, 0x7 - mov r8, r2 - b _080621E6 - .align 2, 0 -_08061D94: .4byte gIwramTextFunc1 -_08061D98: - ldr r0, _08061DDC - ldrh r1, [r0, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08061DF0 - movs r0, 0 - bl sub_8083CE0 - ldr r1, _08061DE0 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r0, 0x7 - bne _08061DE8 - mov r1, r9 - ldr r0, [r1, 0x2C] - cmp r0, 0 - bne _08061DBE - b _08061F04 -_08061DBE: - ldr r5, _08061DE4 - movs r4, 0x5 -_08061DC2: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061DC2 - movs r2, 0x72 - add r2, sp - b _08061EFE - .align 2, 0 -_08061DDC: .4byte gRealInputs -_08061DE0: .4byte gUnknown_202EE10 -_08061DE4: .4byte gIwramTextFunc1 -_08061DE8: - adds r0, r1, 0 - movs r1, 0 - bl sub_80136E0 -_08061DF0: - cmp r4, 0x1 - bne _08061E28 - cmp r6, 0 - beq _08061E28 - movs r2, 0x72 - add r2, sp - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0 - bne _08061E06 - b _08061F96 -_08061E06: - ldr r5, _08061E24 - movs r4, 0x5 -_08061E0A: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061E0A - movs r1, 0x72 - add r1, sp - b _08061F90 - .align 2, 0 -_08061E24: .4byte gIwramTextFunc2 -_08061E28: - ldr r0, _08061E74 - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - bne _08061E36 - b _08061FB0 -_08061E36: - movs r0, 0x1 - bl sub_8083CE0 - ldr r1, _08061E78 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _08061E80 - movs r2, 0x72 - add r2, sp - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0 - bne _08061E54 - b _08061F96 -_08061E54: - ldr r5, _08061E7C - movs r4, 0x5 -_08061E58: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061E58 - movs r1, 0x72 - add r1, sp - b _08061F90 - .align 2, 0 -_08061E74: .4byte gRealInputs -_08061E78: .4byte gUnknown_202EE10 -_08061E7C: .4byte gIwramTextFunc2 -_08061E80: - adds r0, r1, 0 - movs r1, 0 - bl sub_8013744 - b _08061FB0 -_08061E8A: - ldr r0, [sp, 0x120] - cmp r0, 0 - bne _08061E92 - b _08061FB0 -_08061E92: - cmp r4, 0x2 - bne _08061EC0 - cmp r5, 0 - beq _08061EC0 - mov r1, r9 - ldrb r0, [r1, 0x8] - cmp r0, 0 - beq _08061F04 - ldr r5, _08061EBC - movs r4, 0x5 -_08061EA6: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061EA6 - b _08061EFC - .align 2, 0 -_08061EBC: .4byte gIwramTextFunc1 -_08061EC0: - ldr r0, _08061F0C - ldrh r1, [r0, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08061F20 - movs r0, 0x1 - bl sub_8083CE0 - ldr r1, _08061F10 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r0, 0x7 - bne _08061F18 - mov r1, r9 - ldrb r0, [r1, 0x8] - cmp r0, 0 - beq _08061F04 - ldr r5, _08061F14 - movs r4, 0x5 -_08061EE8: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061EE8 -_08061EFC: - add r2, sp, 0x5C -_08061EFE: - ldrh r0, [r2] - adds r0, 0x1 - strh r0, [r2] -_08061F04: - movs r0, 0x7 - mov r8, r0 - b _080621E6 - .align 2, 0 -_08061F0C: .4byte gRealInputs -_08061F10: .4byte gUnknown_202EE10 -_08061F14: .4byte gIwramTextFunc1 -_08061F18: - adds r0, r1, 0 - movs r1, 0 - bl sub_80136E0 -_08061F20: - cmp r4, 0x1 - bne _08061F50 - cmp r6, 0 - beq _08061F50 - add r2, sp, 0x5C - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0 - beq _08061F96 - ldr r5, _08061F4C - movs r4, 0x5 -_08061F36: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061F36 - b _08061F8E - .align 2, 0 -_08061F4C: .4byte gIwramTextFunc2 -_08061F50: - ldr r0, _08061F9C - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08061FB0 - movs r0, 0x1 - bl sub_8083CE0 - ldr r1, _08061FA0 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _08061FA8 - add r2, sp, 0x5C - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0 - beq _08061F96 - ldr r5, _08061FA4 - movs r4, 0x5 -_08061F7A: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x1C - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08061F7A -_08061F8E: - add r1, sp, 0x5C -_08061F90: - ldrh r0, [r1] - subs r0, 0x1 - strh r0, [r1] -_08061F96: - movs r2, 0 - mov r8, r2 - b _080621E6 - .align 2, 0 -_08061F9C: .4byte gRealInputs -_08061FA0: .4byte gUnknown_202EE10 -_08061FA4: .4byte gIwramTextFunc2 -_08061FA8: - adds r0, r1, 0 - movs r1, 0 - bl sub_8013744 -_08061FB0: - bl sub_80048C8 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - beq _08061FBE - b _08061C48 -_08061FBE: - ldr r5, _0806208C - ldrh r1, [r5, 0x2] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _08061FDA - ldr r0, [sp, 0x124] - cmp r0, 0 - beq _08061FD2 - b _08061BDA -_08061FD2: - ldr r2, [sp, 0x120] - cmp r2, 0 - beq _08061FDA - b _08061BF8 -_08061FDA: - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08061FF0 - ldr r2, _08062090 - adds r0, r2, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - bne _08061FF0 - b _080621CA -_08061FF0: - ldr r0, [sp, 0x124] - cmp r0, 0 - beq _080620BC - movs r1, 0x18 - ldrsh r2, [r7, r1] - lsls r1, r2, 2 - add r0, sp, 0x8C - adds r0, r1 - ldr r6, [r0] - mov r8, r2 - bl sub_8062D68 - ldr r0, _08062094 - str r4, [r0] - bl sub_8083D08 - movs r0, 0xC - movs r1, 0 - bl sub_8044F5C - add r0, sp, 0xB0 - movs r1, 0x16 - bl sub_805FC30 - ldr r4, _08062090 - movs r2, 0x2A - adds r2, r4 - mov r10, r2 -_08062028: - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x1C - bl sub_803E46C - ldrh r1, [r5, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _0806204C - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80136E0 -_0806204C: - ldrh r1, [r5, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08062064 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8013744 -_08062064: - ldrh r1, [r5, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062078 - adds r0, r4, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08062098 -_08062078: - bl sub_8083D08 - adds r0, r6, 0 - bl sub_806285C -_08062082: - movs r0, 0 - str r0, [sp, 0x128] - mov r10, r0 - b _080621E6 - .align 2, 0 -_0806208C: .4byte gRealInputs -_08062090: .4byte gUnknown_202EE10 -_08062094: .4byte gUnknown_202EE6C -_08062098: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080620A8 - mov r1, r10 - ldrb r0, [r1] - cmp r0, 0 - beq _08062028 -_080620A8: - bl sub_8083D30 - b _080621BA -_080620AE: - bl sub_8083D08 - movs r1, 0x18 - ldrsh r0, [r7, r1] - cmp r0, 0 - bne _080621B0 - b _08062198 -_080620BC: - ldr r2, [sp, 0x120] - cmp r2, 0 - bne _080620C4 - b _080621C0 -_080620C4: - movs r0, 0x18 - ldrsh r1, [r7, r0] - mov r2, r9 - adds r0, r2, r1 - ldrb r6, [r0] - mov r8, r1 - bl sub_8062D68 - ldr r0, _08062190 - ldr r1, [sp, 0x124] - str r1, [r0] - bl sub_8083D08 - movs r0, 0x28 - movs r1, 0 - bl sub_8044F5C - movs r0, 0xC - movs r1, 0 - bl sub_8044F5C - ldr r0, [sp, 0x110] - movs r1, 0x1 - bl CheckVariousStatuses2 - lsls r0, 24 - cmp r0, 0 - beq _08062102 - movs r0, 0x28 - bl sub_8044FF0 -_08062102: - add r0, sp, 0xB0 - movs r1, 0x16 - bl sub_805FC30 - ldr r4, _08062194 - movs r2, 0x2A - adds r2, r4 - mov r10, r2 -_08062112: - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x1C - bl sub_803E46C - ldrh r1, [r5, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08062136 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80136E0 -_08062136: - ldrh r1, [r5, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _0806214E - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8013744 -_0806214E: - ldrh r1, [r5, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062162 - adds r0, r4, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08062174 -_08062162: - movs r1, 0x18 - ldrsh r0, [r4, r1] - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - bne _080620AE - bl sub_8083D30 -_08062174: - ldrh r1, [r5, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08062186 - mov r2, r10 - ldrb r0, [r2] - cmp r0, 0 - beq _08062112 -_08062186: - bl sub_8083D30 - movs r0, 0 - mov r10, r0 - b _080621E6 - .align 2, 0 -_08062190: .4byte gUnknown_202EE6C -_08062194: .4byte gUnknown_202EE10 -_08062198: - ldr r0, _080621AC - bl PlaySoundEffect - ldr r0, [sp, 0x11C] - adds r0, 0x8C - adds r1, r6, 0 - bl ToggleIQSkill - b _080621BA - .align 2, 0 -_080621AC: .4byte 0x00000133 -_080621B0: - adds r0, r6, 0 - bl sub_806262C - movs r1, 0 - str r1, [sp, 0x128] -_080621BA: - movs r2, 0 - mov r10, r2 - b _080621E6 -_080621C0: - bl sub_8083D08 - movs r0, 0x1 - mov r10, r0 - b _080621E6 -_080621CA: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080621DE - adds r0, r2, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - bne _080621DE - b _08061C48 -_080621DE: - bl sub_8083D30 - movs r1, 0x1 -_080621E4: - mov r10, r1 -_080621E6: - ldr r2, [sp, 0x128] - cmp r2, 0 - beq _08062204 - ldr r0, [sp, 0x120] - cmp r0, 0 - bne _080621F8 - ldr r1, [sp, 0x124] - cmp r1, 0 - beq _080621FE -_080621F8: - ldr r0, _0806222C - bl AddMenuCursorSprite -_080621FE: - movs r0, 0x1C - bl sub_803E46C -_08062204: - mov r2, r10 - cmp r2, 0 - bne _0806220C - b _08061B18 -_0806220C: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - ldr r0, [sp, 0x110] - bl LoadIQSkills - add sp, 0x130 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806222C: .4byte gUnknown_202EE10 - thumb_func_end sub_8061A38 - - thumb_func_start sub_8062230 -sub_8062230: - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - sub sp, 0x8 - ldr r0, _08062380 - ldr r0, [r0] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - bne _08062248 - b _08062372 -_08062248: - ldr r0, _08062384 - mov r9, r0 - movs r0, 0 - movs r1, 0 - str r0, [sp] - str r1, [sp, 0x4] - mov r0, sp - ldrh r0, [r0] - ldr r1, _08062388 - ands r1, r0 - ldr r3, _0806238C - ldr r0, [sp] - ands r0, r3 - orrs r0, r1 - str r0, [sp] - mov r1, sp - ldrh r1, [r1] - adds r2, r3, 0 - ands r2, r0 - orrs r2, r1 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _08062390 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r6, _08062394 - mov r8, r6 - mov r0, r8 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _08062398 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _0806239C - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - movs r4, 0x80 - lsls r4, 7 - mov r0, sp - ldrh r1, [r0] - ldr r6, _080623A0 - adds r0, r6, 0 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - orrs r4, r0 - ands r3, r1 - orrs r3, r4 - str r3, [sp] - movs r1, 0x80 - lsls r1, 6 - mov r5, sp - ldrh r0, [r5, 0x2] - ldr r2, _080623A4 - ands r2, r0 - orrs r2, r1 - ands r2, r6 - movs r3, 0xFC - lsls r3, 2 - ldrh r1, [r5, 0x4] - movs r0, 0xFC - lsls r0, 8 - ands r0, r1 - orrs r0, r3 - mov r1, r8 - ands r0, r1 - movs r3, 0xF - movs r1, 0xF0 - lsls r1, 8 - ldr r4, _080623A8 - ands r0, r4 - orrs r0, r1 - strh r0, [r5, 0x4] - mov r6, r9 - movs r1, 0x2 - ldrsh r0, [r6, r1] - lsls r0, 3 - adds r0, 0x8 - ands r0, r4 - lsls r0, 4 - ldrh r1, [r5, 0x6] - ands r3, r1 - orrs r3, r0 - strh r3, [r5, 0x6] - movs r3, 0 - ldrsh r0, [r6, r3] - lsls r0, 3 - adds r0, 0x40 - ldr r1, _080623AC - ands r0, r1 - movs r1, 0xFE - lsls r1, 8 - ands r2, r1 - orrs r2, r0 - strh r2, [r5, 0x2] - movs r1, 0x80 - lsls r1, 1 - mov r0, sp - movs r2, 0 - movs r3, 0 - bl AddSprite -_08062372: - add sp, 0x8 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08062380: .4byte gUnknown_202EDCC -_08062384: .4byte gUnknown_2027370 -_08062388: .4byte 0x0000feff -_0806238C: .4byte 0xffff0000 -_08062390: .4byte 0x0000fdff -_08062394: .4byte 0x0000f3ff -_08062398: .4byte 0x0000efff -_0806239C: .4byte 0x0000dfff -_080623A0: .4byte 0x00003fff -_080623A4: .4byte 0x0000c1ff -_080623A8: .4byte 0x00000fff -_080623AC: .4byte 0x000001ff - thumb_func_end sub_8062230 - - thumb_func_start sub_80623B0 -sub_80623B0: - push {r4-r6,lr} - sub sp, 0x8 - ldr r0, _080624D4 - ldr r0, [r0] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - bne _080623C2 - b _080624CA -_080623C2: - ldr r6, _080624D8 - movs r0, 0 - movs r1, 0 - str r0, [sp] - str r1, [sp, 0x4] - mov r0, sp - ldrh r0, [r0] - ldr r1, _080624DC - ands r1, r0 - ldr r3, _080624E0 - ldr r0, [sp] - ands r0, r3 - orrs r0, r1 - str r0, [sp] - mov r1, sp - ldrh r1, [r1] - adds r2, r3, 0 - ands r2, r0 - orrs r2, r1 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _080624E4 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r5, _080624E8 - adds r0, r5, 0 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _080624EC - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _080624F0 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - movs r4, 0x80 - lsls r4, 7 - mov r0, sp - ldrh r1, [r0] - ldr r0, _080624F4 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - orrs r4, r0 - ands r3, r1 - orrs r3, r4 - str r3, [sp] - mov r3, sp - movs r2, 0xFC - lsls r2, 2 - ldrh r1, [r3, 0x4] - movs r0, 0xFC - lsls r0, 8 - ands r0, r1 - orrs r0, r2 - ands r0, r5 - movs r2, 0xF - movs r1, 0xF0 - lsls r1, 8 - ldr r4, _080624F8 - ands r0, r4 - orrs r0, r1 - strh r0, [r3, 0x4] - movs r1, 0x2 - ldrsh r0, [r6, r1] - lsls r0, 3 - adds r0, 0x70 - ands r0, r4 - lsls r0, 4 - ldrh r1, [r3, 0x6] - ands r2, r1 - orrs r2, r0 - strh r2, [r3, 0x6] - movs r1, 0 - ldrsh r0, [r6, r1] - lsls r0, 3 - adds r0, 0x40 - ldr r1, _080624FC - ands r0, r1 - strh r0, [r3, 0x2] - subs r1, 0xFF - mov r0, sp - movs r2, 0 - movs r3, 0 - bl AddSprite -_080624CA: - add sp, 0x8 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080624D4: .4byte gUnknown_202EDCC -_080624D8: .4byte gUnknown_2027370 -_080624DC: .4byte 0x0000feff -_080624E0: .4byte 0xffff0000 -_080624E4: .4byte 0x0000fdff -_080624E8: .4byte 0x0000f3ff -_080624EC: .4byte 0x0000efff -_080624F0: .4byte 0x0000dfff -_080624F4: .4byte 0x00003fff -_080624F8: .4byte 0x00000fff -_080624FC: .4byte 0x000001ff - thumb_func_end sub_80623B0 - - thumb_func_start sub_8062500 -sub_8062500: - push {r4,r5,lr} - ldr r0, _0806257C - ldr r0, [r0] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - beq _08062574 - ldr r5, _08062580 - ldr r0, _08062584 - ldrh r2, [r0] - ldr r1, _08062588 - ands r1, r2 - ldr r2, _0806258C - ands r1, r2 - ldr r4, _08062590 - ands r1, r4 - ldr r2, _08062594 - ands r1, r2 - ldr r2, _08062598 - ands r1, r2 - movs r3, 0x80 - lsls r3, 7 - ldr r2, _0806259C - ands r1, r2 - orrs r1, r3 - strh r1, [r0] - movs r3, 0xFC - lsls r3, 2 - ldrh r2, [r0, 0x4] - movs r1, 0xFC - lsls r1, 8 - ands r1, r2 - orrs r1, r3 - ands r1, r4 - movs r3, 0xF - movs r2, 0xF0 - lsls r2, 8 - ldr r4, _080625A0 - ands r1, r4 - orrs r1, r2 - strh r1, [r0, 0x4] - movs r2, 0x2 - ldrsh r1, [r5, r2] - lsls r1, 3 - adds r1, 0x60 - ands r1, r4 - lsls r1, 4 - ldrh r2, [r0, 0x6] - ands r3, r2 - orrs r3, r1 - strh r3, [r0, 0x6] - movs r1, 0x70 - strh r1, [r0, 0x2] - adds r1, 0x90 - movs r2, 0 - movs r3, 0 - bl AddSprite -_08062574: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0806257C: .4byte gUnknown_202EDCC -_08062580: .4byte gUnknown_2027370 -_08062584: .4byte gUnknown_202F268 -_08062588: .4byte 0x0000feff -_0806258C: .4byte 0x0000fdff -_08062590: .4byte 0x0000f3ff -_08062594: .4byte 0x0000efff -_08062598: .4byte 0x0000dfff -_0806259C: .4byte 0x00003fff -_080625A0: .4byte 0x00000fff - thumb_func_end sub_8062500 - - thumb_func_start sub_80625A4 -sub_80625A4: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0xC - adds r7, r0, 0 - mov r9, r1 - mov r0, sp - bl sub_801317C - movs r4, 0 - cmp r4, r7 - bge _0806261A - subs r0, r7, 0x1 - mov r8, r0 - mov r5, sp -_080625C4: - lsls r0, r4, 2 - add r0, r9 - ldr r0, [r0] - mov r1, sp - bl sub_80639E4 - adds r6, r4, 0x1 - b _080625E8 -_080625D4: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080625E2 - ldrb r0, [r5, 0x2] - cmp r0, 0 - beq _080625E8 -_080625E2: - bl sub_8083D30 - b _08062614 -_080625E8: - cmp r4, r8 - bge _080625F0 - bl sub_8062500 -_080625F0: - mov r0, sp - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _08062628 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062610 - ldrb r0, [r5, 0x1] - cmp r0, 0 - beq _080625D4 -_08062610: - bl sub_8083D08 -_08062614: - adds r4, r6, 0 - cmp r4, r7 - blt _080625C4 -_0806261A: - add sp, 0xC - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08062628: .4byte gRealInputs - thumb_func_end sub_80625A4 - - thumb_func_start sub_806262C -sub_806262C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x88 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - mov r0, sp - adds r0, 0x70 - str r0, [sp, 0x84] - add r0, sp, 0x10 - mov r8, r0 - movs r0, 0 - mov r9, r0 - add r7, sp, 0x4 - add r6, sp, 0x80 -_08062650: - add r0, sp, 0x4 - bl sub_801317C - mov r0, r8 - bl sub_80140B4 - mov r0, r8 - str r6, [r0, 0x14] - movs r1, 0x1 - add r0, sp, 0x80 - strb r1, [r0] - mov r0, r9 - strb r0, [r6, 0x1] - movs r0, 0x10 - strb r0, [r6, 0x2] - mov r0, r9 - strb r0, [r6, 0x3] - mov r0, r8 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - mov r0, r10 - bl GetIQSkillName - adds r1, r0, 0 - ldr r0, _080626CC - bl strcpy - ldr r0, _080626D0 - ldr r2, [r0] - mov r0, r9 - str r0, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - mov r0, r10 - bl GetIQSkillDescription - adds r2, r0, 0 - mov r0, r9 - str r0, [sp] - movs r0, 0x8 - movs r1, 0x10 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - mov r0, r10 - bl GetIQSkillDescription - ldr r1, [sp, 0x84] - bl sub_8097DF0 - adds r5, r0, 0 - b _080626EA - .align 2, 0 -_080626CC: .4byte gFormatBuffer_Items -_080626D0: .4byte gUnknown_80FE95C -_080626D4: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080626E2 - ldrb r0, [r7, 0x2] - cmp r0, 0 - beq _080626EA -_080626E2: - movs r4, 0x1 - bl sub_8083D30 - b _08062718 -_080626EA: - cmp r5, 0 - beq _080626F2 - bl sub_8062500 -_080626F2: - add r0, sp, 0x4 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _0806272C - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062712 - ldrb r0, [r7, 0x1] - cmp r0, 0 - beq _080626D4 -_08062712: - movs r4, 0 - bl sub_8083D08 -_08062718: - cmp r4, 0 - bne _08062730 - cmp r5, 0 - beq _08062730 - adds r0, r5, 0 - ldr r1, [sp, 0x84] - bl sub_80625A4 - b _08062650 - .align 2, 0 -_0806272C: .4byte gRealInputs -_08062730: - movs r0, 0x4 - movs r1, 0x3E - bl sub_803E708 - add sp, 0x88 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806262C - - thumb_func_start sub_8062748 -sub_8062748: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x88 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - mov r0, sp - adds r0, 0x70 - str r0, [sp, 0x84] - add r0, sp, 0x10 - mov r8, r0 - movs r0, 0 - mov r9, r0 - add r7, sp, 0x4 - add r6, sp, 0x80 -_0806276C: - add r0, sp, 0x4 - bl sub_801317C - mov r0, r8 - bl sub_80140B4 - mov r0, r8 - str r6, [r0, 0x14] - movs r1, 0x1 - add r0, sp, 0x80 - strb r1, [r0] - mov r0, r9 - strb r0, [r6, 0x1] - movs r0, 0x10 - strb r0, [r6, 0x2] - mov r0, r9 - strb r0, [r6, 0x3] - mov r0, r8 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - ldr r0, _080627E0 - mov r1, r10 - bl CopyTacticsNameToBuffer - ldr r0, _080627E4 - ldr r2, [r0] - mov r0, r9 - str r0, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - mov r0, r10 - bl GetTacticsDescription - adds r2, r0, 0 - mov r0, r9 - str r0, [sp] - movs r0, 0x8 - movs r1, 0x10 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - mov r0, r10 - bl GetTacticsDescription - ldr r1, [sp, 0x84] - bl sub_8097DF0 - adds r5, r0, 0 - b _080627FE - .align 2, 0 -_080627E0: .4byte gFormatBuffer_Items -_080627E4: .4byte gUnknown_80FE960 -_080627E8: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080627F6 - ldrb r0, [r7, 0x2] - cmp r0, 0 - beq _080627FE -_080627F6: - movs r4, 0x1 - bl sub_8083D30 - b _0806282C -_080627FE: - cmp r5, 0 - beq _08062806 - bl sub_8062500 -_08062806: - add r0, sp, 0x4 - movs r1, 0 - bl nullsub_34 - movs r0, 0x3E - bl sub_803E46C - ldr r0, _08062840 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062826 - ldrb r0, [r7, 0x1] - cmp r0, 0 - beq _080627E8 -_08062826: - movs r4, 0 - bl sub_8083D08 -_0806282C: - cmp r4, 0 - bne _08062844 - cmp r5, 0 - beq _08062844 - adds r0, r5, 0 - ldr r1, [sp, 0x84] - bl sub_80625A4 - b _0806276C - .align 2, 0 -_08062840: .4byte gRealInputs -_08062844: - movs r0, 0x4 - movs r1, 0x3E - bl sub_803E708 - add sp, 0x88 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8062748 - - thumb_func_start sub_806285C -sub_806285C: - push {r4-r6,lr} - mov r6, r10 - mov r5, r9 - mov r4, r8 - push {r4-r6} - sub sp, 0xD4 - mov r10, r0 - add r0, sp, 0x10 - mov r8, r0 - add r5, sp, 0x70 - adds r0, r5, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x74] - add r1, sp, 0x78 - movs r6, 0 - movs r0, 0 - mov r9, r0 - movs r0, 0x2 - strh r0, [r1] - strh r0, [r1, 0x2] - add r1, sp, 0x7C - movs r0, 0x1A - strh r0, [r1] - mov r0, sp - adds r0, 0x7E - movs r1, 0xC - strh r1, [r0] - add r0, sp, 0x80 - strh r1, [r0] - add r0, sp, 0x84 - add r4, sp, 0xD0 - str r4, [r0] - add r0, sp, 0x88 - movs r1, 0x3 - str r1, [r0, 0x4] - add r0, sp, 0xA0 - str r1, [r0, 0x4] - add r0, sp, 0xB8 - str r1, [r0, 0x4] - mov r0, r8 - adds r1, r5, 0 - movs r2, 0x60 - bl memcpy - add r0, sp, 0x4 - bl sub_801317C - movs r0, 0x1 - strb r0, [r4] - strb r6, [r4, 0x1] - movs r0, 0x10 - strb r0, [r4, 0x2] - strb r6, [r4, 0x3] - mov r0, r8 - movs r1, 0x1 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - mov r0, r10 - bl sub_808E4FC - adds r1, r0, 0 - ldr r0, _0806291C - bl strcpy - ldr r0, _08062920 - ldr r2, [r0] - mov r0, r9 - str r0, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - mov r0, r10 - bl sub_808E51C - adds r2, r0, 0 - mov r0, r9 - str r0, [sp] - movs r0, 0x8 - movs r1, 0x10 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - add r4, sp, 0x4 - b _08062938 - .align 2, 0 -_0806291C: .4byte gFormatBuffer_Items -_08062920: .4byte gUnknown_80FE964 -_08062924: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08062932 - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _08062938 -_08062932: - bl sub_8083D30 - b _0806295C -_08062938: - add r0, sp, 0x4 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _08062974 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062958 - ldrb r0, [r4, 0x1] - cmp r0, 0 - beq _08062924 -_08062958: - bl sub_8083D08 -_0806295C: - movs r0, 0x4 - movs r1, 0x3E - bl sub_803E708 - add sp, 0xD4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08062974: .4byte gRealInputs - thumb_func_end sub_806285C - - thumb_func_start DrawFieldGiveItemMenu -DrawFieldGiveItemMenu: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x80 - mov r8, r0 - adds r6, r1, 0 - add r4, sp, 0x1C - ldr r1, _080629AC - adds r0, r4, 0 - movs r2, 0x60 - bl memcpy - movs r0, 0 - str r0, [sp, 0x7C] - mov r1, r8 - cmp r1, 0 - beq _080629A2 - subs r0, 0x1 - str r0, [r1] -_080629A2: - cmp r6, 0x1 - bne _080629BA - add r1, sp, 0x4C - ldr r0, _080629B0 - b _080629C2 - .align 2, 0 -_080629AC: .4byte gUnknown_8106C30 -_080629B0: .4byte gUnknown_8106C00 -_080629B4: - bl sub_8083D08 - b _08062AF4 -_080629BA: - cmp r6, 0x2 - bne _080629CA - add r1, sp, 0x4C - ldr r0, _08062A38 -_080629C2: - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} -_080629CA: - add r0, sp, 0x4 - adds r1, r4, 0 - movs r2, 0 - bl DrawFieldTeamMenu - movs r0, 0x1 - bl sub_80073B8 - ldr r0, _08062A3C - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x4 - movs r1, 0x3 - movs r3, 0x1 - bl PrintStringOnWindow - movs r0, 0x1 - bl sub_80073E0 - ldr r0, _08062A40 - mov r9, r0 - add r7, sp, 0x8 - ldr r1, _08062A44 - mov r10, r1 -_080629FC: - mov r2, r10 - movs r3, 0x18 - ldrsh r0, [r2, r3] - lsls r0, 2 - adds r0, r7, r0 - ldr r5, [r0] - cmp r5, 0 - blt _08062A70 - ldr r0, _08062A48 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08062A4C - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _08062A5A - cmp r9, r5 - beq _08062A5A - cmp r6, 0x1 - bne _08062A50 - adds r0, r4, 0 - bl sub_8062B74 - b _08062A5A - .align 2, 0 -_08062A38: .4byte gUnknown_8106C18 -_08062A3C: .4byte gWhichTextPtr2 -_08062A40: .4byte 0xfffffc27 -_08062A44: .4byte gUnknown_202EE10 -_08062A48: .4byte gDungeon -_08062A4C: .4byte 0x0001357c -_08062A50: - cmp r6, 0x2 - bne _08062A5A - adds r0, r4, 0 - bl sub_8062CA8 -_08062A5A: - mov r9, r5 - adds r0, r4, 0 - movs r1, 0 - bl sub_806A2BC - adds r0, r4, 0x4 - movs r1, 0 - movs r2, 0x1 - movs r3, 0x1 - bl sub_804A728 -_08062A70: - ldr r5, _08062B40 - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - ldr r4, _08062B44 - ldrh r1, [r4, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08062A98 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80136E0 -_08062A98: - ldrh r1, [r4, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08062AB0 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8013744 -_08062AB0: - ldrh r1, [r4, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062AC4 - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08062AD8 -_08062AC4: - movs r3, 0x18 - ldrsh r0, [r5, r3] - add r1, sp, 0x18 - adds r1, r0 - ldrb r0, [r1] - cmp r0, 0 - beq _08062AD4 - b _080629B4 -_08062AD4: - bl sub_8083D30 -_08062AD8: - ldr r0, _08062B44 - ldrh r1, [r0, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08062AEC - ldr r5, _08062B48 - ldrb r0, [r5] - cmp r0, 0 - beq _080629FC -_08062AEC: - bl sub_8083D30 - movs r0, 0x1 - str r0, [sp, 0x7C] -_08062AF4: - ldr r4, _08062B40 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - bl sub_804AA60 - bl GetLeader - movs r1, 0 - bl sub_806A2BC - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - movs r0, 0x4 - movs r1, 0x3E - bl sub_803E708 - ldr r1, [sp, 0x7C] - cmp r1, 0 - bne _08062B3C - movs r2, 0x18 - ldrsh r0, [r4, r2] - lsls r0, 2 - adds r0, r7, r0 - ldr r5, [r0] - mov r3, r8 - cmp r3, 0 - beq _08062B38 - str r5, [r3] -_08062B38: - cmp r5, 0 - bge _08062B4C -_08062B3C: - movs r0, 0 - b _08062B5A - .align 2, 0 -_08062B40: .4byte gUnknown_202EE10 -_08062B44: .4byte gRealInputs -_08062B48: .4byte gUnknown_202EE3A -_08062B4C: - ldr r0, _08062B6C - ldr r0, [r0] - lsls r1, r5, 2 - ldr r5, _08062B70 - adds r0, r5 - adds r0, r1 - ldr r0, [r0] -_08062B5A: - add sp, 0x80 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08062B6C: .4byte gDungeon -_08062B70: .4byte 0x0001357c - thumb_func_end DrawFieldGiveItemMenu - - thumb_func_start sub_8062B74 -sub_8062B74: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - mov r10, r0 - ldr r0, [r0, 0x70] - mov r9, r0 - movs r0, 0x2 - bl CallPrepareTextbox_8008C54 - movs r0, 0x2 - bl sub_80073B8 - ldr r0, _08062BD0 - mov r1, r10 - movs r2, 0 - bl SubstitutePlaceholderStringTags - ldr r0, _08062BD4 - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0xC - movs r1, 0 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - movs r1, 0x10 - mov r8, r1 - mov r0, r9 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08062BDE - mov r0, r9 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08062BCA - cmp r0, 0x47 - bne _08062BD8 -_08062BCA: - movs r0, 0x1 - b _08062BDA - .align 2, 0 -_08062BD0: .4byte gFormatBuffer_Monsters -_08062BD4: .4byte gUnknown_80FE978 -_08062BD8: - movs r0, 0 -_08062BDA: - cmp r0, 0 - beq _08062BF4 -_08062BDE: - ldr r2, _08062BF0 - movs r0, 0 - str r0, [sp] - movs r0, 0xC - mov r1, r8 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - b _08062C8A - .align 2, 0 -_08062BF0: .4byte gUnknown_8106C90 -_08062BF4: - movs r7, 0 - movs r4, 0x8C - lsls r4, 1 - add r4, r9 - adds r5, r4, 0 -_08062BFE: - add r0, sp, 0x4 - movs r1, 0 - movs r2, 0xC - bl memset - movs r0, 0x6A - str r0, [sp, 0x8] - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08062C80 - mov r1, r9 - ldrb r0, [r1, 0x7] - cmp r0, 0 - beq _08062C22 - movs r0, 0x2 - b _08062C24 -_08062C22: - movs r0, 0x4 -_08062C24: - str r0, [sp, 0x4] - mov r0, r10 - adds r1, r5, 0 - movs r2, 0x1 - bl CanMonsterUseMove - add r1, sp, 0x4 - movs r2, 0 - lsls r0, 24 - cmp r0, 0 - bne _08062C3C - movs r2, 0x1 -_08062C3C: - strb r2, [r1, 0x8] - ldr r0, _08062CA0 - adds r1, r5, 0 - add r2, sp, 0x4 - bl BufferMoveName - ldrb r1, [r4] - movs r0, 0x2 - ands r0, r1 - movs r6, 0xD - cmp r0, 0 - bne _08062C6C - movs r6, 0x8 - cmp r7, 0 - beq _08062C6C - mov r2, r8 - subs r2, 0x2 - movs r0, 0x7 - str r0, [sp] - movs r0, 0x2 - movs r1, 0xC - movs r3, 0x78 - bl sub_80078A4 -_08062C6C: - movs r0, 0 - str r0, [sp] - adds r0, r6, 0 - mov r1, r8 - ldr r2, _08062CA4 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - movs r0, 0xC - add r8, r0 -_08062C80: - adds r4, 0x8 - adds r5, 0x8 - adds r7, 0x1 - cmp r7, 0x3 - ble _08062BFE -_08062C8A: - movs r0, 0x2 - bl sub_80073E0 - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08062CA0: .4byte gFormatBuffer_Items -_08062CA4: .4byte gUnknown_8106C98 - thumb_func_end sub_8062B74 - - thumb_func_start sub_8062CA8 -sub_8062CA8: - push {r4-r7,lr} - sub sp, 0x4 - adds r4, r0, 0 - ldr r5, [r4, 0x70] - movs r0, 0x2 - bl CallPrepareTextbox_8008C54 - movs r0, 0x2 - bl sub_80073B8 - ldr r0, _08062CF8 - adds r1, r4, 0 - movs r2, 0 - bl SubstitutePlaceholderStringTags - ldr r0, _08062CFC - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0xC - movs r1, 0 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - movs r7, 0x8 - movs r6, 0x12 - adds r0, r5, 0 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08062D08 - adds r0, r5, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08062CF4 - cmp r0, 0x47 - bne _08062D00 -_08062CF4: - movs r0, 0x1 - b _08062D02 - .align 2, 0 -_08062CF8: .4byte gFormatBuffer_Monsters -_08062CFC: .4byte gUnknown_80FE940 -_08062D00: - movs r0, 0 -_08062D02: - adds r4, r0, 0 - cmp r4, 0 - beq _08062D18 -_08062D08: - ldr r2, _08062D14 - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - b _08062D2C - .align 2, 0 -_08062D14: .4byte gUnknown_8106C90 -_08062D18: - adds r2, r5, 0 - adds r2, 0x60 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062D3C - ldr r2, _08062D38 - str r4, [sp] - adds r0, r7, 0 -_08062D2C: - adds r1, r6, 0 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - b _08062D52 - .align 2, 0 -_08062D38: .4byte gUnknown_8106C9C -_08062D3C: - ldr r0, _08062D60 - adds r1, r2, 0 - bl sub_8045C18 - ldr r2, _08062D64 - str r4, [sp] - adds r0, r7, 0 - adds r1, r6, 0 - movs r3, 0x2 - bl PrintFormattedStringOnWindow -_08062D52: - movs r0, 0x2 - bl sub_80073E0 - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08062D60: .4byte gFormatBuffer_Items -_08062D64: .4byte gUnknown_8106C98 - thumb_func_end sub_8062CA8 - - thumb_func_start sub_8062D68 -sub_8062D68: - push {lr} - ldr r0, _08062D84 - movs r1, 0 - strh r1, [r0, 0x1E] - strh r1, [r0, 0x20] - strh r1, [r0, 0xC] - strh r1, [r0, 0xE] - strh r1, [r0, 0x14] - adds r0, 0x28 - bl sub_801317C - pop {r0} - bx r0 - .align 2, 0 -_08062D84: .4byte gUnknown_202EE10 - thumb_func_end sub_8062D68 - - thumb_func_start sub_8062D88 -sub_8062D88: - movs r0, 0x1 - bx lr - thumb_func_end sub_8062D88 - - thumb_func_start sub_8062D8C -sub_8062D8C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - mov r10, r0 - ldrb r5, [r0, 0x4] - ldr r0, _08062E24 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08062E28 - adds r0, r2 - adds r0, r1 - ldr r0, [r0] - str r0, [sp, 0x4] - adds r7, r0, 0 -_08062DAE: - movs r0, 0 - mov r9, r0 - movs r6, 0 - movs r4, 0 - adds r2, r7, 0x4 - mov r8, r2 -_08062DBA: - ldr r0, _08062E24 - ldr r0, [r0] - lsls r1, r4, 2 - ldr r2, _08062E28 - adds r0, r2 - adds r0, r1 - ldr r0, [r0] - bl sub_8071A8C - lsls r0, 24 - cmp r0, 0 - beq _08062DDA - cmp r4, r5 - bne _08062DD8 - mov r9, r6 -_08062DD8: - adds r6, 0x1 -_08062DDA: - adds r4, 0x1 - cmp r4, 0x3 - ble _08062DBA - adds r0, r7, 0 - movs r1, 0 - bl sub_806A2BC - mov r0, r8 - movs r1, 0 - movs r2, 0x1 - movs r3, 0x1 - bl sub_804A728 - movs r0, 0x1 - bl sub_8044C10 - str r6, [sp] - adds r0, r7, 0 - movs r1, 0 - movs r2, 0x1 - mov r3, r9 - bl sub_8062F90 - lsls r0, 24 - cmp r0, 0 - beq _08062E10 - b _08062F80 -_08062E10: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x6 - bne _08062E6C - adds r6, r5, 0 - movs r4, 0 - b _08062E2E - .align 2, 0 -_08062E24: .4byte gDungeon -_08062E28: .4byte 0x0001357c -_08062E2C: - adds r4, 0x1 -_08062E2E: - cmp r4, 0x3 - bgt _08062E54 - adds r5, 0x1 - cmp r5, 0x3 - ble _08062E3A - movs r5, 0 -_08062E3A: - ldr r0, _08062E64 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08062E68 - adds r0, r2 - adds r0, r1 - ldr r7, [r0] - adds r0, r7, 0 - bl sub_8071A8C - lsls r0, 24 - cmp r0, 0 - beq _08062E2C -_08062E54: - mov r0, r10 - strb r5, [r0, 0x4] - cmp r6, r5 - beq _08062F32 - movs r0, 0 - bl sub_8083CE0 - b _08062F32 - .align 2, 0 -_08062E64: .4byte gDungeon -_08062E68: .4byte 0x0001357c -_08062E6C: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x7 - bne _08062EC0 - adds r6, r5, 0 - movs r4, 0 - b _08062E80 -_08062E7E: - adds r4, 0x1 -_08062E80: - cmp r4, 0x3 - bgt _08062EA6 - subs r5, 0x1 - cmp r5, 0 - bge _08062E8C - movs r5, 0x3 -_08062E8C: - ldr r0, _08062EB8 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08062EBC - adds r0, r2 - adds r0, r1 - ldr r7, [r0] - adds r0, r7, 0 - bl sub_8071A8C - lsls r0, 24 - cmp r0, 0 - beq _08062E7E -_08062EA6: - mov r0, r10 - strb r5, [r0, 0x4] - cmp r6, r5 - beq _08062F32 - movs r0, 0 - bl sub_8083CE0 - b _08062F32 - .align 2, 0 -_08062EB8: .4byte gDungeon -_08062EBC: .4byte 0x0001357c -_08062EC0: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1D - bne _08062ED6 - bl GetLeaderActionContainer - bl sub_80637E8 - b _08062F32 -_08062ED6: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1E - bne _08062EF6 - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - bl GetLeaderActionContainer - movs r1, 0x1 - bl sub_8063A70 - b _08062F32 -_08062EF6: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x33 - bne _08062F16 - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - bl GetLeaderActionContainer - movs r1, 0 - bl sub_8063A70 - b _08062F32 -_08062F16: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1F - bne _08062F3A - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - bl GetLeaderActionContainer - bl sub_8063B54 -_08062F32: - movs r0, 0x1 - bl sub_8044C10 - b _08062F5E -_08062F3A: - bl GetLeaderActionId - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x21 - bne _08062F5E - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - bl GetLeaderActionContainer - movs r1, 0x1 - bl sub_8063CF0 - movs r0, 0x1 - bl sub_8044C10 -_08062F5E: - bl GetLeaderActionId - lsls r0, 16 - cmp r0, 0 - bne _08062F6A - b _08062DAE -_08062F6A: - ldr r0, [sp, 0x4] - movs r1, 0 - bl sub_806A2BC - ldr r0, [sp, 0x4] - adds r0, 0x4 - movs r1, 0 - movs r2, 0x1 - movs r3, 0x1 - bl sub_804A728 -_08062F80: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8062D8C - - thumb_func_start sub_8062F90 -sub_8062F90: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xE8 - mov r8, r0 - str r3, [sp, 0xDC] - lsls r1, 24 - lsrs r1, 24 - str r1, [sp, 0xD4] - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0xD8] - ldr r0, [r0, 0x70] - mov r9, r0 - bl GetLeader - ldr r0, [r0, 0x70] - str r0, [sp, 0xE4] - add r4, sp, 0x70 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x74] - add r0, sp, 0x78 - movs r6, 0 - movs r1, 0x2 - strh r1, [r0] - strh r1, [r0, 0x2] - add r1, sp, 0x7C - movs r0, 0x12 - strh r0, [r1] - mov r0, sp - adds r0, 0x7E - movs r1, 0x10 - strh r1, [r0] - add r0, sp, 0x80 - strh r1, [r0] - add r5, sp, 0xD0 - str r5, [sp, 0x84] - movs r1, 0x3 - str r1, [sp, 0x8C] - add r0, sp, 0xA0 - str r1, [r0, 0x4] - add r0, sp, 0xB8 - str r1, [r0, 0x4] - add r0, sp, 0x10 - adds r1, r4, 0 - movs r2, 0x60 - bl memcpy - ldr r0, _080630A4 - str r6, [r0] - movs r3, 0 - ldr r7, [sp, 0xE4] - adds r7, 0x44 -_08063008: - lsls r0, r3, 3 - movs r1, 0x8C - lsls r1, 1 - adds r0, r1 - mov r1, r9 - adds r2, r1, r0 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08063032 - ldrb r1, [r2, 0x1] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08063032 - movs r0, 0xFD - ands r0, r1 - strb r0, [r2, 0x1] - ldr r0, _080630A4 - str r3, [r0] -_08063032: - adds r3, 0x1 - cmp r3, 0x3 - ble _08063008 -_08063038: - movs r5, 0 - movs r2, 0 - str r2, [sp, 0xE0] - mov r10, r2 - add r0, sp, 0xD0 - str r0, [sp] - add r1, sp, 0x70 - str r1, [sp, 0x4] - ldr r2, [sp, 0xDC] - str r2, [sp, 0x8] - ldr r0, [sp, 0x108] - str r0, [sp, 0xC] - mov r0, r8 - mov r1, r9 - ldr r2, [sp, 0xD4] - add r3, sp, 0x10 - bl sub_80633E4 -_0806305C: - ldr r0, _080630A8 - add r1, sp, 0x70 - bl AddMenuCursorSprite_ - movs r0, 0x1E - bl sub_803E46C - ldr r2, _080630AC - ldrh r1, [r2, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _080630DE - ldrh r0, [r2] - lsrs r0, 8 - movs r1, 0x1 - ands r0, r1 - ldr r1, _080630A8 - movs r2, 0x18 - ldrsh r6, [r1, r2] - cmp r0, 0 - beq _080630BA - movs r0, 0x8C - lsls r0, 1 - add r0, r9 - adds r1, r6, 0 - bl unk_SetMoveToLastInLinkedSequence4 - ldr r1, _080630A4 - str r0, [r1] - cmp r6, r0 - beq _080630B0 - movs r0, 0 - bl sub_8083CE0 - b _080630B4 - .align 2, 0 -_080630A4: .4byte gUnknown_202F2D8 -_080630A8: .4byte gUnknown_202EE10 -_080630AC: .4byte gRealInputs -_080630B0: - bl sub_8083D30 -_080630B4: - movs r0, 0x1 - mov r10, r0 - b _080631F4 -_080630BA: - movs r0, 0x8C - lsls r0, 1 - add r0, r9 - adds r1, r6, 0 - bl unk_FindMoveEnabledForAIAfter4 - adds r1, r0, 0 - ldr r0, _08063118 - bl sub_8013780 - ldr r1, _08063118 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r6, r0 - beq _080630DE - movs r0, 0 - bl sub_8083CE0 -_080630DE: - ldr r2, _0806311C - ldrh r1, [r2, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08063150 - ldrh r0, [r2] - lsrs r0, 8 - movs r1, 0x1 - ands r0, r1 - ldr r4, _08063118 - movs r1, 0x18 - ldrsh r6, [r4, r1] - cmp r0, 0 - beq _0806312E - movs r0, 0x8C - lsls r0, 1 - add r0, r9 - adds r1, r6, 0 - bl unk_SetMoveToFirstInLinkedSequence4 - ldr r1, _08063120 - str r0, [r1] - cmp r6, r0 - beq _08063124 - movs r0, 0 - bl sub_8083CE0 - b _08063128 - .align 2, 0 -_08063118: .4byte gUnknown_202EE10 -_0806311C: .4byte gRealInputs -_08063120: .4byte gUnknown_202F2D8 -_08063124: - bl sub_8083D30 -_08063128: - movs r2, 0x1 - mov r10, r2 - b _080631F4 -_0806312E: - movs r0, 0x8C - lsls r0, 1 - add r0, r9 - adds r1, r6, 0 - bl sub_8092DB8 - adds r1, r0, 0 - adds r0, r4, 0 - bl sub_8013780 - movs r1, 0x18 - ldrsh r0, [r4, r1] - cmp r6, r0 - beq _08063150 - movs r0, 0 - bl sub_8083CE0 -_08063150: - ldr r4, _08063174 - ldrh r1, [r4, 0x4] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08063168 - ldr r6, _08063178 - adds r0, r6, 0 - adds r0, 0x2B - ldrb r0, [r0] - cmp r0, 0 - beq _0806317C -_08063168: - adds r0, r7, 0 - movs r1, 0x6 - bl SetMonsterActionFields - b _080631F4 - .align 2, 0 -_08063174: .4byte gRealInputs -_08063178: .4byte gUnknown_202EE10 -_0806317C: - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - bne _0806318E - adds r0, r6, 0 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0 - beq _08063198 -_0806318E: - adds r0, r7, 0 - movs r1, 0x7 - bl SetMonsterActionFields - b _080631F4 -_08063198: - bl sub_8062D88 - ldrh r1, [r4, 0x2] - ands r0, r1 - cmp r0, 0 - bne _080631AE - adds r0, r6, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _080631C8 -_080631AE: - ldr r2, [sp, 0xD4] - cmp r2, 0 - beq _080631C2 - ldrh r0, [r4] - lsrs r0, 8 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _080631C2 - movs r5, 0x3 -_080631C2: - bl sub_8083D08 - b _080631F4 -_080631C8: - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - bne _0806321C - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - bne _08063214 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080631EC - adds r0, r6, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - bne _080631EC - b _0806305C -_080631EC: - bl sub_8083D30 - movs r0, 0x1 - str r0, [sp, 0xE0] -_080631F4: - ldr r4, _08063210 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x1E - bl sub_803E46C - ldrh r0, [r7] - subs r0, 0x6 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bhi _08063224 - b _080633CC - .align 2, 0 -_08063210: .4byte gUnknown_202EE10 -_08063214: - movs r5, 0x2 - bl sub_8083D44 - b _080631F4 -_0806321C: - movs r5, 0x1 - bl sub_8083D44 - b _080631F4 -_08063224: - mov r1, r10 - cmp r1, 0 - beq _0806322C - b _08063038 -_0806322C: - ldr r2, [sp, 0xE0] - cmp r2, 0 - beq _08063234 - b _080633B6 -_08063234: - ldr r6, _08063270 - movs r1, 0x18 - ldrsh r0, [r4, r1] - str r0, [r6] - cmp r5, 0x1 - bne _08063274 - adds r0, r7, 0 - movs r1, 0x1D - bl SetMonsterActionFields - mov r0, r8 - adds r0, 0x24 - ldrb r1, [r0] - ldr r0, [sp, 0xE4] - adds r0, 0x48 - strb r1, [r0] - ldr r1, [r6] - ldr r0, [sp, 0xE4] - adds r0, 0x50 - strb r1, [r0] - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - movs r0, 0x8 - movs r1, 0x1B - bl sub_803E708 - b _080633B6 - .align 2, 0 -_08063270: .4byte gUnknown_202F2D8 -_08063274: - mov r0, r8 - ldr r1, [sp, 0xD4] - ldr r2, [sp, 0xD8] - bl sub_8063698 - cmp r5, 0x3 - bne _08063298 - movs r0, 0x20 - bl sub_8044FB4 - adds r6, r0, 0 - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - bne _080632CC - movs r0, 0x21 - b _080632BC -_08063298: - cmp r5, 0x2 - bne _080632DE - mov r2, r9 - ldrb r0, [r2, 0x7] - cmp r0, 0 - beq _080632BA - movs r0, 0x1E - bl sub_8044FB4 - adds r6, r0, 0 - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - bne _080632CC - movs r0, 0x33 - b _080632BC -_080632BA: - movs r0, 0x1F -_080632BC: - bl sub_8044FB4 - adds r6, r0, 0 - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - beq _080632DE -_080632CC: - mov r0, r8 - bl GetTeamMemberEntityIndex - adds r2, r0, 0 - adds r0, r7, 0 - adds r1, r6, 0 - bl sub_80637BC - b _080633B6 -_080632DE: - movs r0, 0x2 - bl sub_8009524 - add r0, sp, 0x10 - movs r1, 0x16 - bl sub_805FC30 - ldr r6, _0806337C - ldr r5, _08063380 - movs r0, 0x2A - adds r0, r6 - mov r10, r0 - adds r4, r7, 0 -_080632F8: - adds r0, r6, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - ldrh r1, [r5, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _0806331C - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_80136E0 -_0806331C: - ldrh r1, [r5, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08063334 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_8013744 -_08063334: - bl sub_8062D88 - ldrh r1, [r5, 0x2] - ands r1, r0 - cmp r1, 0 - bne _0806334A - adds r0, r6, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08063388 -_0806334A: - movs r1, 0x18 - ldrsh r0, [r6, r1] - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - beq _08063384 - mov r0, r8 - bl GetTeamMemberEntityIndex - adds r1, r0, 0 - adds r0, r4, 0 - bl sub_80637A4 - ldrh r0, [r4] - subs r0, 0x14 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bls _08063376 - bl sub_8083D08 -_08063376: - movs r6, 0 - b _080633A0 - .align 2, 0 -_0806337C: .4byte gUnknown_202EE10 -_08063380: .4byte gRealInputs -_08063384: - bl sub_8083D30 -_08063388: - ldrh r1, [r5, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0806339A - mov r2, r10 - ldrb r0, [r2] - cmp r0, 0 - beq _080632F8 -_0806339A: - bl sub_8083D30 - movs r6, 0x1 -_080633A0: - ldr r0, _080633E0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - cmp r6, 0x1 - bne _080633B2 - b _08063038 -_080633B2: - movs r0, 0 - str r0, [sp, 0xE0] -_080633B6: - movs r0, 0x1 - cmp r0, 0 - beq _080633CC - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - movs r0, 0x8 - movs r1, 0x1E - bl sub_803E708 -_080633CC: - ldr r0, [sp, 0xE0] - add sp, 0xE8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080633E0: .4byte gUnknown_202EE10 - thumb_func_end sub_8062F90 - - thumb_func_start sub_80633E4 -sub_80633E4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - str r0, [sp, 0x20] - adds r7, r1, 0 - adds r4, r3, 0 - ldr r0, [sp, 0x44] - mov r8, r0 - lsls r2, 24 - lsrs r2, 24 - mov r10, r2 - add r1, sp, 0x8 - ldr r0, _08063508 - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - movs r0, 0 - add r5, sp, 0x50 - ldrb r6, [r5] - mov r5, r8 - strb r6, [r5] - add r6, sp, 0x4C - ldrb r6, [r6] - strb r6, [r5, 0x1] - strb r0, [r5, 0x3] - movs r6, 0 - ldr r5, _0806350C - ldr r0, _08063510 - mov r9, r0 - movs r1, 0x1 - mov r12, r1 - movs r3, 0x8C - lsls r3, 1 - adds r2, r7, r3 - movs r3, 0x3 -_08063432: - ldrb r1, [r2] - mov r0, r12 - ands r0, r1 - cmp r0, 0 - beq _0806343E - adds r6, 0x1 -_0806343E: - adds r2, 0x8 - subs r3, 0x1 - cmp r3, 0 - bge _08063432 - movs r3, 0x4 - mov r1, r9 - ldr r0, [r1] - movs r1, 0 - strh r0, [r5, 0x18] - strh r6, [r5, 0x1A] - strh r3, [r5, 0x1C] - add r2, sp, 0x4C - ldrh r2, [r2] - strh r2, [r5, 0x1E] - add r3, sp, 0x50 - ldrh r3, [r3] - strh r3, [r5, 0x20] - strh r1, [r5, 0x4] - movs r0, 0x10 - strh r0, [r5, 0x6] - strh r1, [r5, 0x14] - str r1, [r5] - adds r0, r5, 0 - adds r0, 0x28 - bl sub_801317C - movs r0, 0x4 - movs r1, 0xC - bl sub_80095E4 - adds r0, 0x2 - strh r0, [r4, 0x10] - strh r0, [r4, 0xE] - movs r0, 0xD - mov r6, r8 - strb r0, [r6, 0x2] - movs r0, 0x2 - strh r0, [r4, 0x8] - adds r1, r4, 0 - adds r1, 0x18 - adds r0, r4, 0 - adds r0, 0x48 - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - adds r1, r4, 0 - adds r1, 0x30 - add r0, sp, 0x8 - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - adds r0, r4, 0 - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r5, 0 - movs r1, 0 - bl sub_80137B0 - ldr r1, _08063514 - movs r2, 0 - ldrsh r0, [r1, r2] - adds r0, 0x10 - lsls r0, 3 - strh r0, [r5, 0xC] - movs r3, 0x2 - ldrsh r0, [r1, r3] - adds r0, 0x1 - lsls r0, 3 - subs r0, 0x2 - strh r0, [r5, 0xE] - ldr r0, _08063518 - adds r1, r7, 0 - movs r2, 0 - bl SetMessageArgument_2 - movs r3, 0 - movs r5, 0x1 -_080634DE: - lsls r1, r3, 3 - movs r4, 0x8C - lsls r4, 1 - adds r1, r4 - adds r1, r7, r1 - ldr r6, [sp, 0x48] - adds r4, r6, r3 - movs r0, 0 - strb r0, [r4] - ldrb r1, [r1] - adds r2, r5, 0 - ands r2, r1 - cmp r2, 0 - bne _0806351C - ldr r1, _0806350C - movs r4, 0x18 - ldrsh r0, [r1, r4] - cmp r0, r3 - bne _08063526 - strh r2, [r1, 0x18] - b _08063526 - .align 2, 0 -_08063508: .4byte gUnknown_8106CAC -_0806350C: .4byte gUnknown_202EE10 -_08063510: .4byte gUnknown_202F2D8 -_08063514: .4byte gUnknown_2027370 -_08063518: .4byte gFormatBuffer_Monsters -_0806351C: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08063526 - strb r5, [r4] -_08063526: - adds r3, 0x1 - cmp r3, 0x3 - ble _080634DE - movs r5, 0x8C - lsls r5, 1 - adds r2, r7, r5 - mov r6, r10 - str r6, [sp] - ldr r0, [sp, 0x4C] - str r0, [sp, 0x4] - movs r0, 0x4 - ldr r1, [sp, 0x20] - movs r3, 0 - bl sub_8063578 - movs r0, 0x2 - bl sub_80073B8 - ldr r0, _08063574 - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x4 - movs r1, 0 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - movs r0, 0x2 - bl sub_80073E0 - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08063574: .4byte gUnknown_80FDFE8 - thumb_func_end sub_80633E4 - - thumb_func_start sub_8063578 -sub_8063578: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - str r0, [sp, 0x10] - str r1, [sp, 0x14] - adds r5, r2, 0 - mov r8, r3 - ldr r0, [sp, 0x40] - ldr r4, [sp, 0x44] - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x18] - ldr r0, [r1, 0x70] - str r0, [sp, 0x1C] - mov r0, r8 - bl sub_80073B8 - ldr r0, _080635FC - ldr r1, [sp, 0x14] - movs r2, 0 - bl SubstitutePlaceholderStringTags - lsls r4, 3 - adds r4, 0xA - ldr r0, _08063600 - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - movs r1, 0 - mov r3, r8 - bl PrintFormattedStringOnWindow - movs r1, 0 - mov r9, r1 - ldr r0, [sp, 0x10] - cmp r9, r0 - bge _08063676 - add r1, sp, 0x4 - mov r10, r1 - adds r7, r5, 0 -_080635D0: - movs r0, 0 - str r0, [sp, 0x4] - movs r0, 0x6A - str r0, [sp, 0x8] - movs r0, 0 - mov r1, r10 - strb r0, [r1, 0x8] - mov r1, sp - ldrb r0, [r1, 0x18] - mov r1, r10 - strb r0, [r1, 0x9] - ldrb r1, [r7] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08063668 - ldr r1, [sp, 0x1C] - ldrb r0, [r1, 0x7] - cmp r0, 0 - beq _08063604 - movs r0, 0x2 - b _08063606 - .align 2, 0 -_080635FC: .4byte gFormatBuffer_Monsters -_08063600: .4byte gUnknown_80FE978 -_08063604: - movs r0, 0x4 -_08063606: - str r0, [sp, 0x4] - ldr r0, [sp, 0x14] - adds r1, r5, 0 - movs r2, 0x1 - bl CanMonsterUseMove - add r1, sp, 0x4 - movs r2, 0 - lsls r0, 24 - cmp r0, 0 - bne _0806361E - movs r2, 0x1 -_0806361E: - strb r2, [r1, 0x8] - ldr r0, _0806368C - adds r1, r5, 0 - add r2, sp, 0x4 - bl BufferMoveName - ldr r0, _08063690 - mov r1, r9 - bl GetMenuEntryYCoord - adds r4, r0, 0 - ldrb r1, [r7] - movs r0, 0x2 - ands r0, r1 - movs r6, 0xD - cmp r0, 0 - bne _08063658 - movs r6, 0x8 - mov r0, r9 - cmp r0, 0 - beq _08063658 - subs r2, r4, 0x2 - movs r0, 0x7 - str r0, [sp] - mov r0, r8 - movs r1, 0xC - movs r3, 0x78 - bl sub_80078A4 -_08063658: - movs r1, 0 - str r1, [sp] - adds r0, r6, 0 - adds r1, r4, 0 - ldr r2, _08063694 - mov r3, r8 - bl PrintFormattedStringOnWindow -_08063668: - adds r7, 0x8 - adds r5, 0x8 - movs r0, 0x1 - add r9, r0 - ldr r1, [sp, 0x10] - cmp r9, r1 - blt _080635D0 -_08063676: - mov r0, r8 - bl sub_80073E0 - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806368C: .4byte gFormatBuffer_Items -_08063690: .4byte gUnknown_202EE10 -_08063694: .4byte gUnknown_8106CC4 - thumb_func_end sub_8063578 - - thumb_func_start sub_8063698 -sub_8063698: - push {r4-r7,lr} - mov r7, r8 - push {r7} - mov r8, r0 - lsls r1, 24 - lsrs r6, r1, 24 - lsls r2, 24 - lsrs r7, r2, 24 - ldr r4, [r0, 0x70] - ldr r0, _080636E8 - ldr r0, [r0] - lsls r0, 3 - movs r1, 0x8C - lsls r1, 1 - adds r0, r1 - adds r5, r4, r0 - ldr r1, _080636EC - movs r0, 0 - str r0, [r1] - ldrb r0, [r4, 0x7] - cmp r0, 0 - beq _080636FA - cmp r7, 0 - beq _080636D0 - movs r0, 0x14 - movs r1, 0 - bl sub_8044F5C -_080636D0: - ldrb r1, [r5] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08063702 - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _080636F0 - movs r0, 0x33 - b _080636F2 - .align 2, 0 -_080636E8: .4byte gUnknown_202F2D8 -_080636EC: .4byte gUnknown_202EE6C -_080636F0: - movs r0, 0x1E -_080636F2: - movs r1, 0 - bl sub_8044F5C - b _08063702 -_080636FA: - movs r0, 0x1F - movs r1, 0 - bl sub_8044F5C -_08063702: - cmp r6, 0 - beq _08063716 - movs r0, 0x20 - movs r1, 0 - bl sub_8044F5C - movs r0, 0x21 - movs r1, 0 - bl sub_8044F5C -_08063716: - movs r0, 0x1D - movs r1, 0 - bl sub_8044F5C - cmp r6, 0 - bne _0806372A - movs r0, 0x20 - bl sub_8044FF0 - b _08063754 -_0806372A: - ldr r5, _080637A0 - ldr r1, [r5] - adds r0, r4, 0 - bl sub_8063C88 - lsls r0, 24 - cmp r0, 0 - bne _08063740 - movs r0, 0x20 - bl sub_8044FF0 -_08063740: - ldr r1, [r5] - adds r0, r4, 0 - bl sub_8063DD4 - lsls r0, 24 - cmp r0, 0 - bne _08063754 - movs r0, 0x21 - bl sub_8044FF0 -_08063754: - ldr r5, _080637A0 - ldr r1, [r5] - adds r0, r4, 0 - bl sub_8063DD4 - lsls r0, 24 - cmp r0, 0 - bne _0806376A - movs r0, 0x21 - bl sub_8044FF0 -_0806376A: - cmp r7, 0 - beq _08063792 - movs r0, 0 - ldr r1, [r5] - cmp r1, 0x3 - bgt _08063788 - mov r0, r8 - movs r2, 0x1 - bl CanAIUseMove - lsls r0, 24 - lsrs r0, 24 - negs r1, r0 - orrs r1, r0 - lsrs r0, r1, 31 -_08063788: - cmp r0, 0 - bne _08063792 - movs r0, 0x14 - bl sub_8044FF0 -_08063792: - bl sub_8045064 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080637A0: .4byte gUnknown_202F2D8 - thumb_func_end sub_8063698 - - thumb_func_start sub_80637A4 -sub_80637A4: - push {lr} - adds r2, r1, 0 - ldr r1, _080637B8 - movs r3, 0x18 - ldrsh r1, [r1, r3] - bl sub_80637BC - pop {r0} - bx r0 - .align 2, 0 -_080637B8: .4byte gUnknown_202EE10 - thumb_func_end sub_80637A4 - - thumb_func_start sub_80637BC -sub_80637BC: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r2, 0 - ldr r0, _080637E0 - lsls r1, 2 - adds r1, r0 - ldrh r1, [r1] - adds r0, r4, 0 - bl SetMonsterActionFields - strb r5, [r4, 0x4] - ldr r0, _080637E4 - ldr r0, [r0] - strb r0, [r4, 0xC] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080637E0: .4byte gUnknown_202EE44 -_080637E4: .4byte gUnknown_202F2D8 - thumb_func_end sub_80637BC - - thumb_func_start sub_80637E8 -sub_80637E8: - push {lr} - adds r3, r0, 0 - ldr r0, _08063828 - ldr r1, [r0] - ldrb r0, [r3, 0x4] - lsls r0, 2 - ldr r2, _0806382C - adds r1, r2 - adds r1, r0 - ldr r0, [r1] - ldr r0, [r0, 0x70] - ldrb r1, [r3, 0xC] - lsls r1, 3 - adds r1, r0, r1 - ldr r2, _08063830 - adds r2, r1 - mov r12, r2 - ldrb r2, [r2] - movs r1, 0x2 - orrs r1, r2 - mov r2, r12 - strb r1, [r2] - movs r1, 0x8C - lsls r1, 1 - adds r0, r1 - ldrb r1, [r3, 0xC] - movs r2, 0x4 - bl sub_8063834 - pop {r0} - bx r0 - .align 2, 0 -_08063828: .4byte gDungeon -_0806382C: .4byte 0x0001357c -_08063830: .4byte 0x00000119 - thumb_func_end sub_80637E8 - - thumb_func_start sub_8063834 -sub_8063834: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x7C - str r0, [sp, 0x74] - str r1, [sp, 0x78] - adds r4, r2, 0 - mov r0, sp - bl sub_80140B4 - add r0, sp, 0x70 - str r0, [sp, 0x14] - movs r1, 0x1 - mov r9, r1 - ldr r3, [sp, 0x78] - adds r3, 0x1 - add r2, sp, 0x60 - mov r10, r2 - cmp r3, r4 - bge _08063894 - lsls r0, r3, 3 - ldr r1, [sp, 0x74] - adds r2, r0, r1 - ldrb r1, [r2] - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _08063894 - movs r6, 0x2 - movs r5, 0x1 -_08063874: - ldrb r1, [r2] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _08063894 - movs r0, 0x1 - add r9, r0 - adds r2, 0x8 - adds r3, 0x1 - cmp r3, r4 - bge _08063894 - ldrb r1, [r2] - adds r0, r5, 0 - ands r0, r1 - cmp r0, 0 - bne _08063874 -_08063894: - movs r4, 0 - ldr r6, _0806393C -_08063898: - movs r7, 0 - mov r1, r9 - add r2, sp, 0x70 - strb r1, [r2] - adds r1, r2, 0 - strb r4, [r1, 0x1] - movs r0, 0xC - strb r0, [r1, 0x2] - strb r7, [r1, 0x3] - strh r4, [r6, 0x1E] - mov r0, r9 - strh r0, [r6, 0x20] - ldr r1, _08063940 - movs r2, 0 - ldrsh r0, [r1, r2] - adds r0, 0x17 - lsls r0, 3 - strh r0, [r6, 0xC] - movs r2, 0x2 - ldrsh r0, [r1, r2] - adds r0, 0x1 - lsls r0, 3 - subs r0, 0x2 - strh r0, [r6, 0xE] - strh r7, [r6, 0x14] - strh r7, [r6, 0x4] - movs r0, 0x10 - strh r0, [r6, 0x6] - str r7, [r6] - adds r0, r6, 0 - adds r0, 0x28 - bl sub_801317C - strh r7, [r6, 0x18] - strh r7, [r6, 0x1A] - strh r7, [r6, 0x1C] - mov r0, sp - movs r1, 0x1 - bl sub_803ECB4 - ldr r0, [sp, 0x78] - adds r1, r0, r4 - lsls r1, 3 - ldr r2, [sp, 0x74] - adds r1, r2, r1 - adds r0, r4, 0 - movs r2, 0 - mov r3, r10 - bl unk_PrintMoveDescription - mov r8, r0 -_080638FE: - mov r0, r8 - cmp r0, 0 - beq _08063908 - bl sub_8062500 -_08063908: - ldr r5, _08063944 - adds r0, r5, 0 - movs r1, 0 - bl nullsub_34 - movs r0, 0x1C - bl sub_803E46C - bl sub_8062D88 - ldr r1, _08063948 - ldrh r1, [r1, 0x2] - ands r0, r1 - cmp r0, 0 - bne _0806392C - ldrb r0, [r5, 0x1] - cmp r0, 0 - beq _0806394C -_0806392C: - bl sub_8083D08 - movs r7, 0x1 - mov r1, r8 - cmp r1, 0 - beq _080639AE - movs r7, 0x2 - b _080639AE - .align 2, 0 -_0806393C: .4byte gUnknown_202EE10 -_08063940: .4byte gUnknown_2027370 -_08063944: .4byte gUnknown_202EE38 -_08063948: .4byte gRealInputs -_0806394C: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0806395A - ldrb r0, [r5, 0x2] - cmp r0, 0 - beq _08063962 -_0806395A: - bl sub_8083D30 - movs r7, 0x1 - b _080639AE -_08063962: - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - bne _08063970 - ldrb r0, [r5, 0x4] - cmp r0, 0 - beq _08063986 -_08063970: - adds r0, r4, 0 - cmp r4, 0 - bne _08063978 - mov r4, r9 -_08063978: - subs r4, 0x1 - cmp r0, r4 - beq _080639AE - movs r0, 0 - bl sub_8083CE0 - b _080639AE -_08063986: - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08063994 - ldrb r0, [r5, 0x3] - cmp r0, 0 - beq _080638FE -_08063994: - adds r1, r4, 0 - mov r0, r9 - subs r0, 0x1 - cmp r4, r0 - bne _080639A2 - movs r4, 0 - b _080639A4 -_080639A2: - adds r4, 0x1 -_080639A4: - cmp r1, r4 - beq _080639AE - movs r0, 0 - bl sub_8083CE0 -_080639AE: - cmp r7, 0x1 - beq _080639CA - cmp r7, 0 - bne _080639B8 - b _08063898 -_080639B8: - mov r2, r8 - cmp r2, 0 - bne _080639C0 - b _08063898 -_080639C0: - mov r0, r8 - mov r1, r10 - bl sub_80625A4 - b _08063898 -_080639CA: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - add sp, 0x7C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8063834 - - thumb_func_start sub_80639E4 -sub_80639E4: - push {r4-r6,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r6, r1, 0 - ldr r4, _08063A5C - adds r0, r4, 0 - bl sub_80140B4 - ldr r0, _08063A60 - str r0, [r4, 0x14] - adds r0, r4, 0 - movs r1, 0x1 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - ldr r0, _08063A64 - ldr r1, [r5] - bl strcpy - ldr r2, _08063A68 - movs r4, 0 - str r4, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r2, [r5, 0x4] - str r4, [sp] - movs r0, 0x4 - movs r1, 0x10 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - ldr r0, _08063A6C - strh r4, [r0, 0x1E] - strh r4, [r0, 0x20] - strh r4, [r0, 0xC] - strh r4, [r0, 0xE] - strh r4, [r0, 0x14] - strh r4, [r0, 0x4] - movs r1, 0x10 - strh r1, [r0, 0x6] - str r4, [r0] - strh r4, [r0, 0x18] - strh r4, [r0, 0x1A] - strh r4, [r0, 0x1C] - adds r0, r6, 0 - bl sub_801317C - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08063A5C: .4byte gUnknown_202F278 -_08063A60: .4byte gUnknown_8106CC8 -_08063A64: .4byte gFormatBuffer_Monsters -_08063A68: .4byte gUnknown_8106CCC -_08063A6C: .4byte gUnknown_202EE10 - thumb_func_end sub_80639E4 - - thumb_func_start sub_8063A70 -sub_8063A70: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - ldr r1, _08063B1C - ldr r2, [r1] - ldrb r1, [r0, 0x4] - lsls r1, 2 - ldr r3, _08063B20 - adds r2, r3 - adds r2, r1 - ldr r6, [r2] - ldr r5, [r6, 0x70] - ldrb r0, [r0, 0xC] - lsls r0, 3 - movs r2, 0x8C - lsls r2, 1 - adds r0, r2 - adds r4, r5, r0 - ldrb r1, [r4] - movs r0, 0x8 - ands r0, r1 - lsls r0, 24 - lsrs r0, 24 - negs r0, r0 - lsrs r0, 31 - mov r8, r0 - ldr r0, _08063B24 - mov r9, r0 - movs r1, 0x1 - mov r12, r1 - adds r2, r5, r2 - movs r7, 0xF7 - movs r3, 0x3 -_08063ABC: - ldrb r1, [r2] - mov r0, r12 - ands r0, r1 - cmp r0, 0 - beq _08063ACC - adds r0, r7, 0 - ands r0, r1 - strb r0, [r2] -_08063ACC: - adds r2, 0x8 - subs r3, 0x1 - cmp r3, 0 - bge _08063ABC - mov r0, r9 - adds r1, r4, 0 - movs r2, 0 - bl BufferMoveName - mov r3, r8 - cmp r3, 0 - bne _08063AEC - ldrb r1, [r4] - movs r0, 0x8 - orrs r0, r1 - strb r0, [r4] -_08063AEC: - movs r1, 0x8C - lsls r1, 1 - adds r0, r5, r1 - bl unk_FixLinkedMovesSetEnabled4 - ldrb r1, [r4, 0x1] - movs r0, 0x2 - orrs r0, r1 - strb r0, [r4, 0x1] - ldr r0, _08063B28 - bl PlaySoundEffect - mov r3, r10 - cmp r3, 0 - beq _08063B42 - mov r0, r8 - cmp r0, 0 - bne _08063B30 - ldr r0, _08063B2C - ldr r1, [r0] - adds r0, r6, 0 - bl LogMessageByIdWithPopupCheckUser - b _08063B3A - .align 2, 0 -_08063B1C: .4byte gDungeon -_08063B20: .4byte 0x0001357c -_08063B24: .4byte gFormatBuffer_Items -_08063B28: .4byte 0x00000133 -_08063B2C: .4byte gUnknown_80F8B40 -_08063B30: - ldr r0, _08063B50 - ldr r1, [r0] - adds r0, r6, 0 - bl LogMessageByIdWithPopupCheckUser -_08063B3A: - movs r0, 0x78 - movs r1, 0x1F - bl sub_803E708 -_08063B42: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08063B50: .4byte gUnknown_80F8B64 - thumb_func_end sub_8063A70 - - thumb_func_start sub_8063B54 -sub_8063B54: - push {r4-r6,lr} - ldr r1, _08063BA4 - ldr r2, [r1] - ldrb r1, [r0, 0x4] - lsls r1, 2 - ldr r3, _08063BA8 - adds r2, r3 - adds r2, r1 - ldr r1, [r2] - ldr r5, [r1, 0x70] - ldrb r4, [r0, 0xC] - lsls r4, 3 - movs r6, 0x8C - lsls r6, 1 - adds r4, r6 - adds r4, r5, r4 - ldr r0, _08063BAC - adds r1, r4, 0 - movs r2, 0 - bl BufferMoveName - ldrb r0, [r4] - movs r1, 0x4 - eors r0, r1 - strb r0, [r4] - adds r5, r6 - adds r0, r5, 0 - bl unk_FixLinkedMovesSetEnabled4 - ldrb r1, [r4, 0x1] - movs r0, 0x2 - orrs r0, r1 - strb r0, [r4, 0x1] - ldr r0, _08063BB0 - bl PlaySoundEffect - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08063BA4: .4byte gDungeon -_08063BA8: .4byte 0x0001357c -_08063BAC: .4byte gFormatBuffer_Items -_08063BB0: .4byte 0x00000133 - thumb_func_end sub_8063B54 - - thumb_func_start sub_8063BB4 -sub_8063BB4: - push {r4-r7,lr} - ldr r1, _08063C70 - ldr r2, [r1] - ldrb r1, [r0, 0x4] - lsls r1, 2 - ldr r3, _08063C74 - adds r2, r3 - adds r2, r1 - ldr r1, [r2] - ldr r6, [r1, 0x70] - ldrb r5, [r0, 0xC] - ldr r0, _08063C78 - lsls r4, r5, 3 - movs r7, 0x8C - lsls r7, 1 - adds r1, r4, r7 - adds r1, r6, r1 - movs r2, 0 - bl BufferMoveName - adds r4, r6, r4 - ldr r0, _08063C7C - adds r2, r4, r0 - ldrb r1, [r2] - movs r0, 0x2 - orrs r0, r1 - strb r0, [r2] - movs r3, 0 - adds r5, 0x1 - cmp r5, 0x3 - bgt _08063C2C - lsls r2, r5, 3 - adds r0, r2, r6 - adds r1, r7, 0 - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08063C2C - adds r0, r2, r7 - adds r2, r0, r6 - movs r4, 0x2 -_08063C0A: - ldrb r1, [r2] - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - beq _08063C2C - adds r3, 0x1 - cmp r3, 0x3 - bgt _08063C2C - adds r2, 0x8 - adds r5, 0x1 - cmp r5, 0x3 - bgt _08063C2C - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08063C0A -_08063C2C: - lsls r0, r5, 3 - adds r0, r6 - movs r4, 0x8C - lsls r4, 1 - adds r0, r4 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08063C42 - movs r5, 0x4 -_08063C42: - cmp r5, 0x3 - bgt _08063C5C - lsls r1, r5, 3 - adds r1, r4 - adds r1, r6, r1 - ldrb r2, [r1] - movs r0, 0x2 - orrs r0, r2 - strb r0, [r1] - ldr r0, _08063C80 - movs r2, 0 - bl BufferMoveName -_08063C5C: - adds r0, r6, r4 - bl unk_FixLinkedMovesSetEnabled4 - ldr r0, _08063C84 - bl PlaySoundEffect - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08063C70: .4byte gDungeon -_08063C74: .4byte 0x0001357c -_08063C78: .4byte gFormatBuffer_Items -_08063C7C: .4byte 0x00000119 -_08063C80: .4byte gFormatBuffer_Items + 0x50 -_08063C84: .4byte 0x00000133 - thumb_func_end sub_8063BB4 - - thumb_func_start sub_8063C88 -sub_8063C88: - push {r4-r7,lr} - adds r4, r0, 0 - movs r7, 0 - adds r5, r1, 0 - lsls r0, r5, 3 - adds r0, r4, r0 - movs r1, 0x8D - lsls r1, 1 - adds r0, r1 - ldrh r0, [r0] - bl DoesMoveCharge - lsls r0, 24 - cmp r0, 0 - beq _08063CAE -_08063CA6: - movs r0, 0 - b _08063CEA -_08063CAA: - movs r7, 0x1 - b _08063CE8 -_08063CAE: - adds r5, 0x1 - movs r6, 0 - lsls r0, r5, 3 - movs r1, 0x8C - lsls r1, 1 - adds r0, r1 - adds r4, r0, r4 -_08063CBC: - ldrh r0, [r4, 0x2] - bl DoesMoveCharge - lsls r0, 24 - cmp r0, 0 - bne _08063CA6 - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08063CE8 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08063CAA - adds r4, 0x8 - adds r5, 0x1 - cmp r5, 0x3 - bgt _08063CE8 - adds r6, 0x1 - cmp r6, 0x3 - ble _08063CBC -_08063CE8: - adds r0, r7, 0 -_08063CEA: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8063C88 - - thumb_func_start sub_8063CF0 -sub_8063CF0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - ldr r1, _08063D98 - ldr r2, [r1] - ldrb r1, [r0, 0x4] - lsls r1, 2 - ldr r3, _08063D9C - adds r2, r3 - adds r2, r1 - ldr r7, [r2] - ldr r6, [r7, 0x70] - ldrb r5, [r0, 0xC] - movs r0, 0 - mov r8, r0 - ldr r0, _08063DA0 - lsls r4, r5, 3 - movs r1, 0x8C - lsls r1, 1 - mov r9, r1 - adds r1, r4, r1 - adds r1, r6, r1 - movs r2, 0 - bl BufferMoveName - adds r4, r6, r4 - ldr r3, _08063DA4 - adds r2, r4, r3 - ldrb r1, [r2] - movs r0, 0x2 - orrs r0, r1 - strb r0, [r2] - adds r5, 0x1 - movs r3, 0 - cmp r5, 0x3 - bgt _08063D70 - movs r0, 0x2 - mov r12, r0 - lsls r0, r5, 3 - add r0, r9 - adds r2, r0, r6 - movs r4, 0xFD -_08063D4E: - ldrb r1, [r2] - mov r0, r12 - ands r0, r1 - cmp r0, 0 - beq _08063D70 - adds r0, r4, 0 - ands r0, r1 - strb r0, [r2] - movs r1, 0x1 - mov r8, r1 - adds r2, 0x8 - adds r5, 0x1 - adds r3, 0x1 - cmp r3, 0x3 - bgt _08063D70 - cmp r5, 0x3 - ble _08063D4E -_08063D70: - movs r2, 0x8C - lsls r2, 1 - adds r0, r6, r2 - bl unk_FixLinkedMovesSetEnabled4 - ldr r0, _08063DA8 - bl PlaySoundEffect - mov r3, r10 - cmp r3, 0 - beq _08063DC2 - mov r0, r8 - cmp r0, 0 - beq _08063DB0 - ldr r0, _08063DAC - ldr r1, [r0] - adds r0, r7, 0 - bl LogMessageByIdWithPopupCheckUser - b _08063DBA - .align 2, 0 -_08063D98: .4byte gDungeon -_08063D9C: .4byte 0x0001357c -_08063DA0: .4byte gFormatBuffer_Items -_08063DA4: .4byte 0x00000119 -_08063DA8: .4byte 0x00000133 -_08063DAC: .4byte gUnknown_80F8B88 -_08063DB0: - ldr r0, _08063DD0 - ldr r1, [r0] - adds r0, r7, 0 - bl LogMessageByIdWithPopupCheckUser -_08063DBA: - movs r0, 0x78 - movs r1, 0x1F - bl sub_803E708 -_08063DC2: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08063DD0: .4byte gUnknown_80F8BB4 - thumb_func_end sub_8063CF0 - - thumb_func_start sub_8063DD4 -sub_8063DD4: - push {r4-r7,lr} - adds r3, r0, 0 - adds r2, r1, 0 - movs r5, 0 - adds r2, 0x1 - movs r4, 0 - cmp r2, 0x3 - bgt _08063E20 - lsls r0, r2, 3 - movs r6, 0x8C - lsls r6, 1 - adds r0, r6 - adds r0, r3, r0 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08063E20 - movs r5, 0x1 - adds r2, 0x1 - movs r7, 0x2 - lsls r0, r2, 3 - adds r0, r6 - adds r3, r0, r3 -_08063E04: - adds r4, 0x1 - cmp r4, 0x3 - bgt _08063E20 - cmp r2, 0x3 - bgt _08063E20 - ldrb r1, [r3] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _08063E20 - movs r5, 0x1 - adds r3, 0x8 - adds r2, 0x1 - b _08063E04 -_08063E20: - cmp r5, 0 - bne _08063E28 - movs r0, 0 - b _08063E2A -_08063E28: - movs r0, 0x1 -_08063E2A: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8063DD4 - - thumb_func_start sub_8063E30 -sub_8063E30: - push {r4-r7,lr} - adds r5, r0, 0 - adds r1, 0x1 - movs r4, 0 - cmp r1, 0x7 - bgt _08063E62 - movs r7, 0x2 - movs r6, 0xFD - lsls r0, r1, 3 - adds r3, r0, r5 -_08063E44: - ldrb r2, [r3] - adds r0, r7, 0 - ands r0, r2 - cmp r0, 0 - beq _08063E62 - adds r0, r6, 0 - ands r0, r2 - strb r0, [r3] - adds r3, 0x8 - adds r1, 0x1 - adds r4, 0x1 - cmp r4, 0x7 - bgt _08063E62 - cmp r1, 0x7 - ble _08063E44 -_08063E62: - adds r0, r5, 0 - bl unk_FixLinkedMovesSetEnabled8 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8063E30 - - thumb_func_start sub_8063E70 -sub_8063E70: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xD0 - str r0, [sp, 0xC4] - adds r7, r1, 0 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0xC8] - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0xCC] - add r4, sp, 0x60 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x64] - add r0, sp, 0x68 - movs r6, 0 - movs r1, 0x2 - strh r1, [r0] - strh r1, [r0, 0x2] - add r1, sp, 0x6C - movs r0, 0x12 - strh r0, [r1] - mov r0, sp - adds r0, 0x6E - movs r1, 0x10 - strh r1, [r0] - add r0, sp, 0x70 - strh r1, [r0] - add r5, sp, 0xC0 - str r5, [sp, 0x74] - movs r1, 0x3 - str r1, [sp, 0x7C] - add r0, sp, 0x90 - str r1, [r0, 0x4] - add r0, sp, 0xA8 - str r1, [r0, 0x4] - mov r0, sp - adds r1, r4, 0 - movs r2, 0x60 - bl memcpy - ldr r0, _08063F80 - str r6, [r0] - ldr r1, _08063F84 - mov r8, r1 - mov r9, r0 - ldr r2, _08063F88 - mov r10, r2 -_08063EE0: - ldr r0, [sp, 0xC4] - adds r1, r7, 0 - mov r2, sp - add r3, sp, 0xC0 - bl sub_8064228 -_08063EEC: - mov r0, r8 - bl AddMenuCursorSprite - movs r0, 0x1E - bl sub_803E46C - mov r0, r10 - ldrh r1, [r0, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08063F2A - mov r1, r8 - movs r2, 0x18 - ldrsh r4, [r1, r2] - adds r0, r7, 0 - adds r1, r4, 0 - bl unk_FindMoveEnabledForAIAfter8 - adds r1, r0, 0 - mov r0, r8 - bl sub_8013780 - mov r1, r8 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r4, r0 - beq _08063F2A - movs r0, 0 - bl sub_8083CE0 -_08063F2A: - mov r0, r10 - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08063F5C - mov r1, r8 - movs r2, 0x18 - ldrsh r4, [r1, r2] - adds r0, r7, 0 - adds r1, r4, 0 - bl unk_FindMoveEnabledForAIBefore8 - adds r1, r0, 0 - mov r0, r8 - bl sub_8013780 - mov r1, r8 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r4, r0 - beq _08063F5C - movs r0, 0 - bl sub_8083CE0 -_08063F5C: - bl sub_8062D88 - mov r2, r10 - ldrh r1, [r2, 0x2] - ands r0, r1 - cmp r0, 0 - bne _08063F76 - ldr r2, _08063F84 - adds r0, r2, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08063F8C -_08063F76: - bl sub_8083D08 - movs r4, 0 - b _08063FB2 - .align 2, 0 -_08063F80: .4byte gUnknown_202F2D8 -_08063F84: .4byte gUnknown_202EE10 -_08063F88: .4byte gRealInputs -_08063F8C: - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - bne _08063FD4 - ldr r0, [sp, 0xCC] - cmp r0, 0 - beq _08063EEC - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08063FAC - adds r0, r2, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - beq _08063EEC -_08063FAC: - bl sub_8083D30 - movs r4, 0x1 -_08063FB2: - ldr r5, _08063FD0 - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x1E - bl sub_803E46C - cmp r4, 0x1 - bne _08063FDC - movs r0, 0x1 - negs r0, r0 - mov r1, r9 - str r0, [r1] - b _080640FA - .align 2, 0 -_08063FD0: .4byte gUnknown_202EE10 -_08063FD4: - bl sub_8083D44 - movs r4, 0x2 - b _08063FB2 -_08063FDC: - ldr r6, _08064004 - movs r2, 0x18 - ldrsh r0, [r5, r2] - str r0, [r6] - cmp r4, 0x2 - bne _08064008 - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - movs r0, 0x8 - movs r1, 0x1B - bl sub_803E708 - ldr r1, [r6] - adds r0, r7, 0 - movs r2, 0x4 - bl sub_8063834 - b _08063EE0 - .align 2, 0 -_08064004: .4byte gUnknown_202F2D8 -_08064008: - adds r0, r7, 0 - bl sub_8064310 - mov r0, sp - movs r1, 0x16 - bl sub_805FC30 - adds r4, r5, 0 - ldr r6, _0806408C - adds r5, 0x2A -_0806401C: - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - ldrh r1, [r6, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08064040 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80136E0 -_08064040: - ldrh r1, [r6, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08064058 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8013744 -_08064058: - bl sub_8062D88 - ldrh r1, [r6, 0x2] - ands r1, r0 - cmp r1, 0 - bne _0806406E - adds r0, r4, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _0806409C -_0806406E: - movs r1, 0x18 - ldrsh r0, [r4, r1] - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - beq _08064098 - movs r2, 0x18 - ldrsh r0, [r4, r2] - cmp r0, 0x2 - bne _08064090 - bl sub_8083D08 - b _08064094 - .align 2, 0 -_0806408C: .4byte gRealInputs -_08064090: - bl sub_8083D1C -_08064094: - movs r4, 0 - b _080640B2 -_08064098: - bl sub_8083D30 -_0806409C: - ldrh r1, [r6, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080640AC - ldrb r0, [r5] - cmp r0, 0 - beq _0806401C -_080640AC: - bl sub_8083D30 - movs r4, 0x1 -_080640B2: - ldr r6, _080640E4 - adds r0, r6, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - cmp r4, 0x1 - bne _080640CE - b _08063EE0 -_080640CE: - movs r1, 0x18 - ldrsh r0, [r6, r1] - cmp r0, 0x1 - bne _080640E8 - mov r2, r9 - ldr r1, [r2] - adds r0, r7, 0 - bl sub_8063E30 - b _08063EE0 - .align 2, 0 -_080640E4: .4byte gUnknown_202EE10 -_080640E8: - cmp r0, 0x2 - bne _080640FA - mov r0, r9 - ldr r1, [r0] - adds r0, r7, 0 - movs r2, 0x8 - bl sub_8063834 - b _08063EE0 -_080640FA: - ldr r1, _08064140 - ldr r2, [r1] - cmp r2, 0 - bge _08064104 - b _08064214 -_08064104: - ldr r0, [sp, 0xC8] - cmp r0, 0 - beq _08064160 - movs r4, 0 - lsls r0, r2, 3 - adds r1, r7, r0 - adds r0, r2, 0x1 - cmp r0, 0x7 - bgt _08064130 - lsls r0, 3 - adds r0, r7 - ldrb r2, [r0] - movs r0, 0x1 - ands r0, r2 - cmp r0, 0 - beq _08064130 - movs r0, 0x2 - ands r0, r2 - lsls r0, 24 - lsrs r0, 24 - negs r0, r0 - lsrs r4, r0, 31 -_08064130: - ldr r0, _08064144 - movs r2, 0 - bl BufferMoveName - cmp r4, 0 - beq _0806414C - ldr r0, _08064148 - b _0806414E - .align 2, 0 -_08064140: .4byte gUnknown_202F2D8 -_08064144: .4byte gFormatBuffer_Items -_08064148: .4byte gUnknown_80FDF00 -_0806414C: - ldr r0, _0806415C -_0806414E: - ldr r1, [r0] - movs r0, 0 - movs r2, 0 - bl DisplayDungeonYesNoMessage - adds r3, r0, 0 - b _08064162 - .align 2, 0 -_0806415C: .4byte gUnknown_80FDF70 -_08064160: - movs r3, 0x1 -_08064162: - cmp r3, 0x1 - beq _08064168 - b _08063EE0 -_08064168: - mov r1, r9 - ldr r0, [r1] - lsls r0, 3 - adds r0, r7 - movs r1, 0 - strb r1, [r0] - mov r2, r9 - ldr r0, [r2] - adds r2, r0, 0x1 - cmp r2, 0x7 - bgt _080641BC - lsls r0, r2, 3 - adds r4, r7, r0 - ldrb r1, [r4] - ands r3, r1 - cmp r3, 0 - beq _080641BC - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080641BC - movs r0, 0 - mov r12, r0 - movs r6, 0x1 - adds r3, r4, 0 - movs r5, 0x2 -_0806419C: - mov r1, r12 - strb r1, [r4] - adds r3, 0x8 - adds r2, 0x1 - cmp r2, 0x7 - bgt _080641BC - adds r4, r3, 0 - ldrb r1, [r3] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _080641BC - adds r0, r5, 0 - ands r0, r1 - cmp r0, 0 - bne _0806419C -_080641BC: - movs r4, 0 - movs r6, 0x1 - adds r3, r7, 0 - add r5, sp, 0x60 - movs r2, 0x7 -_080641C6: - ldrb r1, [r3] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _080641D8 - ldr r0, [r3] - ldr r1, [r3, 0x4] - stm r5!, {r0,r1} - adds r4, 0x1 -_080641D8: - adds r3, 0x8 - subs r2, 0x1 - cmp r2, 0 - bge _080641C6 - cmp r4, 0x7 - bgt _080641F4 - movs r1, 0 -_080641E6: - lsls r0, r4, 3 - add r0, sp - adds r0, 0x60 - strb r1, [r0] - adds r4, 0x1 - cmp r4, 0x7 - ble _080641E6 -_080641F4: - add r4, sp, 0x60 - adds r3, r7, 0 - movs r2, 0x7 -_080641FA: - ldm r4!, {r0,r1} - stm r3!, {r0,r1} - subs r2, 0x1 - cmp r2, 0 - bge _080641FA - ldr r2, _08064210 - ldr r0, [r2] - cmp r0, 0 - blt _08064214 - movs r0, 0x1 - b _08064216 - .align 2, 0 -_08064210: .4byte gUnknown_202F2D8 -_08064214: - movs r0, 0 -_08064216: - add sp, 0xD0 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8063E70 - - thumb_func_start sub_8064228 -sub_8064228: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - mov r9, r0 - mov r10, r1 - adds r5, r2, 0 - adds r7, r3, 0 - movs r1, 0 - movs r0, 0x1 - strb r0, [r7] - strb r1, [r7, 0x1] - strb r1, [r7, 0x3] - mov r8, r1 - ldr r6, _08064304 - ldr r0, _08064308 - mov r12, r0 - movs r4, 0x1 - mov r2, r10 - movs r3, 0x7 -_08064254: - ldrb r1, [r2] - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - beq _08064262 - movs r1, 0x1 - add r8, r1 -_08064262: - adds r2, 0x8 - subs r3, 0x1 - cmp r3, 0 - bge _08064254 - mov r2, r12 - ldr r0, [r2] - movs r4, 0 - strh r0, [r6, 0x18] - mov r3, r8 - strh r3, [r6, 0x1A] - strh r3, [r6, 0x1C] - strh r4, [r6, 0x1E] - strh r4, [r6, 0x20] - strh r4, [r6, 0x4] - movs r0, 0x10 - strh r0, [r6, 0x6] - strh r4, [r6, 0xC] - strh r4, [r6, 0xE] - strh r4, [r6, 0x14] - str r4, [r6] - adds r0, r6, 0 - adds r0, 0x28 - bl sub_801317C - mov r0, r8 - movs r1, 0xC - bl sub_80095E4 - adds r0, 0x2 - strh r0, [r5, 0x10] - strh r0, [r5, 0xE] - movs r0, 0xE - strb r0, [r7, 0x2] - movs r0, 0x2 - strh r0, [r5, 0x8] - adds r1, r5, 0 - adds r1, 0x18 - adds r0, r5, 0 - adds r0, 0x48 - ldm r0!, {r2,r3,r7} - stm r1!, {r2,r3,r7} - ldm r0!, {r2,r3,r7} - stm r1!, {r2,r3,r7} - adds r1, r5, 0 - adds r1, 0x30 - adds r0, r5, 0 - adds r0, 0x48 - ldm r0!, {r2,r3,r7} - stm r1!, {r2,r3,r7} - ldm r0!, {r2,r3,r7} - stm r1!, {r2,r3,r7} - adds r0, r5, 0 - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r6, 0 - movs r1, 0 - bl sub_80137B0 - ldr r0, _0806430C - mov r7, r9 - ldr r1, [r7, 0x70] - movs r2, 0 - bl SetMessageArgument_2 - str r4, [sp] - str r4, [sp, 0x4] - mov r0, r8 - mov r1, r9 - mov r2, r10 - movs r3, 0 - bl sub_8063578 - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08064304: .4byte gUnknown_202EE10 -_08064308: .4byte gUnknown_202F2D8 -_0806430C: .4byte gFormatBuffer_Monsters - thumb_func_end sub_8064228 - - thumb_func_start sub_8064310 -sub_8064310: - push {r4,lr} - adds r4, r0, 0 - ldr r1, _08064350 - movs r0, 0 - str r0, [r1] - movs r0, 0x22 - movs r1, 0 - bl sub_8044F5C - movs r0, 0x21 - movs r1, 0 - bl sub_8044F5C - ldr r0, _08064354 - ldr r1, [r0] - adds r0, r4, 0 - bl sub_8064358 - lsls r0, 24 - cmp r0, 0 - bne _08064340 - movs r0, 0x21 - bl sub_8044FF0 -_08064340: - movs r0, 0x1D - movs r1, 0 - bl sub_8044F5C - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08064350: .4byte gUnknown_202EE6C -_08064354: .4byte gUnknown_202F2D8 - thumb_func_end sub_8064310 - - thumb_func_start sub_8064358 -sub_8064358: - push {r4-r6,lr} - adds r3, r0, 0 - adds r2, r1, 0 - movs r5, 0 - adds r2, 0x1 - movs r4, 0 - cmp r2, 0x7 - bgt _0806439C - lsls r0, r2, 3 - adds r0, r3, r0 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0806439C - movs r5, 0x1 - adds r2, 0x1 - movs r6, 0x2 - lsls r0, r2, 3 - adds r3, r0, r3 -_08064380: - adds r4, 0x1 - cmp r4, 0x7 - bgt _0806439C - cmp r2, 0x7 - bgt _0806439C - ldrb r1, [r3] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _0806439C - movs r5, 0x1 - adds r3, 0x8 - adds r2, 0x1 - b _08064380 -_0806439C: - cmp r5, 0 - bne _080643A4 - movs r0, 0 - b _080643A6 -_080643A4: - movs r0, 0x1 -_080643A6: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8064358 - - thumb_func_start sub_80643AC -sub_80643AC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xE4 - adds r7, r0, 0 - add r0, sp, 0x68 - mov r9, r0 - mov r1, sp - adds r1, 0x6C - str r1, [sp, 0xD0] - mov r2, sp - adds r2, 0x6E - str r2, [sp, 0xD4] - mov r0, sp - adds r0, 0x70 - str r0, [sp, 0xD8] - adds r1, 0xC - str r1, [sp, 0xDC] - adds r2, 0x22 - str r2, [sp, 0xE0] - adds r0, 0x38 - str r0, [sp, 0xC8] - subs r1, 0x18 - str r1, [sp, 0xC4] - add r2, sp, 0xC0 - mov r10, r2 - ldr r5, _080644C8 - adds r0, r7, 0x4 - str r0, [sp, 0xCC] - ldr r1, _080644CC - mov r8, r1 - movs r6, 0 -_080643F0: - movs r4, 0 - ldr r0, [sp, 0xC4] - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x64] - movs r0, 0x2 - mov r2, r9 - strh r0, [r2] - strh r0, [r2, 0x2] - movs r0, 0x12 - ldr r1, [sp, 0xD0] - strh r0, [r1] - movs r0, 0x4 - ldr r2, [sp, 0xD4] - strh r0, [r2] - movs r0, 0x10 - ldr r1, [sp, 0xD8] - strh r0, [r1] - mov r2, r10 - str r2, [sp, 0x74] - movs r0, 0x3 - ldr r1, [sp, 0xDC] - str r0, [r1, 0x4] - ldr r2, [sp, 0xE0] - str r0, [r2, 0x4] - ldr r1, [sp, 0xC8] - str r0, [r1, 0x4] - mov r0, sp - ldr r1, [sp, 0xC4] - movs r2, 0x60 - bl memcpy - bl sub_8083D44 - adds r0, r7, 0x4 - mov r1, sp - mov r2, r10 - bl sub_806455C - movs r0, 0x2D - bl sub_803E46C - adds r0, r7, 0 - bl sub_80645D4 - strh r4, [r5, 0x8] - strh r4, [r5, 0xA] - mov r0, sp - movs r1, 0x16 - bl sub_805FC30 -_0806445C: - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x2D - bl sub_803E46C - mov r2, r8 - ldrh r1, [r2, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08064482 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80136E0 -_08064482: - mov r0, r8 - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _0806449C - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8013744 -_0806449C: - mov r2, r8 - ldrh r1, [r2, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _080644B2 - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08064510 -_080644B2: - movs r1, 0x18 - ldrsh r0, [r5, r1] - cmp r0, 0x1 - bne _080644D0 - bl sub_8083D08 - ldr r0, [sp, 0xCC] - bl sub_80645F8 - movs r4, 0x2 - b _0806452A - .align 2, 0 -_080644C8: .4byte gUnknown_202EE10 -_080644CC: .4byte gRealInputs -_080644D0: - movs r2, 0x18 - ldrsh r0, [r5, r2] - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - beq _0806450C - ldr r4, [r7, 0x70] - adds r4, 0x44 - ldr r1, _08064508 - movs r2, 0x18 - ldrsh r0, [r5, r2] - lsls r0, 2 - adds r0, r1 - ldrh r1, [r0] - adds r0, r4, 0 - bl SetMonsterActionFields - bl sub_8083D08 - strb r6, [r4, 0x4] - strh r6, [r4, 0x8] - strh r6, [r4, 0xA] - strb r6, [r4, 0xC] - strh r6, [r4, 0x10] - strh r6, [r4, 0x12] - movs r4, 0 - b _0806452A - .align 2, 0 -_08064508: .4byte gUnknown_202EE44 -_0806450C: - bl sub_8083D30 -_08064510: - mov r0, r8 - ldrh r1, [r0, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064524 - ldr r1, _08064554 - ldrb r0, [r1] - cmp r0, 0 - beq _0806445C -_08064524: - bl sub_8083D30 - movs r4, 0x1 -_0806452A: - ldr r0, _08064558 - bl AddMenuCursorSprite - movs r0, 0x2D - bl sub_803E46C - cmp r4, 0x2 - bne _0806453C - b _080643F0 -_0806453C: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - add sp, 0xE4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08064554: .4byte gUnknown_202EE3A -_08064558: .4byte gUnknown_202EE10 - thumb_func_end sub_80643AC - - thumb_func_start sub_806455C -sub_806455C: - push {r4,r5,lr} - sub sp, 0x54 - adds r4, r0, 0 - adds r0, r1, 0 - movs r5, 0 - movs r1, 0x1 - strb r1, [r2] - strb r5, [r2, 0x1] - movs r1, 0xC - strb r1, [r2, 0x2] - strb r5, [r2, 0x3] - movs r1, 0x1 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - movs r1, 0 - ldrsh r0, [r4, r1] - movs r2, 0x2 - ldrsh r1, [r4, r2] - bl GetTile - adds r4, r0, 0 - ldr r0, _080645D0 - ldr r2, [r0] - str r5, [sp] - movs r0, 0xC - movs r1, 0 - movs r3, 0 - bl PrintStringOnWindow - ldr r0, [r4, 0x14] - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080645C0 - ldr r1, [r4, 0x14] - add r0, sp, 0x4 - movs r2, 0 - bl SubstitutePlaceholderStringTags - str r5, [sp] - movs r0, 0x8 - movs r1, 0x12 - add r2, sp, 0x4 - movs r3, 0 - bl PrintStringOnWindow -_080645C0: - movs r0, 0 - bl sub_80073E0 - add sp, 0x54 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080645D0: .4byte gUnknown_80FE708 - thumb_func_end sub_806455C - - thumb_func_start sub_80645D4 -sub_80645D4: - push {lr} - ldr r1, _080645F4 - movs r0, 0 - str r0, [r1] - movs r0, 0x25 - movs r1, 0 - bl sub_8044F5C - movs r0, 0xC - movs r1, 0 - bl sub_8044F5C - bl sub_8045064 - pop {r0} - bx r0 - .align 2, 0 -_080645F4: .4byte gUnknown_202EE6C - thumb_func_end sub_80645D4 - - thumb_func_start sub_80645F8 -sub_80645F8: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x110 - str r0, [sp, 0xE4] - mov r0, sp - adds r0, 0x84 - str r0, [sp, 0xF4] - mov r1, sp - adds r1, 0x88 - str r1, [sp, 0xF8] - mov r2, sp - adds r2, 0x8C - str r2, [sp, 0xFC] - mov r3, sp - adds r3, 0x8E - str r3, [sp, 0x100] - adds r0, 0xC - str r0, [sp, 0x104] - adds r1, 0xC - str r1, [sp, 0x108] - adds r2, 0xC - str r2, [sp, 0x10C] - adds r3, 0x22 - str r3, [sp, 0xEC] - adds r0, 0x38 - str r0, [sp, 0xF0] - add r6, sp, 0x14 - subs r1, 0x74 - str r1, [sp, 0xE8] - add r2, sp, 0x80 - mov r10, r2 - add r3, sp, 0xE0 - mov r9, r3 -_08064640: - movs r7, 0 - mov r0, r10 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - ldr r1, [sp, 0xF4] - str r0, [r1] - movs r0, 0x2 - ldr r2, [sp, 0xF8] - strh r0, [r2] - strh r0, [r2, 0x2] - movs r0, 0x1A - ldr r3, [sp, 0xFC] - strh r0, [r3] - movs r0, 0xC - ldr r1, [sp, 0x100] - strh r0, [r1] - ldr r2, [sp, 0x104] - strh r0, [r2] - mov r3, r9 - ldr r0, [sp, 0x108] - str r3, [r0] - movs r0, 0x3 - ldr r1, [sp, 0x10C] - str r0, [r1, 0x4] - ldr r2, [sp, 0xEC] - str r0, [r2, 0x4] - ldr r3, [sp, 0xF0] - str r0, [r3, 0x4] - ldr r0, [sp, 0xE8] - mov r1, r10 - movs r2, 0x60 - bl memcpy - adds r0, r6, 0 - bl sub_801317C - movs r1, 0x1 - add r0, sp, 0xE0 - strb r1, [r0] - movs r1, 0 - mov r0, r9 - strb r1, [r0, 0x1] - movs r0, 0x10 - mov r2, r9 - strb r0, [r2, 0x2] - strb r1, [r2, 0x3] - ldr r3, [sp, 0xE4] - movs r1, 0 - ldrsh r0, [r3, r1] - movs r2, 0x2 - ldrsh r1, [r3, r2] - bl GetTile - ldr r4, [r0, 0x14] - cmp r4, 0 - bne _080646B8 - b _080647D8 -_080646B8: - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x2 - beq _080646C4 - b _080647D8 -_080646C4: - ldr r0, [sp, 0xE8] - movs r1, 0 - bl sub_803ECB4 - adds r0, r4, 0 - bl GetTrapData - adds r4, r0, 0 - ldrb r1, [r4] - mov r0, r10 - bl GetTrapName - movs r0, 0 - bl sub_80073B8 - str r7, [sp] - movs r0, 0x10 - movs r1, 0 - mov r2, r10 - movs r3, 0 - bl PrintStringOnWindow - ldr r5, _08064720 - ldrb r0, [r4] - lsls r0, 2 - adds r0, r5 - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r1, 0x18 - movs r3, 0 - bl PrintStringOnWindow - movs r0, 0 - bl sub_80073E0 - ldrb r0, [r4] - lsls r0, 2 - adds r0, r5 - ldr r0, [r0] - add r1, sp, 0x4 - bl sub_8097DF0 - adds r5, r0, 0 - b _08064738 - .align 2, 0 -_08064720: .4byte gTrapDescriptions -_08064724: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064732 - ldrb r0, [r6, 0x2] - cmp r0, 0 - beq _08064738 -_08064732: - bl sub_8083D30 - b _080647D8 -_08064738: - cmp r5, 0 - beq _08064740 - bl sub_8062500 -_08064740: - adds r0, r6, 0 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _08064788 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064760 - ldrb r0, [r6, 0x1] - cmp r0, 0 - beq _08064724 -_08064760: - bl sub_8083D08 - cmp r5, 0 - beq _080647D8 - movs r4, 0 - cmp r4, r5 - blt _08064770 - b _08064640 -_08064770: - subs r3, r5, 0x1 - mov r8, r3 -_08064774: - lsls r0, r4, 2 - add r0, sp - adds r0, 0x4 - ldr r0, [r0] - adds r1, r6, 0 - bl sub_80639E4 - adds r7, r4, 0x1 - b _080647A0 - .align 2, 0 -_08064788: .4byte gRealInputs -_0806478C: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0806479A - ldrb r0, [r6, 0x2] - cmp r0, 0 - beq _080647A0 -_0806479A: - bl sub_8083D30 - b _080647CC -_080647A0: - cmp r4, r8 - bge _080647A8 - bl sub_8062500 -_080647A8: - adds r0, r6, 0 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _080647D4 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _080647C8 - ldrb r0, [r6, 0x1] - cmp r0, 0 - beq _0806478C -_080647C8: - bl sub_8083D08 -_080647CC: - adds r4, r7, 0 - cmp r4, r5 - blt _08064774 - b _08064640 - .align 2, 0 -_080647D4: .4byte gRealInputs -_080647D8: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - add sp, 0x110 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80645F8 - - thumb_func_start sub_80647F0 -sub_80647F0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xE4 - adds r7, r0, 0 - add r0, sp, 0x68 - mov r9, r0 - mov r1, sp - adds r1, 0x6C - str r1, [sp, 0xD0] - mov r2, sp - adds r2, 0x6E - str r2, [sp, 0xD4] - mov r0, sp - adds r0, 0x70 - str r0, [sp, 0xD8] - adds r1, 0xC - str r1, [sp, 0xDC] - adds r2, 0x22 - str r2, [sp, 0xE0] - adds r0, 0x38 - str r0, [sp, 0xC8] - subs r1, 0x18 - str r1, [sp, 0xC4] - add r2, sp, 0xC0 - mov r10, r2 - ldr r5, _0806490C - adds r0, r7, 0x4 - str r0, [sp, 0xCC] - ldr r1, _08064910 - mov r8, r1 - movs r6, 0 -_08064834: - movs r4, 0 - ldr r0, [sp, 0xC4] - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x64] - movs r0, 0x2 - mov r2, r9 - strh r0, [r2] - strh r0, [r2, 0x2] - movs r0, 0x12 - ldr r1, [sp, 0xD0] - strh r0, [r1] - movs r0, 0x4 - ldr r2, [sp, 0xD4] - strh r0, [r2] - movs r0, 0x10 - ldr r1, [sp, 0xD8] - strh r0, [r1] - mov r2, r10 - str r2, [sp, 0x74] - movs r0, 0x3 - ldr r1, [sp, 0xDC] - str r0, [r1, 0x4] - ldr r2, [sp, 0xE0] - str r0, [r2, 0x4] - ldr r1, [sp, 0xC8] - str r0, [r1, 0x4] - mov r0, sp - ldr r1, [sp, 0xC4] - movs r2, 0x60 - bl memcpy - bl sub_8083D44 - adds r0, r7, 0x4 - mov r1, sp - mov r2, r10 - bl sub_80649A0 - movs r0, 0x2E - bl sub_803E46C - adds r0, r7, 0 - bl sub_8064A18 - strh r4, [r5, 0x8] - strh r4, [r5, 0xA] - mov r0, sp - movs r1, 0x16 - bl sub_805FC30 -_080648A0: - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x2E - bl sub_803E46C - mov r2, r8 - ldrh r1, [r2, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _080648C6 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80136E0 -_080648C6: - mov r0, r8 - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _080648E0 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8013744 -_080648E0: - mov r2, r8 - ldrh r1, [r2, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _080648F6 - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08064954 -_080648F6: - movs r1, 0x18 - ldrsh r0, [r5, r1] - cmp r0, 0x1 - bne _08064914 - bl sub_8083D08 - ldr r0, [sp, 0xCC] - bl sub_8064A3C - movs r4, 0x2 - b _0806496E - .align 2, 0 -_0806490C: .4byte gUnknown_202EE10 -_08064910: .4byte gRealInputs -_08064914: - movs r2, 0x18 - ldrsh r0, [r5, r2] - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - beq _08064950 - ldr r4, [r7, 0x70] - adds r4, 0x44 - ldr r1, _0806494C - movs r2, 0x18 - ldrsh r0, [r5, r2] - lsls r0, 2 - adds r0, r1 - ldrh r1, [r0] - adds r0, r4, 0 - bl SetMonsterActionFields - bl sub_8083D08 - strb r6, [r4, 0x4] - strh r6, [r4, 0x8] - strh r6, [r4, 0xA] - strb r6, [r4, 0xC] - strh r6, [r4, 0x10] - strh r6, [r4, 0x12] - movs r4, 0 - b _0806496E - .align 2, 0 -_0806494C: .4byte gUnknown_202EE44 -_08064950: - bl sub_8083D30 -_08064954: - mov r0, r8 - ldrh r1, [r0, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064968 - ldr r1, _08064998 - ldrb r0, [r1] - cmp r0, 0 - beq _080648A0 -_08064968: - bl sub_8083D30 - movs r4, 0x1 -_0806496E: - ldr r0, _0806499C - bl AddMenuCursorSprite - movs r0, 0x2E - bl sub_803E46C - cmp r4, 0x2 - bne _08064980 - b _08064834 -_08064980: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - add sp, 0xE4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08064998: .4byte gUnknown_202EE3A -_0806499C: .4byte gUnknown_202EE10 - thumb_func_end sub_80647F0 - - thumb_func_start sub_80649A0 -sub_80649A0: - push {r4,r5,lr} - sub sp, 0x4 - adds r0, r1, 0 - movs r3, 0 - movs r1, 0x1 - strb r1, [r2] - strb r3, [r2, 0x1] - movs r1, 0xB - strb r1, [r2, 0x2] - strb r3, [r2, 0x3] - movs r1, 0x1 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - bl GetFloorType - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080649E4 - cmp r0, 0x1 - ble _080649D4 - cmp r0, 0x2 - beq _080649DC -_080649D4: - ldr r0, _080649D8 - b _080649E6 - .align 2, 0 -_080649D8: .4byte gUnknown_80FE70C -_080649DC: - ldr r0, _080649E0 - b _080649E6 - .align 2, 0 -_080649E0: .4byte gUnknown_80FE720 -_080649E4: - ldr r0, _08064A14 -_080649E6: - ldr r5, [r0] - movs r4, 0 - str r4, [sp] - movs r0, 0xC - movs r1, 0 - adds r2, r5, 0 - movs r3, 0 - bl PrintStringOnWindow - str r4, [sp] - movs r0, 0x8 - movs r1, 0x12 - adds r2, r5, 0 - movs r3, 0 - bl PrintStringOnWindow - movs r0, 0 - bl sub_80073E0 - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08064A14: .4byte gUnknown_80FE724 - thumb_func_end sub_80649A0 - - thumb_func_start sub_8064A18 -sub_8064A18: - push {lr} - ldr r1, _08064A38 - movs r0, 0 - str r0, [r1] - movs r0, 0x26 - movs r1, 0 - bl sub_8044F5C - movs r0, 0xC - movs r1, 0 - bl sub_8044F5C - bl sub_8045064 - pop {r0} - bx r0 - .align 2, 0 -_08064A38: .4byte gUnknown_202EE6C - thumb_func_end sub_8064A18 - - thumb_func_start sub_8064A3C -sub_8064A3C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xE8 - mov r0, sp - adds r0, 0x20 - str r0, [sp, 0xE4] - add r1, sp, 0x80 - mov r10, r1 - add r0, sp, 0xE0 - mov r9, r0 - add r5, sp, 0x14 -_08064A58: - mov r0, r10 - movs r1, 0 - movs r2, 0x60 - bl memset - add r1, sp, 0x84 - movs r0, 0x6 - str r0, [r1] - add r0, sp, 0x88 - movs r1, 0x2 - strh r1, [r0] - strh r1, [r0, 0x2] - add r1, sp, 0x8C - movs r0, 0x1A - strh r0, [r1] - mov r0, sp - adds r0, 0x8E - movs r1, 0xC - strh r1, [r0] - add r0, sp, 0x90 - strh r1, [r0] - add r0, sp, 0x94 - mov r1, r9 - str r1, [r0] - add r0, sp, 0x98 - movs r1, 0x3 - str r1, [r0, 0x4] - add r0, sp, 0xB0 - str r1, [r0, 0x4] - add r0, sp, 0xC8 - str r1, [r0, 0x4] - ldr r0, [sp, 0xE4] - mov r1, r10 - movs r2, 0x60 - bl memcpy - add r0, sp, 0x14 - bl sub_801317C - movs r0, 0x1 - mov r1, r9 - strb r0, [r1] - movs r0, 0 - strb r0, [r1, 0x1] - movs r0, 0x10 - strb r0, [r1, 0x2] - movs r0, 0 - strb r0, [r1, 0x3] - ldr r0, [sp, 0xE4] - movs r1, 0 - bl sub_803ECB4 - bl GetFloorType - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0 - bl sub_80073B8 - ldr r0, _08064B0C - lsls r4, 2 - adds r0, r4, r0 - ldr r2, [r0] - movs r1, 0 - str r1, [sp] - movs r0, 0x10 - movs r3, 0 - bl PrintStringOnWindow - ldr r0, _08064B10 - adds r4, r0 - ldr r4, [r4] - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - movs r1, 0x18 - adds r2, r4, 0 - movs r3, 0 - bl PrintStringOnWindow - movs r0, 0 - bl sub_80073E0 - adds r0, r4, 0 - add r1, sp, 0x4 - bl sub_8097DF0 - adds r6, r0, 0 - b _08064B28 - .align 2, 0 -_08064B0C: .4byte gUnknown_80F8104 -_08064B10: .4byte gUnknown_80F7F70 -_08064B14: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064B22 - ldrb r0, [r5, 0x2] - cmp r0, 0 - beq _08064B28 -_08064B22: - bl sub_8083D30 - b _08064BC8 -_08064B28: - cmp r6, 0 - beq _08064B30 - bl sub_8062500 -_08064B30: - adds r0, r5, 0 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _08064B78 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064B50 - ldrb r0, [r5, 0x1] - cmp r0, 0 - beq _08064B14 -_08064B50: - bl sub_8083D08 - cmp r6, 0 - beq _08064BC8 - movs r4, 0 - cmp r4, r6 - blt _08064B60 - b _08064A58 -_08064B60: - subs r1, r6, 0x1 - mov r8, r1 -_08064B64: - lsls r0, r4, 2 - add r0, sp - adds r0, 0x4 - ldr r0, [r0] - adds r1, r5, 0 - bl sub_80639E4 - adds r7, r4, 0x1 - b _08064B90 - .align 2, 0 -_08064B78: .4byte gRealInputs -_08064B7C: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064B8A - ldrb r0, [r5, 0x2] - cmp r0, 0 - beq _08064B90 -_08064B8A: - bl sub_8083D30 - b _08064BBC -_08064B90: - cmp r4, r8 - bge _08064B98 - bl sub_8062500 -_08064B98: - adds r0, r5, 0 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _08064BC4 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064BB8 - ldrb r0, [r5, 0x1] - cmp r0, 0 - beq _08064B7C -_08064BB8: - bl sub_8083D08 -_08064BBC: - adds r4, r7, 0 - cmp r4, r6 - blt _08064B64 - b _08064A58 - .align 2, 0 -_08064BC4: .4byte gRealInputs -_08064BC8: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - add sp, 0xE8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8064A3C - - thumb_func_start sub_8064BE0 -sub_8064BE0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - ldr r0, _08064C94 - ldr r0, [r0] - movs r1, 0xCB - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - movs r1, 0x4 - mov r9, r1 - cmp r0, 0 - beq _08064C02 - movs r0, 0x5 - mov r9, r0 -_08064C02: - ldr r1, _08064C98 - movs r0, 0 - str r0, [r1] - mov r10, r0 - ldr r6, _08064C9C - ldr r7, _08064CA0 - movs r1, 0x2A - adds r1, r6 - mov r8, r1 -_08064C14: - movs r5, 0 - bl sub_8065250 -_08064C1A: - adds r0, r6, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldrh r1, [r7, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08064C3E - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_80136E0 -_08064C3E: - ldrh r1, [r7, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08064C56 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_8013744 -_08064C56: - ldrh r1, [r7, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064C6A - adds r0, r6, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08064CAA -_08064C6A: - movs r1, 0x18 - ldrsh r0, [r6, r1] - cmp r0, 0x4 - bne _08064C8C - ldr r0, _08064C94 - ldr r0, [r0] - movs r1, 0xCB - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08064CA4 - bl IsBossFight - lsls r0, 24 - cmp r0, 0 - bne _08064CA4 -_08064C8C: - bl sub_8083D08 - b _08064CC0 - .align 2, 0 -_08064C94: .4byte gDungeon -_08064C98: .4byte gUnknown_202F2E0 -_08064C9C: .4byte gUnknown_202EE10 -_08064CA0: .4byte gRealInputs -_08064CA4: - bl sub_8083D30 - b _08064CC0 -_08064CAA: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064CBA - mov r1, r8 - ldrb r0, [r1] - cmp r0, 0 - beq _08064C1A -_08064CBA: - bl sub_8083D30 - movs r5, 0x1 -_08064CC0: - ldr r4, _08064D68 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - mov r0, r10 - cmp r0, 0 - bne _08064C14 - cmp r5, 0 - bne _08064D4C - ldr r5, _08064D6C - movs r1, 0x18 - ldrsh r0, [r4, r1] - str r0, [r5] - cmp r0, 0 - bne _08064CE8 - bl sub_8064D74 -_08064CE8: - ldr r0, [r5] - cmp r0, 0x1 - bne _08064CF2 - bl sub_80650C0 -_08064CF2: - ldr r0, [r5] - cmp r0, 0x2 - bne _08064CFC - bl DisplayMessageLog -_08064CFC: - ldr r0, [r5] - cmp r0, 0x3 - bne _08064D06 - bl sub_806519C -_08064D06: - ldr r0, _08064D70 - ldr r0, [r0] - movs r1, 0xCB - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08064D2A - bl IsBossFight - lsls r0, 24 - cmp r0, 0 - bne _08064D2A - ldr r0, [r5] - cmp r0, 0x4 - bne _08064D2A - bl sub_8065FB4 -_08064D2A: - ldr r0, _08064D6C - ldr r0, [r0] - cmp r0, r9 - bne _08064D36 - bl sub_8065BF4 -_08064D36: - ldr r0, _08064D70 - ldr r0, [r0] - ldrb r0, [r0, 0x4] - cmp r0, 0 - bne _08064D4C - bl GetLeaderActionId - lsls r0, 16 - cmp r0, 0 - bne _08064D4C - b _08064C14 -_08064D4C: - bl ShowWholeRevealedDungeonMap - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08064D68: .4byte gUnknown_202EE10 -_08064D6C: .4byte gUnknown_202F2E0 -_08064D70: .4byte gDungeon - thumb_func_end sub_8064BE0 - - thumb_func_start sub_8064D74 -sub_8064D74: - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r6, _08064DE0 - ldr r7, _08064DE4 - movs r0, 0x2A - adds r0, r6 - mov r8, r0 -_08064D84: - movs r5, 0 - bl CreateFieldGameOptionsMenu -_08064D8A: - adds r0, r6, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldrh r1, [r7, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08064DAE - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_80136E0 -_08064DAE: - ldrh r1, [r7, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08064DC6 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_8013744 -_08064DC6: - ldrh r1, [r7, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064DDA - adds r0, r6, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08064DE8 -_08064DDA: - bl sub_8083D08 - b _08064DFE - .align 2, 0 -_08064DE0: .4byte gUnknown_202EE10 -_08064DE4: .4byte gRealInputs -_08064DE8: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08064DF8 - mov r1, r8 - ldrb r0, [r1] - cmp r0, 0 - beq _08064D8A -_08064DF8: - bl sub_8083D30 - movs r5, 0x1 -_08064DFE: - ldr r4, _08064E2C - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - cmp r5, 0 - bne _08064E56 - ldr r0, _08064E30 - ldr r1, _08064E34 - ldr r0, [r0] - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldr r0, [r0] - str r0, [r1] - movs r1, 0x18 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _08064E38 - bl sub_8064E68 - b _08064E40 - .align 2, 0 -_08064E2C: .4byte gUnknown_202EE10 -_08064E30: .4byte gGameOptionsRef -_08064E34: .4byte gUnknown_202F2E8 -_08064E38: - cmp r0, 0x1 - bne _08064E4C - bl sub_8064F50 -_08064E40: - lsls r0, 24 - lsrs r5, r0, 24 - adds r0, r5, 0 - bl sub_8065040 - b _08064D84 -_08064E4C: - cmp r0, 0x2 - bne _08064D84 - bl sub_806509C - b _08064D84 -_08064E56: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8064D74 - - thumb_func_start sub_8064E68 -sub_8064E68: - push {r4-r7,lr} - mov r7, r8 - push {r7} - movs r7, 0 - ldr r0, _08064EDC - strh r7, [r0, 0x18] - adds r4, r0, 0 - ldr r6, _08064EE0 - movs r0, 0x2A - adds r0, r4 - mov r8, r0 -_08064E7E: - movs r7, 0 - movs r5, 0 - bl CreateFieldDungeonMenu -_08064E86: - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldrh r1, [r6, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08064EAA - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80136E0 -_08064EAA: - ldrh r1, [r6, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08064EC2 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8013744 -_08064EC2: - ldrh r1, [r6, 0x4] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _08064EE4 - movs r0, 0 - bl sub_8083CE0 - movs r1, 0x18 - ldrsh r0, [r4, r1] - bl sub_8065A8C - b _08064F2E - .align 2, 0 -_08064EDC: .4byte gUnknown_202EE10 -_08064EE0: .4byte gRealInputs -_08064EE4: - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _08064EFC - movs r0, 0 - bl sub_8083CE0 - movs r2, 0x18 - ldrsh r0, [r4, r2] - bl sub_8065B3C - b _08064F2E -_08064EFC: - ldrh r1, [r6, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064F0E - mov r2, r8 - ldrb r0, [r2] - cmp r0, 0 - beq _08064F14 -_08064F0E: - bl sub_8083D08 - b _08064F30 -_08064F14: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08064F24 - bl sub_8083D30 - movs r7, 0x1 - b _08064F30 -_08064F24: - bl sub_8065BEC - lsls r0, 24 - cmp r0, 0 - beq _08064E86 -_08064F2E: - movs r5, 0x1 -_08064F30: - ldr r0, _08064F4C - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - cmp r5, 0 - bne _08064E7E - adds r0, r7, 0 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08064F4C: .4byte gUnknown_202EE10 - thumb_func_end sub_8064E68 - - thumb_func_start sub_8064F50 -sub_8064F50: - push {r4-r7,lr} - mov r7, r8 - push {r7} - movs r7, 0 - ldr r0, _08064FC8 - strh r7, [r0, 0x18] - adds r4, r0, 0 - ldr r6, _08064FCC - movs r0, 0x2A - adds r0, r4 - mov r8, r0 -_08064F66: - movs r7, 0 - movs r5, 0 - bl CreateFieldOthersMenu -_08064F6E: - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldrh r1, [r6, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08064F92 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80136E0 -_08064F92: - ldrh r1, [r6, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08064FAA - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8013744 -_08064FAA: - ldrh r1, [r6, 0x4] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _08064FD0 - movs r0, 0 - bl sub_8083CE0 - movs r1, 0x18 - ldrsh r0, [r4, r1] - adds r0, 0x5 - bl sub_8065A8C - b _0806501C - .align 2, 0 -_08064FC8: .4byte gUnknown_202EE10 -_08064FCC: .4byte gRealInputs -_08064FD0: - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _08064FEA - movs r0, 0 - bl sub_8083CE0 - movs r2, 0x18 - ldrsh r0, [r4, r2] - adds r0, 0x5 - bl sub_8065B3C - b _0806501C -_08064FEA: - ldrh r1, [r6, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08064FFC - mov r2, r8 - ldrb r0, [r2] - cmp r0, 0 - beq _08065002 -_08064FFC: - bl sub_8083D08 - b _0806501E -_08065002: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08065012 - bl sub_8083D30 - movs r7, 0x1 - b _0806501E -_08065012: - bl sub_8065BF0 - lsls r0, 24 - cmp r0, 0 - beq _08064F6E -_0806501C: - movs r5, 0x1 -_0806501E: - ldr r0, _0806503C - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - cmp r5, 0 - bne _08064F66 - adds r0, r7, 0 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0806503C: .4byte gUnknown_202EE10 - thumb_func_end sub_8064F50 - - thumb_func_start sub_8065040 -sub_8065040: - push {r4,lr} - lsls r0, 24 - movs r4, 0 - cmp r0, 0 - beq _0806505C - ldr r0, _08065058 - bl GameOptionsNotChange - lsls r0, 24 - cmp r0, 0 - bne _0806505E - b _08065062 - .align 2, 0 -_08065058: .4byte gUnknown_202F2E8 -_0806505C: - movs r4, 0x1 -_0806505E: - cmp r4, 0 - beq _08065088 -_08065062: - ldr r0, _08065090 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - bne _08065088 - ldr r0, _08065094 - ldr r1, [r0] - ldr r0, _08065098 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - bl sub_803E13C - bl LoadDungeonMapPalette -_08065088: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08065090: .4byte gUnknown_80FEBF8 -_08065094: .4byte gGameOptionsRef -_08065098: .4byte gUnknown_202F2E8 - thumb_func_end sub_8065040 - - thumb_func_start sub_806509C -sub_806509C: - push {lr} - ldr r0, _080650BC - ldr r1, [r0] - movs r0, 0 - movs r2, 0 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - bne _080650B8 - movs r0, 0 - bl InitializeGameOptions - bl sub_803E13C -_080650B8: - pop {r0} - bx r0 - .align 2, 0 -_080650BC: .4byte gUnknown_80FEC28 - thumb_func_end sub_806509C - - thumb_func_start sub_80650C0 -sub_80650C0: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - movs r0, 0 - mov r9, r0 - ldr r5, _08065134 - ldr r6, _08065138 - movs r1, 0x2A - adds r1, r5 - mov r8, r1 -_080650D6: - movs r7, 0 - bl sub_806544C -_080650DC: - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldrh r1, [r6, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08065100 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80136E0 -_08065100: - ldrh r1, [r6, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08065118 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8013744 -_08065118: - ldrh r1, [r6, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _0806512C - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _0806513C -_0806512C: - bl sub_8083D08 - b _08065152 - .align 2, 0 -_08065134: .4byte gUnknown_202EE10 -_08065138: .4byte gRealInputs -_0806513C: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0806514C - mov r1, r8 - ldrb r0, [r1] - cmp r0, 0 - beq _080650DC -_0806514C: - bl sub_8083D30 - movs r7, 0x1 -_08065152: - ldr r4, _08065178 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - mov r0, r9 - cmp r0, 0 - bne _080650D6 - cmp r7, 0 - bne _0806518E - movs r1, 0x18 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0806517C - bl sub_80651D0 - b _08065184 - .align 2, 0 -_08065178: .4byte gUnknown_202EE10 -_0806517C: - cmp r0, 0x1 - bne _08065184 - bl sub_80651FC -_08065184: - bl GetLeaderActionId - lsls r0, 16 - cmp r0, 0 - beq _080650D6 -_0806518E: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80650C0 - - thumb_func_start sub_806519C -sub_806519C: - push {lr} - ldr r0, _080651CC - ldr r1, [r0] - movs r2, 0xCF - lsls r2, 3 - adds r0, r1, r2 - ldrb r0, [r0] - subs r2, 0x34 - adds r1, r2 - ldrb r1, [r1] - movs r2, 0 - bl sub_80319A4 -_080651B6: - movs r0, 0x47 - bl sub_803E46C - bl sub_80319F8 - cmp r0, 0 - beq _080651B6 - bl sub_8031A3C - pop {r0} - bx r0 - .align 2, 0 -_080651CC: .4byte gDungeon - thumb_func_end sub_806519C - - thumb_func_start sub_80651D0 -sub_80651D0: - push {lr} - ldr r0, _080651F0 - ldr r1, [r0] - movs r0, 0 - movs r2, 0 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - bne _080651F4 - bl GetLeaderActionContainer - movs r1, 0x2B - bl SetMonsterActionFields - movs r0, 0 - b _080651F6 - .align 2, 0 -_080651F0: .4byte gUnknown_80FDE6C -_080651F4: - movs r0, 0x1 -_080651F6: - pop {r1} - bx r1 - thumb_func_end sub_80651D0 - - thumb_func_start sub_80651FC -sub_80651FC: - push {r4,r5,lr} - ldr r0, _08065238 - ldr r1, [r0] - movs r0, 0 - movs r2, 0 - bl DisplayDungeonYesNoMessage - adds r5, r0, 0 - cmp r5, 0x1 - bne _08065248 - bl GetLeaderActionContainer - movs r1, 0x2E - bl SetMonsterActionFields - ldr r4, _0806523C - bl GetLeader - adds r2, r0, 0 - adds r0, r4, 0 - movs r1, 0 - bl sub_8083AB0 - ldr r0, _08065240 - ldr r0, [r0] - ldr r1, _08065244 - adds r0, r1 - strb r5, [r0] - movs r0, 0 - b _0806524A - .align 2, 0 -_08065238: .4byte gUnknown_80FDEB8 -_0806523C: .4byte 0x0000021b -_08065240: .4byte gDungeon -_08065244: .4byte 0x00000654 -_08065248: - movs r0, 0x1 -_0806524A: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80651FC - - thumb_func_start sub_8065250 -sub_8065250: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xC8 - add r5, sp, 0x64 - adds r0, r5, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x68] - add r0, sp, 0x6C - movs r4, 0 - movs r7, 0 - movs r1, 0x2 - mov r9, r1 - mov r1, r9 - strh r1, [r0] - strh r1, [r0, 0x2] - add r0, sp, 0x70 - movs r1, 0x12 - mov r10, r1 - mov r1, r10 - strh r1, [r0] - adds r0, 0x2 - movs r1, 0x10 - mov r8, r1 - mov r1, r8 - strh r1, [r0] - add r0, sp, 0x74 - strh r1, [r0] - add r6, sp, 0xC4 - str r6, [sp, 0x78] - movs r1, 0x3 - str r1, [sp, 0x80] - add r0, sp, 0x94 - str r1, [r0, 0x4] - add r0, sp, 0xAC - str r1, [r0, 0x4] - add r0, sp, 0x4 - adds r1, r5, 0 - movs r2, 0x60 - bl memcpy - movs r0, 0x1 - strb r0, [r6] - strb r4, [r6, 0x1] - strb r4, [r6, 0x3] - ldr r4, _080653D0 - ldr r0, _080653D4 - ldr r0, [r0] - strh r0, [r4, 0x18] - ldr r1, _080653D8 - ldr r0, [r1] - movs r1, 0xCB - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - movs r5, 0x5 - cmp r0, 0 - beq _080652D2 - movs r5, 0x6 -_080652D2: - strh r5, [r4, 0x1A] - strh r5, [r4, 0x1C] - strh r7, [r4, 0x1E] - strh r7, [r4, 0x20] - strh r7, [r4, 0x4] - mov r0, r8 - strh r0, [r4, 0x6] - strh r7, [r4, 0xC] - strh r7, [r4, 0xE] - strh r7, [r4, 0x14] - str r7, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - add r0, sp, 0x4 - mov r1, r10 - strh r1, [r0, 0xC] - adds r0, r5, 0 - movs r1, 0xC - bl sub_80095E4 - add r2, sp, 0x4 - adds r1, r2, 0 - adds r0, 0x2 - strh r0, [r1, 0x10] - strh r0, [r2, 0xE] - movs r0, 0xA - strb r0, [r6, 0x2] - adds r0, r1, 0 - mov r1, r9 - strh r1, [r0, 0x8] - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - movs r0, 0 - bl sub_80073B8 - movs r5, 0 - ldr r0, _080653DC - ldr r2, [r0] - str r5, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - adds r0, r4, 0 - movs r1, 0 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _080653E0 - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - adds r0, r4, 0 - movs r1, 0x1 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _080653E4 - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - adds r0, r4, 0 - movs r1, 0x2 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _080653E8 - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r5, 0x4 - adds r0, r4, 0 - movs r1, 0x3 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _080653EC - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, _080653D8 - ldr r0, [r1] - movs r1, 0xCB - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _0806540E - bl IsBossFight - lsls r0, 24 - cmp r0, 0 - bne _080653F4 - movs r5, 0x5 - adds r0, r4, 0 - movs r1, 0x4 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _080653F0 - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - b _0806540E - .align 2, 0 -_080653D0: .4byte gUnknown_202EE10 -_080653D4: .4byte gUnknown_202F2E0 -_080653D8: .4byte gDungeon -_080653DC: .4byte gUnknown_80FE8F8 -_080653E0: .4byte gUnknown_80FE9CC -_080653E4: .4byte gUnknown_80FE9E8 -_080653E8: .4byte gUnknown_80FE9F8 -_080653EC: .4byte gUnknown_80FEA10 -_080653F0: .4byte gUnknown_80FEA28 -_080653F4: - movs r5, 0x5 - adds r0, r4, 0 - movs r1, 0x4 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _08065440 - ldr r2, [r0] - str r7, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow -_0806540E: - ldr r0, _08065444 - adds r1, r5, 0 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r0, _08065448 - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - add sp, 0xC8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08065440: .4byte gUnknown_80FEA44 -_08065444: .4byte gUnknown_202EE10 -_08065448: .4byte gUnknown_80FEA50 - thumb_func_end sub_8065250 - - thumb_func_start sub_806544C -sub_806544C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xC8 - add r0, sp, 0x64 - mov r10, r0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x68] - add r0, sp, 0x6C - movs r4, 0 - movs r5, 0 - movs r1, 0x2 - mov r9, r1 - mov r2, r9 - strh r2, [r0] - strh r2, [r0, 0x2] - add r0, sp, 0x70 - movs r7, 0x12 - strh r7, [r0] - adds r0, 0x2 - movs r6, 0x10 - strh r6, [r0] - add r0, sp, 0x74 - strh r6, [r0] - add r0, sp, 0xC4 - mov r8, r0 - str r0, [sp, 0x78] - movs r1, 0x3 - str r1, [sp, 0x80] - add r0, sp, 0x94 - str r1, [r0, 0x4] - add r0, sp, 0xAC - str r1, [r0, 0x4] - add r0, sp, 0x4 - mov r1, r10 - movs r2, 0x60 - bl memcpy - movs r0, 0x1 - mov r1, r8 - strb r0, [r1] - strb r4, [r1, 0x1] - strb r4, [r1, 0x3] - ldr r4, _08065568 - strh r5, [r4, 0x18] - mov r2, r9 - strh r2, [r4, 0x1A] - strh r2, [r4, 0x1C] - strh r5, [r4, 0x1E] - strh r5, [r4, 0x20] - strh r5, [r4, 0x4] - strh r6, [r4, 0x6] - strh r5, [r4, 0xC] - strh r5, [r4, 0xE] - strh r5, [r4, 0x14] - str r5, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - add r0, sp, 0x4 - strh r7, [r0, 0xC] - movs r0, 0x2 - movs r1, 0xC - bl sub_80095E4 - add r2, sp, 0x4 - adds r1, r2, 0 - adds r0, 0x2 - strh r0, [r1, 0x10] - strh r0, [r2, 0xE] - movs r0, 0xA - mov r1, r8 - strb r0, [r1, 0x2] - adds r0, r2, 0 - mov r2, r9 - strh r2, [r0, 0x8] - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - movs r0, 0 - bl sub_80073B8 - ldr r0, _0806556C - ldr r2, [r0] - str r5, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - adds r0, r4, 0 - movs r1, 0 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r6, _08065570 - movs r2, 0xAC - lsls r2, 1 - adds r0, r6, r2 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - adds r0, r4, 0 - movs r1, 0x1 - bl GetMenuEntryYCoord - adds r1, r0, 0 - movs r2, 0xB8 - lsls r2, 1 - adds r0, r6, r2 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - add sp, 0xC8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08065568: .4byte gUnknown_202EE10 -_0806556C: .4byte gUnknown_80FE8F4 -_08065570: .4byte gUnknown_80F7C50 - thumb_func_end sub_806544C - - thumb_func_start CreateFieldGameOptionsMenu -CreateFieldGameOptionsMenu: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xD4 - add r0, sp, 0x10 - mov r10, r0 - add r7, sp, 0x70 - adds r0, r7, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x74] - add r0, sp, 0x78 - movs r4, 0 - movs r6, 0 - movs r1, 0x2 - strh r1, [r0] - strh r1, [r0, 0x2] - add r0, sp, 0x7C - movs r1, 0xC - strh r1, [r0] - adds r0, 0x2 - movs r1, 0x10 - mov r9, r1 - mov r1, r9 - strh r1, [r0] - add r0, sp, 0x80 - strh r1, [r0] - add r0, sp, 0x84 - add r1, sp, 0xD0 - mov r8, r1 - str r1, [r0] - add r0, sp, 0x88 - movs r5, 0x3 - str r5, [r0, 0x4] - add r0, sp, 0xA0 - str r5, [r0, 0x4] - add r0, sp, 0xB8 - str r5, [r0, 0x4] - mov r0, r10 - adds r1, r7, 0 - movs r2, 0x60 - bl memcpy - movs r0, 0x1 - mov r1, r8 - strb r0, [r1] - strb r4, [r1, 0x1] - strb r4, [r1, 0x3] - ldr r4, _080656AC - strh r6, [r4, 0x18] - strh r5, [r4, 0x1A] - strh r5, [r4, 0x1C] - strh r6, [r4, 0x1E] - strh r6, [r4, 0x20] - strh r6, [r4, 0x4] - mov r0, r9 - strh r0, [r4, 0x6] - strh r6, [r4, 0xC] - strh r6, [r4, 0xE] - strh r6, [r4, 0x14] - str r6, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - movs r0, 0xC - mov r1, r10 - strh r0, [r1, 0xC] - movs r0, 0x3 - movs r1, 0xC - bl sub_80095E4 - adds r0, 0x2 - mov r1, r10 - strh r0, [r1, 0x10] - strh r0, [r1, 0xE] - movs r0, 0xA - mov r1, r8 - strb r0, [r1, 0x2] - movs r1, 0x2 - mov r0, r10 - strh r1, [r0, 0x8] - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - adds r0, r4, 0 - movs r1, 0 - bl GetMenuEntryYCoord - str r0, [sp, 0x4] - adds r0, r4, 0 - movs r1, 0x1 - bl GetMenuEntryYCoord - str r0, [sp, 0x8] - adds r0, r4, 0 - movs r1, 0x2 - bl GetMenuEntryYCoord - str r0, [sp, 0xC] - movs r0, 0 - bl sub_80073B8 - ldr r0, _080656B0 - ldr r2, [r0] - str r6, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0x4] - ldr r0, _080656B4 - ldr r2, [r0] - str r6, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0x8] - ldr r0, _080656B8 - ldr r2, [r0] - str r6, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0xC] - ldr r0, _080656BC - ldr r2, [r0] - str r6, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - 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 -_080656AC: .4byte gUnknown_202EE10 -_080656B0: .4byte gGameOptionsTextPtr -_080656B4: .4byte gOptionsDungeonTextPtr -_080656B8: .4byte gOptionsOthersTextPtr -_080656BC: .4byte gUnknown_80FE748 - thumb_func_end CreateFieldGameOptionsMenu - - thumb_func_start CreateFieldDungeonMenu -CreateFieldDungeonMenu: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xDC - add r0, sp, 0x18 - mov r9, r0 - add r7, sp, 0x78 - adds r0, r7, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x7C] - add r0, sp, 0x80 - movs r5, 0 - movs r1, 0x2 - mov r10, r1 - mov r2, r10 - strh r2, [r0] - strh r2, [r0, 0x2] - add r1, sp, 0x84 - movs r0, 0x12 - strh r0, [r1] - mov r0, sp - adds r0, 0x86 - movs r3, 0x10 - mov r8, r3 - mov r4, r8 - strh r4, [r0] - add r0, sp, 0x88 - strh r4, [r0] - add r0, sp, 0x8C - add r6, sp, 0xD8 - str r6, [r0] - add r0, sp, 0x90 - movs r1, 0x3 - str r1, [r0, 0x4] - add r0, sp, 0xA8 - str r1, [r0, 0x4] - add r0, sp, 0xC0 - str r1, [r0, 0x4] - mov r0, r9 - adds r1, r7, 0 - movs r2, 0x60 - bl memcpy - adds r1, r7, 0 - ldr r0, _0806583C - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - movs r0, 0x1 - strb r0, [r6] - movs r0, 0 - strb r0, [r6, 0x1] - strb r0, [r6, 0x3] - ldr r4, _08065840 - movs r0, 0x5 - strh r0, [r4, 0x1A] - strh r0, [r4, 0x1C] - strh r5, [r4, 0x1E] - strh r5, [r4, 0x20] - strh r5, [r4, 0x4] - mov r1, r8 - strh r1, [r4, 0x6] - strh r5, [r4, 0xC] - strh r5, [r4, 0xE] - strh r5, [r4, 0x14] - str r5, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - movs r0, 0x18 - mov r2, r9 - strh r0, [r2, 0xC] - movs r0, 0x5 - movs r1, 0xC - bl sub_80095E4 - adds r0, 0x2 - mov r3, r9 - strh r0, [r3, 0x10] - strh r0, [r3, 0xE] - movs r0, 0xA - strb r0, [r6, 0x2] - mov r0, r10 - strh r0, [r3, 0x8] - mov r0, r9 - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - adds r0, r4, 0 - movs r1, 0 - bl GetMenuEntryYCoord - str r0, [sp, 0x4] - adds r0, r4, 0 - movs r1, 0x1 - bl GetMenuEntryYCoord - str r0, [sp, 0x8] - adds r0, r4, 0 - movs r1, 0x2 - bl GetMenuEntryYCoord - str r0, [sp, 0xC] - adds r0, r4, 0 - movs r1, 0x3 - bl GetMenuEntryYCoord - str r0, [sp, 0x10] - adds r0, r4, 0 - movs r1, 0x4 - bl GetMenuEntryYCoord - str r0, [sp, 0x14] - movs r0, 0 - bl sub_80073B8 - ldr r0, _08065844 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0x4] - ldr r0, _08065848 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0x8] - ldr r0, _0806584C - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0xC] - ldr r0, _08065850 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0x10] - ldr r0, _08065854 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [sp, 0x14] - ldr r0, _08065858 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r0, _0806585C - ldrb r0, [r0] - adds r4, r7, 0 - cmp r0, 0 - beq _08065860 - ldr r2, [sp, 0x4] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x88 - movs r3, 0x15 - bl sub_80078A4 - b _08065872 - .align 2, 0 -_0806583C: .4byte gUnknown_8106CE8 -_08065840: .4byte gUnknown_202EE10 -_08065844: .4byte gOptionsDungeonTextPtr -_08065848: .4byte gUnknown_80FE764 -_0806584C: .4byte gUnknown_80FE788 -_08065850: .4byte gUnknown_80FE7A8 -_08065854: .4byte gUnknown_80FE7C0 -_08065858: .4byte gUnknown_80FE7E4 -_0806585C: .4byte gUnknown_202F2E8 -_08065860: - ldr r2, [sp, 0x4] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x50 - movs r3, 0x16 - bl sub_80078A4 -_08065872: - ldr r0, _08065890 - ldrb r0, [r0, 0x1] - cmp r0, 0 - beq _08065894 - ldr r2, [sp, 0x8] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x88 - movs r3, 0x16 - bl sub_80078A4 - b _080658A6 - .align 2, 0 -_08065890: .4byte gUnknown_202F2E8 -_08065894: - ldr r2, [sp, 0x8] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x50 - movs r3, 0x12 - bl sub_80078A4 -_080658A6: - ldr r0, _080658C4 - ldrb r0, [r0, 0x2] - cmp r0, 0 - beq _080658C8 - ldr r2, [sp, 0xC] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x88 - movs r3, 0x10 - bl sub_80078A4 - b _080658DA - .align 2, 0 -_080658C4: .4byte gUnknown_202F2E8 -_080658C8: - ldr r2, [sp, 0xC] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x50 - movs r3, 0xC - bl sub_80078A4 -_080658DA: - ldr r0, _080658F8 - ldrb r0, [r0, 0x3] - cmp r0, 0 - beq _080658FC - ldr r2, [sp, 0x10] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x88 - movs r3, 0xC - bl sub_80078A4 - b _0806590E - .align 2, 0 -_080658F8: .4byte gUnknown_202F2E8 -_080658FC: - ldr r2, [sp, 0x10] - adds r2, 0xA - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - movs r1, 0x50 - movs r3, 0x10 - bl sub_80078A4 -_0806590E: - ldr r0, _08065944 - ldrb r1, [r0, 0x4] - lsls r0, r1, 2 - adds r1, r0, r1 - lsls r1, 3 - adds r1, 0x50 - ldr r2, [sp, 0x14] - adds r2, 0xA - adds r0, r4, r0 - ldr r3, [r0] - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - bl sub_80078A4 - movs r0, 0 - bl sub_80073E0 - add sp, 0xDC - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08065944: .4byte gUnknown_202F2E8 - thumb_func_end CreateFieldDungeonMenu - - thumb_func_start CreateFieldOthersMenu -CreateFieldOthersMenu: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xCC - add r0, sp, 0x64 - mov r10, r0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x68] - add r0, sp, 0x6C - movs r4, 0 - movs r5, 0 - movs r1, 0x2 - mov r9, r1 - mov r2, r9 - strh r2, [r0] - strh r2, [r0, 0x2] - add r1, sp, 0x70 - movs r0, 0x12 - strh r0, [r1] - mov r0, sp - adds r0, 0x72 - movs r6, 0x10 - strh r6, [r0] - add r0, sp, 0x74 - strh r6, [r0] - add r3, sp, 0xC4 - mov r8, r3 - str r3, [sp, 0x78] - movs r1, 0x3 - str r1, [sp, 0x80] - add r0, sp, 0x94 - str r1, [r0, 0x4] - add r0, sp, 0xAC - str r1, [r0, 0x4] - add r0, sp, 0x4 - mov r1, r10 - movs r2, 0x60 - bl memcpy - mov r1, r10 - ldr r0, _08065A78 - ldm r0!, {r2,r3,r7} - stm r1!, {r2,r3,r7} - movs r0, 0x1 - mov r7, r8 - strb r0, [r7] - strb r4, [r7, 0x1] - strb r4, [r7, 0x3] - ldr r4, _08065A7C - strh r0, [r4, 0x1A] - strh r0, [r4, 0x1C] - strh r5, [r4, 0x1E] - strh r5, [r4, 0x20] - strh r5, [r4, 0x4] - strh r6, [r4, 0x6] - strh r5, [r4, 0xC] - strh r5, [r4, 0xE] - strh r5, [r4, 0x14] - str r5, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - add r1, sp, 0x4 - movs r0, 0x18 - strh r0, [r1, 0xC] - movs r0, 0x1 - movs r1, 0xC - bl sub_80095E4 - add r2, sp, 0x4 - adds r1, r2, 0 - adds r0, 0x2 - strh r0, [r1, 0x10] - strh r0, [r2, 0xE] - movs r0, 0xA - strb r0, [r7, 0x2] - adds r0, r1, 0 - mov r1, r9 - strh r1, [r0, 0x8] - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - movs r4, 0 - mov r7, r10 - add r6, sp, 0xC8 - adds r5, r6, 0 -_08065A0A: - ldr r0, _08065A7C - adds r1, r4, 0 - bl GetMenuEntryYCoord - stm r5!, {r0} - adds r4, 0x1 - cmp r4, 0 - ble _08065A0A - movs r0, 0 - bl sub_80073B8 - ldr r0, _08065A80 - ldr r2, [r0] - movs r4, 0 - str r4, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, [r6] - ldr r0, _08065A84 - ldr r2, [r0] - str r4, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r0, _08065A88 - ldrb r1, [r0, 0x8] - lsls r3, r1, 2 - adds r1, r3, r1 - lsls r1, 3 - adds r1, 0x50 - add r0, sp, 0xC8 - ldr r2, [r0] - adds r2, 0xA - adds r3, r7, r3 - ldr r3, [r3] - movs r0, 0x7 - str r0, [sp] - movs r0, 0 - bl sub_80078A4 - movs r0, 0 - bl sub_80073E0 - add sp, 0xCC - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08065A78: .4byte gUnknown_8106CF4 -_08065A7C: .4byte gUnknown_202EE10 -_08065A80: .4byte gOptionsOthersTextPtr -_08065A84: .4byte gOptionsWindowColorPtr -_08065A88: .4byte gUnknown_202F2E8 - thumb_func_end CreateFieldOthersMenu - - thumb_func_start sub_8065A8C -sub_8065A8C: - push {lr} - cmp r0, 0x5 - bhi _08065B38 - lsls r0, 2 - ldr r1, _08065A9C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08065A9C: .4byte _08065AA0 - .align 2, 0 -_08065AA0: - .4byte _08065AB8 - .4byte _08065ACC - .4byte _08065AE0 - .4byte _08065AF4 - .4byte _08065B08 - .4byte _08065B22 -_08065AB8: - ldr r2, _08065AC8 - movs r1, 0 - ldrb r0, [r2] - cmp r0, 0 - bne _08065AC4 - movs r1, 0x1 -_08065AC4: - strb r1, [r2] - b _08065B38 - .align 2, 0 -_08065AC8: .4byte gUnknown_202F2E8 -_08065ACC: - ldr r2, _08065ADC - movs r1, 0 - ldrb r0, [r2, 0x1] - cmp r0, 0 - bne _08065AD8 - movs r1, 0x1 -_08065AD8: - strb r1, [r2, 0x1] - b _08065B38 - .align 2, 0 -_08065ADC: .4byte gUnknown_202F2E8 -_08065AE0: - ldr r2, _08065AF0 - movs r1, 0 - ldrb r0, [r2, 0x2] - cmp r0, 0 - bne _08065AEC - movs r1, 0x1 -_08065AEC: - strb r1, [r2, 0x2] - b _08065B38 - .align 2, 0 -_08065AF0: .4byte gUnknown_202F2E8 -_08065AF4: - ldr r2, _08065B04 - movs r1, 0 - ldrb r0, [r2, 0x3] - cmp r0, 0 - bne _08065B00 - movs r1, 0x1 -_08065B00: - strb r1, [r2, 0x3] - b _08065B38 - .align 2, 0 -_08065B04: .4byte gUnknown_202F2E8 -_08065B08: - ldr r1, _08065B18 - ldrb r0, [r1, 0x4] - cmp r0, 0 - bne _08065B1C - movs r0, 0x2 - strb r0, [r1, 0x4] - b _08065B38 - .align 2, 0 -_08065B18: .4byte gUnknown_202F2E8 -_08065B1C: - subs r0, 0x1 - strb r0, [r1, 0x4] - b _08065B38 -_08065B22: - ldr r1, _08065B30 - ldrb r0, [r1, 0x8] - cmp r0, 0 - bne _08065B34 - movs r0, 0x2 - b _08065B36 - .align 2, 0 -_08065B30: .4byte gUnknown_202F2E8 -_08065B34: - subs r0, 0x1 -_08065B36: - strb r0, [r1, 0x8] -_08065B38: - pop {r0} - bx r0 - thumb_func_end sub_8065A8C - - thumb_func_start sub_8065B3C -sub_8065B3C: - push {lr} - cmp r0, 0x5 - bhi _08065BE8 - lsls r0, 2 - ldr r1, _08065B4C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08065B4C: .4byte _08065B50 - .align 2, 0 -_08065B50: - .4byte _08065B68 - .4byte _08065B7C - .4byte _08065B90 - .4byte _08065BA4 - .4byte _08065BB8 - .4byte _08065BD2 -_08065B68: - ldr r2, _08065B78 - movs r1, 0 - ldrb r0, [r2] - cmp r0, 0 - bne _08065B74 - movs r1, 0x1 -_08065B74: - strb r1, [r2] - b _08065BE8 - .align 2, 0 -_08065B78: .4byte gUnknown_202F2E8 -_08065B7C: - ldr r2, _08065B8C - movs r1, 0 - ldrb r0, [r2, 0x1] - cmp r0, 0 - bne _08065B88 - movs r1, 0x1 -_08065B88: - strb r1, [r2, 0x1] - b _08065BE8 - .align 2, 0 -_08065B8C: .4byte gUnknown_202F2E8 -_08065B90: - ldr r2, _08065BA0 - movs r1, 0 - ldrb r0, [r2, 0x2] - cmp r0, 0 - bne _08065B9C - movs r1, 0x1 -_08065B9C: - strb r1, [r2, 0x2] - b _08065BE8 - .align 2, 0 -_08065BA0: .4byte gUnknown_202F2E8 -_08065BA4: - ldr r2, _08065BB4 - movs r1, 0 - ldrb r0, [r2, 0x3] - cmp r0, 0 - bne _08065BB0 - movs r1, 0x1 -_08065BB0: - strb r1, [r2, 0x3] - b _08065BE8 - .align 2, 0 -_08065BB4: .4byte gUnknown_202F2E8 -_08065BB8: - ldr r1, _08065BC8 - ldrb r0, [r1, 0x4] - cmp r0, 0x2 - bne _08065BCC - movs r0, 0 - strb r0, [r1, 0x4] - b _08065BE8 - .align 2, 0 -_08065BC8: .4byte gUnknown_202F2E8 -_08065BCC: - adds r0, 0x1 - strb r0, [r1, 0x4] - b _08065BE8 -_08065BD2: - ldr r1, _08065BE0 - ldrb r0, [r1, 0x8] - cmp r0, 0x2 - bne _08065BE4 - movs r0, 0 - b _08065BE6 - .align 2, 0 -_08065BE0: .4byte gUnknown_202F2E8 -_08065BE4: - adds r0, 0x1 -_08065BE6: - strb r0, [r1, 0x8] -_08065BE8: - pop {r0} - bx r0 - thumb_func_end sub_8065B3C - - thumb_func_start sub_8065BEC -sub_8065BEC: - movs r0, 0 - bx lr - thumb_func_end sub_8065BEC - - thumb_func_start sub_8065BF0 -sub_8065BF0: - movs r0, 0 - bx lr - thumb_func_end sub_8065BF0 - - thumb_func_start sub_8065BF4 -sub_8065BF4: - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r5, _08065C60 - ldr r6, _08065C64 - movs r0, 0x2A - adds r0, r5 - mov r8, r0 -_08065C04: - movs r7, 0 - bl sub_8065CAC -_08065C0A: - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldrh r1, [r6, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08065C2E - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80136E0 -_08065C2E: - ldrh r1, [r6, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08065C46 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8013744 -_08065C46: - ldrh r1, [r6, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08065C5A - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08065C68 -_08065C5A: - bl sub_8083D08 - b _08065C7E - .align 2, 0 -_08065C60: .4byte gUnknown_202EE10 -_08065C64: .4byte gRealInputs -_08065C68: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08065C78 - mov r1, r8 - ldrb r0, [r1] - cmp r0, 0 - beq _08065C0A -_08065C78: - bl sub_8083D30 - movs r7, 0x1 -_08065C7E: - ldr r4, _08065C9C - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - cmp r7, 0 - bne _08065CA0 - movs r1, 0x18 - ldrsh r0, [r4, r1] - bl sub_8065DBC - b _08065C04 - .align 2, 0 -_08065C9C: .4byte gUnknown_202EE10 -_08065CA0: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8065BF4 - - thumb_func_start sub_8065CAC -sub_8065CAC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xC8 - add r0, sp, 0x64 - mov r10, r0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x68] - add r0, sp, 0x6C - movs r4, 0 - movs r5, 0 - movs r1, 0x2 - mov r9, r1 - mov r1, r9 - strh r1, [r0] - strh r1, [r0, 0x2] - add r0, sp, 0x70 - movs r7, 0xC - strh r7, [r0] - adds r0, 0x2 - movs r6, 0x10 - strh r6, [r0] - add r0, sp, 0x74 - strh r6, [r0] - add r0, sp, 0xC4 - mov r8, r0 - str r0, [sp, 0x78] - movs r1, 0x3 - str r1, [sp, 0x80] - add r0, sp, 0x94 - str r1, [r0, 0x4] - add r0, sp, 0xAC - str r1, [r0, 0x4] - add r0, sp, 0x4 - mov r1, r10 - movs r2, 0x60 - bl memcpy - movs r0, 0x1 - mov r1, r8 - strb r0, [r1] - strb r4, [r1, 0x1] - strb r4, [r1, 0x3] - ldr r4, _08065DB0 - strh r5, [r4, 0x18] - movs r0, 0x7 - strh r0, [r4, 0x1A] - strh r0, [r4, 0x1C] - strh r5, [r4, 0x1E] - strh r5, [r4, 0x20] - strh r5, [r4, 0x4] - strh r6, [r4, 0x6] - strh r5, [r4, 0xC] - strh r5, [r4, 0xE] - strh r5, [r4, 0x14] - str r5, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - add r0, sp, 0x4 - strh r7, [r0, 0xC] - movs r0, 0x7 - movs r1, 0xC - bl sub_80095E4 - add r2, sp, 0x4 - adds r1, r2, 0 - adds r0, 0x2 - strh r0, [r1, 0x10] - strh r0, [r2, 0xE] - movs r0, 0xA - mov r1, r8 - strb r0, [r1, 0x2] - adds r0, r2, 0 - mov r1, r9 - strh r1, [r0, 0x8] - movs r1, 0x1 - bl sub_803ECB4 - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - movs r0, 0 - bl sub_80073B8 - ldr r0, _08065DB4 - ldr r2, [r0] - str r5, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r4, 0 - ldr r5, _08065DB8 -_08065D7A: - ldr r0, _08065DB0 - adds r1, r4, 0 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldm r5!, {r2} - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - movs r3, 0 - bl PrintFormattedStringOnWindow - adds r4, 0x1 - cmp r4, 0x6 - ble _08065D7A - movs r0, 0 - bl sub_80073E0 - add sp, 0xC8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08065DB0: .4byte gUnknown_202EE10 -_08065DB4: .4byte gUnknown_80FF770 -_08065DB8: .4byte gUnknown_80FF774 - thumb_func_end sub_8065CAC - - thumb_func_start sub_8065DBC -sub_8065DBC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xEC - adds r6, r0, 0 - ldr r0, _08065F28 - ldr r0, [r0] - ldrb r1, [r0, 0x9] - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - str r0, [sp, 0xC8] - mov r0, sp - adds r0, 0x6C - str r0, [sp, 0xD4] - mov r1, sp - adds r1, 0x70 - str r1, [sp, 0xD8] - mov r2, sp - adds r2, 0x72 - str r2, [sp, 0xDC] - adds r0, 0x8 - str r0, [sp, 0xE0] - adds r1, 0xC - str r1, [sp, 0xE4] - adds r2, 0x22 - str r2, [sp, 0xE8] - adds r0, 0x38 - str r0, [sp, 0xD0] - subs r1, 0x18 - str r1, [sp, 0xCC] - movs r2, 0x10 - mov r10, r2 - ldr r5, _08065F2C - add r0, sp, 0xC4 - mov r9, r0 - add r1, sp, 0x4 - mov r8, r1 -_08065E0C: - movs r7, 0 - ldr r0, [sp, 0xCC] - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x68] - movs r0, 0x2 - ldr r2, [sp, 0xD4] - strh r0, [r2] - strh r0, [r2, 0x2] - movs r0, 0xC - ldr r1, [sp, 0xD8] - strh r0, [r1] - mov r0, r10 - ldr r2, [sp, 0xDC] - strh r0, [r2] - ldr r1, [sp, 0xE0] - strh r0, [r1] - mov r2, r9 - str r2, [sp, 0x78] - movs r0, 0x3 - ldr r1, [sp, 0xE4] - str r0, [r1, 0x4] - ldr r2, [sp, 0xE8] - str r0, [r2, 0x4] - ldr r1, [sp, 0xD0] - str r0, [r1, 0x4] - add r0, sp, 0x4 - ldr r1, [sp, 0xCC] - movs r2, 0x60 - bl memcpy - movs r1, 0x7 - add r0, sp, 0xC4 - strb r1, [r0] - mov r2, r9 - strb r6, [r2, 0x1] - movs r0, 0 - strb r0, [r2, 0x3] - strh r6, [r5, 0x1E] - strh r1, [r5, 0x20] - strh r7, [r5, 0x1A] - strh r7, [r5, 0x18] - strh r7, [r5, 0x1C] - strh r7, [r5, 0x4] - mov r1, r10 - strh r1, [r5, 0x6] - strh r7, [r5, 0x14] - str r7, [r5] - adds r0, r5, 0 - adds r0, 0x28 - bl sub_801317C - movs r0, 0x18 - mov r2, r8 - strh r0, [r2, 0xC] - movs r0, 0x8 - movs r1, 0xC - bl sub_80095E4 - adds r0, 0x2 - mov r1, r8 - strh r0, [r1, 0x10] - strh r0, [r1, 0xE] - movs r0, 0xA - mov r2, r9 - strb r0, [r2, 0x2] - movs r0, 0x2 - strh r0, [r1, 0x8] - add r0, sp, 0x4 - movs r1, 0x1 - bl sub_803ECB4 - ldr r1, _08065F30 - movs r2, 0 - ldrsh r0, [r1, r2] - adds r0, 0x13 - lsls r0, 3 - strh r0, [r5, 0xC] - movs r2, 0x2 - ldrsh r0, [r1, r2] - adds r0, 0x1 - lsls r0, 3 - subs r0, 0x2 - strh r0, [r5, 0xE] - movs r0, 0 - bl sub_80073B8 - lsls r0, r6, 3 - adds r0, 0x10 - ldr r1, _08065F34 - lsls r4, r6, 2 - adds r1, r4, r1 - ldr r2, [r1] - str r7, [sp] - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - ldr r1, _08065F38 - ldr r2, [sp, 0xC8] - lsls r0, r2, 5 - adds r4, r0 - adds r4, r1 - ldr r2, [r4] - str r7, [sp] - movs r0, 0x8 - movs r1, 0x10 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 -_08065EF4: - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x24 - bl sub_803E46C - ldr r0, _08065F3C - ldrh r1, [r0, 0x2] - mov r0, r10 - ands r0, r1 - cmp r0, 0 - bne _08065F16 - adds r0, r5, 0 - adds r0, 0x2B - ldrb r0, [r0] - cmp r0, 0 - beq _08065F40 -_08065F16: - movs r0, 0 - bl sub_8083CE0 - adds r6, 0x1 - cmp r6, 0x7 - bne _08065F64 - movs r6, 0 - b _08065F64 - .align 2, 0 -_08065F28: .4byte gGameOptionsRef -_08065F2C: .4byte gUnknown_202EE10 -_08065F30: .4byte gUnknown_2027370 -_08065F34: .4byte gUnknown_80FF774 -_08065F38: .4byte gUnknown_80FF7EC -_08065F3C: .4byte gRealInputs -_08065F40: - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - bne _08065F52 - adds r0, r5, 0 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0 - beq _08065F68 -_08065F52: - movs r0, 0 - bl sub_8083CE0 - subs r6, 0x1 - movs r0, 0x1 - negs r0, r0 - cmp r6, r0 - bne _08065F64 - movs r6, 0x6 -_08065F64: - movs r7, 0x1 - b _08065F94 -_08065F68: - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08065F7A - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08065F80 -_08065F7A: - bl sub_8083D08 - b _08065F94 -_08065F80: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08065F90 - ldr r1, _08065FB0 - ldrb r0, [r1] - cmp r0, 0 - beq _08065EF4 -_08065F90: - bl sub_8083D30 -_08065F94: - movs r0, 0x24 - bl sub_803E46C - cmp r7, 0 - beq _08065FA0 - b _08065E0C -_08065FA0: - add sp, 0xEC - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08065FB0: .4byte gUnknown_202EE3A - thumb_func_end sub_8065DBC - - thumb_func_start sub_8065FB4 -sub_8065FB4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - ldr r4, _08065FE0 - add sp, r4 - movs r0, 0 - mov r10, r0 - ldr r4, _08065FE4 - ldr r0, [r4] - ldr r1, _08065FE8 - adds r0, r1 - ldrb r0, [r0] - bl IsRecruitingEnabled - lsls r0, 24 - cmp r0, 0 - bne _08065FF0 - ldr r0, _08065FEC - b _08065FFE - .align 2, 0 -_08065FE0: .4byte 0xfffff608 -_08065FE4: .4byte gDungeon -_08065FE8: .4byte 0x00000644 -_08065FEC: .4byte gUnknown_80FA5F4 -_08065FF0: - ldr r0, [r4] - ldr r2, _0806600C - adds r0, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _08066014 - ldr r0, _08066010 -_08065FFE: - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonMessage - b _08066194 - .align 2, 0 -_0806600C: .4byte 0x0000065d -_08066010: .4byte gUnknown_80FA61C -_08066014: - mov r0, sp - bl sub_80664FC - ldr r6, _08066130 -_0806601C: - movs r0, 0 - mov r8, r0 - mov r1, r10 - lsls r0, r1, 2 - add r0, r10 - lsls r0, 6 - subs r0, r1 - lsls r0, 2 - add r0, sp - mov r9, r0 - ldr r0, _08066134 - strb r1, [r0, 0x1] - ldr r0, _08066138 - movs r1, 0x1 - bl sub_803ECB4 - mov r2, r8 - strh r2, [r6, 0x1A] - strh r2, [r6, 0x18] - strh r2, [r6, 0x1C] - mov r0, r10 - strh r0, [r6, 0x1E] - movs r0, 0x2 - strh r0, [r6, 0x20] - strh r2, [r6, 0x4] - movs r0, 0x10 - strh r0, [r6, 0x6] - strh r2, [r6, 0x14] - mov r1, r8 - str r1, [r6] - adds r0, r6, 0 - adds r0, 0x28 - bl sub_801317C - ldr r0, _0806613C - mov r2, r8 - str r2, [r0] - movs r1, 0 - ldr r0, _08066140 - strb r1, [r0] - mov r0, r9 - mov r1, r10 - bl sub_80661AC - ldr r1, _08066144 - movs r2, 0 - ldrsh r0, [r1, r2] - adds r0, 0x10 - lsls r0, 3 - strh r0, [r6, 0xC] - movs r2, 0x2 - ldrsh r0, [r1, r2] - adds r0, 0x1 - lsls r0, 3 - subs r0, 0x2 - strh r0, [r6, 0xE] -_0806608C: - movs r5, 0 - ldr r0, _08066140 - strb r5, [r0] - movs r0, 0 - ldr r1, _08066148 - bl sub_8014140 - adds r4, r0, 0 - mov r0, r9 - adds r1, r4, 0 - bl sub_8066288 - lsls r0, 24 - lsrs r0, 24 - negs r1, r0 - orrs r1, r0 - lsrs r5, r1, 31 - mov r0, r9 - adds r1, r4, 0 - bl sub_8066358 - lsls r0, 24 - cmp r0, 0 - beq _080660BE - movs r5, 0x1 -_080660BE: - cmp r5, 0 - bne _080660CE - ldr r0, _08066130 - bl AddMenuCursorSprite - movs r0, 0x45 - bl sub_803E46C -_080660CE: - ldr r2, _08066140 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _080660E2 - movs r0, 0x1 - movs r1, 0x8 - bl sub_8066434 -_080660E2: - ldr r0, _08066140 - ldrb r1, [r0] - movs r7, 0x2 - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _080660F8 - movs r0, 0 - movs r1, 0x70 - bl sub_8066434 -_080660F8: - ldr r5, _0806614C - ldrh r1, [r5, 0x2] - movs r0, 0x30 - ands r0, r1 - cmp r0, 0 - bne _0806611A - ldr r4, _08066130 - adds r0, r4, 0 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0 - bne _0806611A - adds r0, r4, 0 - adds r0, 0x2B - ldrb r0, [r0] - cmp r0, 0 - beq _08066150 -_0806611A: - movs r0, 0 - bl sub_8083CE0 - movs r0, 0 - mov r1, r10 - cmp r1, 0 - bne _0806612A - movs r0, 0x1 -_0806612A: - mov r10, r0 - b _08066184 - .align 2, 0 -_08066130: .4byte gUnknown_202EE10 -_08066134: .4byte gUnknown_203B43C -_08066138: .4byte gUnknown_8106D08 -_0806613C: .4byte gUnknown_202F2F8 -_08066140: .4byte gUnknown_202F2FC -_08066144: .4byte gUnknown_2027370 -_08066148: .4byte gUnknown_8106D68 -_0806614C: .4byte gRealInputs -_08066150: - bl sub_80048C8 - lsls r0, 24 - cmp r0, 0 - bne _0806608C - ldrh r1, [r5, 0x2] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - bne _0806616E - adds r0, r4, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - beq _08066174 -_0806616E: - bl sub_8083D30 - b _0806618C -_08066174: - movs r0, 0xC - ands r0, r1 - cmp r0, 0 - beq _0806608C - bl sub_8083D08 - movs r2, 0x1 - mov r8, r2 -_08066184: - mov r0, r8 - cmp r0, 0 - bne _0806618C - b _0806601C -_0806618C: - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 -_08066194: - ldr r3, _080661A8 - add sp, r3 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080661A8: .4byte 0x000009f8 - thumb_func_end sub_8065FB4 - - thumb_func_start sub_80661AC -sub_80661AC: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x44 - adds r6, r0, 0 - adds r5, r1, 0 - ldr r0, _080661DC - ldr r4, [r0] - movs r0, 0x20 - mov r8, r0 - movs r0, 0 - bl sub_80073B8 - cmp r5, 0 - bne _080661E4 - ldr r0, _080661E0 - ldr r2, [r0] - str r5, [sp] - movs r0, 0xC - movs r1, 0 - movs r3, 0 - bl PrintStringOnWindow - b _080661F6 - .align 2, 0 -_080661DC: .4byte gUnknown_202F2F8 -_080661E0: .4byte gUnknown_80FEA68 -_080661E4: - ldr r0, _08066254 - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x14 - movs r1, 0 - movs r3, 0 - bl PrintStringOnWindow -_080661F6: - movs r1, 0x9F - lsls r1, 3 - adds r0, r6, r1 - ldr r1, [r0] - cmp r1, 0 - beq _08066260 - movs r7, 0x7 - lsls r0, r4, 1 - adds r5, r0, r6 -_08066208: - cmp r4, 0 - blt _08066244 - movs r1, 0x9F - lsls r1, 3 - adds r0, r6, r1 - ldr r0, [r0] - cmp r4, r0 - bge _08066244 - movs r1, 0xD4 - lsls r1, 2 - adds r0, r6, r1 - adds r0, r4 - ldrb r2, [r0] - add r0, sp, 0x4 - ldr r1, _08066258 - bl sprintfStatic - movs r0, 0 - ldrsh r1, [r5, r0] - ldr r0, _0806625C - bl sub_808D930 - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - mov r1, r8 - add r2, sp, 0x4 - movs r3, 0 - bl PrintFormattedStringOnWindow -_08066244: - subs r7, 0x1 - adds r5, 0x2 - adds r4, 0x1 - movs r1, 0xC - add r8, r1 - cmp r7, 0 - bge _08066208 - b _08066270 - .align 2, 0 -_08066254: .4byte gUnknown_80FEA80 -_08066258: .4byte gUnknown_8106D8C -_0806625C: .4byte gFormatBuffer_Monsters -_08066260: - ldr r0, _08066284 - ldr r2, [r0] - str r1, [sp] - movs r0, 0x8 - mov r1, r8 - movs r3, 0 - bl PrintStringOnWindow -_08066270: - movs r0, 0 - bl sub_80073E0 - add sp, 0x44 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08066284: .4byte gUnknown_80FEA8C - thumb_func_end sub_80661AC - - thumb_func_start sub_8066288 -sub_8066288: - push {r4,r5,lr} - sub sp, 0x44 - adds r5, r0, 0 - adds r3, r1, 0 - ldr r0, _080662B8 - ldr r4, [r0] - cmp r4, 0 - beq _080662B4 - subs r4, 0x1 - ldr r2, _080662BC - ldrb r0, [r2] - movs r1, 0x1 - orrs r0, r1 - strb r0, [r2] - ldr r0, _080662C0 - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - bne _080662C4 - cmp r3, 0x1 - beq _080662C4 -_080662B4: - movs r0, 0 - b _0806633E - .align 2, 0 -_080662B8: .4byte gUnknown_202F2F8 -_080662BC: .4byte gUnknown_202F2FC -_080662C0: .4byte gRealInputs -_080662C4: - movs r0, 0 - bl sub_8083CE0 - movs r0, 0 - bl sub_80073B8 - movs r0, 0x10 - str r0, [sp] - movs r0, 0 - movs r1, 0 - movs r2, 0x10 - movs r3, 0x90 - bl sub_80087EC - ldr r1, _08066348 - movs r2, 0xD4 - lsls r2, 2 - adds r0, r5, r2 - adds r0, r4 - ldrb r2, [r0] - add r0, sp, 0x4 - bl sprintfStatic - ldr r0, _0806634C - lsls r1, r4, 1 - adds r1, r5, r1 - movs r2, 0 - ldrsh r1, [r1, r2] - bl sub_808D930 - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - movs r1, 0x14 - add r2, sp, 0x4 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - movs r0, 0x45 - bl sub_803E46C - ldr r5, _08066350 - movs r4, 0x5 -_08066320: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x45 - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08066320 - ldr r1, _08066354 - ldr r0, [r1] - subs r0, 0x1 - str r0, [r1] - movs r0, 0x1 -_0806633E: - add sp, 0x44 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08066348: .4byte gUnknown_8106D8C -_0806634C: .4byte gFormatBuffer_Monsters -_08066350: .4byte gIwramTextFunc2 -_08066354: .4byte gUnknown_202F2F8 - thumb_func_end sub_8066288 - - thumb_func_start sub_8066358 -sub_8066358: - push {r4-r6,lr} - sub sp, 0x44 - adds r5, r0, 0 - adds r3, r1, 0 - ldr r0, _08066394 - ldr r0, [r0] - adds r4, r0, 0 - adds r4, 0x8 - movs r6, 0x80 - movs r1, 0x9F - lsls r1, 3 - adds r0, r5, r1 - ldr r0, [r0] - cmp r0, r4 - ble _08066390 - ldr r2, _08066398 - ldrb r0, [r2] - movs r1, 0x2 - orrs r0, r1 - strb r0, [r2] - ldr r0, _0806639C - ldrh r1, [r0, 0x4] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - bne _080663A0 - cmp r3, 0x2 - beq _080663A0 -_08066390: - movs r0, 0 - b _0806641A - .align 2, 0 -_08066394: .4byte gUnknown_202F2F8 -_08066398: .4byte gUnknown_202F2FC -_0806639C: .4byte gRealInputs -_080663A0: - movs r0, 0 - bl sub_8083CE0 - movs r0, 0 - bl sub_80073B8 - movs r0, 0x10 - str r0, [sp] - movs r0, 0 - movs r1, 0 - adds r2, r6, 0 - movs r3, 0x48 - bl sub_80087EC - ldr r1, _08066424 - movs r2, 0xD4 - lsls r2, 2 - adds r0, r5, r2 - adds r0, r4 - ldrb r2, [r0] - add r0, sp, 0x4 - bl sprintfStatic - ldr r0, _08066428 - lsls r1, r4, 1 - adds r1, r5, r1 - movs r2, 0 - ldrsh r1, [r1, r2] - bl sub_808D930 - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - adds r1, r6, 0 - add r2, sp, 0x4 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - movs r0, 0xD - bl sub_803E46C - ldr r5, _0806642C - movs r4, 0x5 -_080663FC: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0xD - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _080663FC - ldr r1, _08066430 - ldr r0, [r1] - adds r0, 0x1 - str r0, [r1] - movs r0, 0x1 -_0806641A: - add sp, 0x44 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08066424: .4byte gUnknown_8106D8C -_08066428: .4byte gFormatBuffer_Monsters -_0806642C: .4byte gIwramTextFunc1 -_08066430: .4byte gUnknown_202F2F8 - thumb_func_end sub_8066358 - - thumb_func_start sub_8066434 -sub_8066434: - push {r4-r7,lr} - mov r12, r1 - lsls r0, 24 - lsrs r2, r0, 24 - ldr r7, _080664C8 - ldr r0, _080664CC - ldr r0, [r0] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - bne _080664C0 - ldr r0, _080664D0 - ldrh r1, [r0] - ldr r3, _080664D4 - ands r3, r1 - ldr r1, _080664D8 - ands r3, r1 - ldr r1, _080664DC - ands r3, r1 - ldr r1, _080664E0 - ands r3, r1 - ldr r1, _080664E4 - ands r3, r1 - negs r1, r2 - orrs r1, r2 - asrs r1, 31 - movs r2, 0x80 - lsls r2, 6 - ands r2, r1 - ldrh r1, [r0, 0x2] - ldr r4, _080664E8 - ands r4, r1 - orrs r4, r2 - movs r5, 0xF - ldr r2, _080664EC - movs r6, 0x2 - ldrsh r1, [r7, r6] - lsls r1, 3 - add r1, r12 - ands r1, r2 - lsls r1, 4 - ldrh r2, [r0, 0x6] - ands r5, r2 - orrs r5, r1 - strh r5, [r0, 0x6] - movs r2, 0 - ldrsh r1, [r7, r2] - lsls r1, 3 - adds r1, 0x40 - ldr r2, _080664F0 - ands r1, r2 - movs r2, 0xFE - lsls r2, 8 - ands r4, r2 - orrs r4, r1 - movs r2, 0x80 - lsls r2, 7 - ldr r1, _080664F4 - ands r3, r1 - orrs r3, r2 - strh r3, [r0] - ands r4, r1 - strh r4, [r0, 0x2] - ldr r1, _080664F8 - strh r1, [r0, 0x4] - movs r1, 0x7F - movs r2, 0 - movs r3, 0 - bl AddSprite -_080664C0: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080664C8: .4byte gUnknown_2027370 -_080664CC: .4byte gUnknown_202EDCC -_080664D0: .4byte gUnknown_202F300 -_080664D4: .4byte 0x0000feff -_080664D8: .4byte 0x0000fdff -_080664DC: .4byte 0x0000f3ff -_080664E0: .4byte 0x0000efff -_080664E4: .4byte 0x0000dfff -_080664E8: .4byte 0x0000c1ff -_080664EC: .4byte 0x00000fff -_080664F0: .4byte 0x000001ff -_080664F4: .4byte 0x00003fff -_080664F8: .4byte 0x0000f3f0 - thumb_func_end sub_8066434 - - thumb_func_start sub_80664FC -sub_80664FC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C0 - str r0, [sp, 0x1A8] - movs r7, 0 - ldr r2, _08066604 - ldr r3, _08066608 - movs r1, 0 -_08066512: - mov r4, sp - adds r0, r4, r7 - strb r1, [r0] - adds r7, 0x1 - cmp r7, r2 - ble _08066512 - movs r4, 0 - adds r1, r3, 0 - ldr r0, [r3] - ldr r7, _0806660C - adds r0, r7 - ldr r0, [r0] - cmp r4, r0 - bge _08066578 - ldr r6, _08066610 -_08066530: - movs r5, 0x1 - ldr r2, [r1] - lsls r0, r4, 3 - adds r0, r2, r0 - ldr r7, _08066614 - adds r1, r0, r7 - movs r7, 0 - ldrsh r1, [r1, r7] - movs r7, 0xD1 - lsls r7, 6 - adds r0, r7 - movs r7, 0 - ldrsh r0, [r0, r7] - cmp r1, 0 - bne _08066554 - cmp r0, 0 - beq _08066566 - movs r5, 0x2 -_08066554: - adds r0, r2, r6 - str r3, [sp, 0x1BC] - bl ExtractSpeciesIndex - lsls r0, 16 - asrs r0, 16 - add r0, sp - strb r5, [r0] - ldr r3, [sp, 0x1BC] -_08066566: - adds r6, 0x8 - adds r4, 0x1 - ldr r1, _08066608 - ldr r0, [r1] - ldr r2, _0806660C - adds r0, r2 - ldr r0, [r0] - cmp r4, r0 - blt _08066530 -_08066578: - ldr r0, [r3] - ldr r4, _08066618 - adds r0, r4 - ldrb r0, [r0] - cmp r0, 0 - beq _0806658A - add r1, sp, 0x17C - movs r0, 0x1 - strb r0, [r1] -_0806658A: - movs r0, 0x5 -_0806658C: - subs r0, 0x1 - cmp r0, 0 - bge _0806658C - movs r7, 0 -_08066594: - movs r0, 0 - mov r8, r0 - movs r1, 0x1 - adds r2, r7, 0x1 - str r2, [sp, 0x1AC] - lsls r4, r7, 2 - str r4, [sp, 0x1B0] -_080665A2: - lsls r0, r1, 16 - asrs r6, r0, 16 - movs r0, 0x7 - mov r10, r0 - movs r2, 0 - mov r9, r2 - mov r4, sp - adds r0, r4, r6 - ldrb r0, [r0] - adds r1, 0x1 - str r1, [sp, 0x1B4] - cmp r0, 0 - bne _080665BE - b _08066704 -_080665BE: - cmp r7, 0 - bne _08066620 - adds r0, r6, 0 - bl sub_806F9BC - lsls r0, 24 - cmp r0, 0 - bne _080665D0 - b _08066704 -_080665D0: - adds r0, r6, 0 - bl IsExclusivePokemonUnlocked - lsls r0, 24 - cmp r0, 0 - bne _080665DE - b _08066704 -_080665DE: - adds r0, r6, 0 - bl GetRecruitRate - lsls r0, 16 - ldr r1, _0806661C - cmp r0, r1 - bne _080665EE - b _08066704 -_080665EE: - cmp r6, 0x97 - bne _0806669E - movs r0, 0x7A - bl sub_80860A8 - lsls r0, 24 - cmp r0, 0 - bne _08066600 - b _08066704 -_08066600: - b _0806669E - .align 2, 0 -_08066604: .4byte 0x000001a7 -_08066608: .4byte gDungeon -_0806660C: .4byte 0x000037e4 -_08066610: .4byte 0x0000343c -_08066614: .4byte 0x0000343e -_08066618: .4byte 0x0000066e -_0806661C: .4byte 0xfc190000 -_08066620: - movs r5, 0 - ldr r0, _080666CC - ldr r2, [r0] - movs r4, 0x1 - movs r3, 0xCE - lsls r3, 1 -_0806662C: - ldrb r1, [r2] - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - beq _0806663E - movs r1, 0x8 - ldrsh r0, [r2, r1] - cmp r0, r6 - beq _08066646 -_0806663E: - adds r2, 0x58 - adds r5, 0x1 - cmp r5, r3 - ble _0806662C -_08066646: - ldr r0, _080666D0 - cmp r5, r0 - beq _08066650 - movs r2, 0x1 - mov r9, r2 -_08066650: - mov r4, r9 - cmp r4, 0 - bne _0806669E - movs r5, 0 - ldr r2, _080666CC -_0806665A: - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _080666D4 - adds r1, r0 - ldr r0, [r2] - adds r4, r0, r1 - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0806668C - movs r1, 0xA - ldrsh r0, [r4, r1] - str r2, [sp, 0x1B8] - bl sub_806A564 - lsls r0, 24 - ldr r2, [sp, 0x1B8] - cmp r0, 0 - bne _0806668C - movs r1, 0xE - ldrsh r0, [r4, r1] - cmp r0, r6 - beq _08066692 -_0806668C: - adds r5, 0x1 - cmp r5, 0x3 - ble _0806665A -_08066692: - cmp r5, 0x4 - beq _0806669E - movs r2, 0x1 - mov r9, r2 - movs r4, 0x6 - mov r10, r4 -_0806669E: - cmp r7, 0 - bne _080666D8 - mov r1, sp - adds r0, r1, r6 - ldrb r0, [r0] - cmp r0, 0x2 - bne _080666B0 - movs r2, 0x2 - mov r10, r2 -_080666B0: - mov r4, r8 - lsls r0, r4, 1 - ldr r1, [sp, 0x1A8] - adds r0, r1, r0 - strh r6, [r0] - movs r2, 0xD4 - lsls r2, 2 - adds r0, r1, r2 - add r0, r8 - mov r4, r10 - strb r4, [r0] - movs r0, 0x1 - add r8, r0 - b _08066704 - .align 2, 0 -_080666CC: .4byte gRecruitedPokemonRef -_080666D0: .4byte 0x0000019d -_080666D4: .4byte 0x00008df8 -_080666D8: - mov r1, r9 - cmp r1, 0 - beq _08066704 - ldr r2, [sp, 0x1B0] - adds r0, r2, r7 - lsls r0, 6 - subs r0, r7 - lsls r0, 2 - ldr r4, [sp, 0x1A8] - adds r0, r4 - mov r2, r8 - lsls r1, r2, 1 - adds r1, r0, r1 - strh r6, [r1] - movs r4, 0xD4 - lsls r4, 2 - adds r0, r4 - add r0, r8 - mov r1, r10 - strb r1, [r0] - movs r2, 0x1 - add r8, r2 -_08066704: - ldr r1, [sp, 0x1B4] - ldr r0, _08066740 - cmp r1, r0 - bgt _0806670E - b _080665A2 -_0806670E: - ldr r4, [sp, 0x1B0] - adds r0, r4, r7 - lsls r0, 6 - subs r0, r7 - lsls r0, 2 - ldr r7, [sp, 0x1A8] - adds r0, r7 - movs r1, 0x9F - lsls r1, 3 - adds r0, r1 - mov r2, r8 - str r2, [r0] - ldr r7, [sp, 0x1AC] - cmp r7, 0x1 - bgt _0806672E - b _08066594 -_0806672E: - add sp, 0x1C0 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08066740: .4byte 0x000001a3 - thumb_func_end sub_80664FC - - .align 2, 0 diff --git a/asm/code_808417C.s b/asm/code_808417C.s index a23fae6b2..369ba2e93 100644 --- a/asm/code_808417C.s +++ b/asm/code_808417C.s @@ -55,7 +55,7 @@ sub_80841EC: strh r0, [r1, 0xA] mov r0, sp movs r1, 0x1 - bl sub_803ECB4 + bl DungeonShowWindows ldr r0, _0808426C ldr r0, [r0] ldr r1, _08084270 @@ -98,7 +98,7 @@ _08084290: strb r0, [r4] mov r0, sp movs r1, 0x1 - bl sub_803ECB4 + bl DungeonShowWindows b _08084290 .align 2, 0 _080842B8: .4byte gUnknown_80FE6E8 @@ -116,7 +116,7 @@ _080842C4: cmp r0, 0 beq _08084290 _080842DA: - bl sub_8083D08 + bl PlayDungeonConfirmationSE add sp, 0xC4 pop {r3} mov r8, r3 diff --git a/charmap.txt b/charmap.txt index eab6e4360..c97711df1 100644 --- a/charmap.txt +++ b/charmap.txt @@ -465,8 +465,14 @@ STAR_BULLET = 87 42 @ = 87 43 @ Star with E ICON_STICKY = 87 44 SPEECH_BUBBLE = 87 45 -@ 87 46..49 - red hearts -@ 87 4a..4d - yellow hearts - appears in team list +HEART_RED_TINY = 87 46 +HEART_RED_SMALL = 87 47 +HEART_RED_MEDIUM = 87 48 +HEART_RED_LARGE = 87 49 +HEART_YELLOW_TINY = 87 4A +HEART_YELLOW_SMALL = 87 4B +HEART_YELLOW_MEDIUM = 87 4C +HEART_YELLOW_LARGE = 87 4D TM = 87 4E ORB = 87 4F A_BUTTON = 87 50 diff --git a/data/data_8106A4C.s b/data/data_8106A4C.s index 002a4b90d..050c8543c 100644 --- a/data/data_8106A4C.s +++ b/data/data_8106A4C.s @@ -1,258 +1,7 @@ .section .rodata -@ sub_8048E04 - sub_805FC30 - .align 2,0 - .string "pksdir0\0" - - - .global gUnknown_8106A4C -gUnknown_8106A4C: @ 8106A4C - .4byte 0 - - .global gUnknown_8106A50 -gUnknown_8106A50: @ 8106A50 - .4byte 1 - - .global gUnknown_8106A54 -gUnknown_8106A54: @ 8106A54 -.byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 -.byte 0x80, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00 -.byte 0x80, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0x6b, 0x73, 0x64, 0x69, 0x72, 0x30, 0x00 -.byte 0x70, 0x6b, 0x73, 0x64, 0x69, 0x72, 0x30, 0x00 - - .global gUnknown_8106A8C -gUnknown_8106A8C: @ 8106A8C -.byte 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 -.byte 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x70, 0x6b, 0x73, 0x64 -.byte 0x69, 0x72, 0x30, 0x00, 0x70, 0x6b, 0x73, 0x64, 0x69, 0x72, 0x30, 0x00, 0x70, 0x6b, 0x73, 0x64 -.byte 0x69, 0x72, 0x30, 0x00, 0x70, 0x6b, 0x73, 0x64, 0x69, 0x72, 0x30, 0x00 - - .global gUnknown_8106AC8 -gUnknown_8106AC8: @ 8106AC8 -.byte 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00 -.byte 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 - - .global gUnknown_8106AE8 -gUnknown_8106AE8: @ 8106AE8 -.byte 0x00, 0x00, 0x01, 0x00 -.byte 0x12, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x13, 0x02, 0x00, 0x00 -.byte 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0x01, 0x00, 0xff, 0xff, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff -.byte 0x12, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x13, 0x02, 0x00, 0x00 -.byte 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00 -.byte 0xff, 0xff, 0x01, 0x00, 0x13, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x70, 0x6b, 0x73, 0x64 -.byte 0x69, 0x72, 0x30, 0x00 - - .global gUnknown_8106B50 -gUnknown_8106B50: @ 8106B50 - .string "{COLOR}%c%s\0" - - - -@ CreateFieldItemMenu - sub_8062CA8 - .align 2,0 - .string "pksdir0\0" .align 2,0 - .global gUnknown_8106B60 -gUnknown_8106B60: @ 8106B60 - .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00 - - .global gUnknown_8106B6C -gUnknown_8106B6C: @ 8106B6C -.byte 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00 -.byte 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x6b, 0x73, 0x64, 0x69, 0x72, 0x30, 0x00 - - .global gUnknown_8106B8C -gUnknown_8106B8C: @ 8106B8C -.byte 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x38, 0x00 -.byte 0x68, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0x00, 0x00, 0x00, 0x00 - - .global gTeamFormat -gTeamFormat: @ 8106BB0 - .string "$t\0" - .align 2,0 - -@ Red Heart Symbols - .global gHeartRedTiny -gHeartRedTiny: @ 8106BB4 - .byte 0x87, 0x46, 0x00, 0x00 - - .global gHeartRedSmall -gHeartRedSmall: @ 8106BB8 - .byte 0x87, 0x47, 0x00, 0x00 - - .global gHeartRedMedium -gHeartRedMedium: @ 8106BBC - .byte 0x87, 0x48, 0x00, 0x00 - - .global gHeartRedLarge -gHeartRedLarge: @ 8106BC0 - .byte 0x87, 0x49, 0x00, 0x00 - -@ Yellow Heart Symbols - .global gHeartYellowTiny -gHeartYellowTiny: @ 8106BC4 - .byte 0x87, 0x4A, 0x00, 0x00 - - .global gHeartYellowSmall -gHeartYellowSmall: @ 8106BC8 - .byte 0x87, 0x4B, 0x00, 0x00 - - .global gHeartYellowMedium -gHeartYellowMedium: @ 8106BCC - .byte 0x87, 0x4C, 0x00, 0x00 - - .global gHeartYellowLarge -gHeartYellowLarge: @ 8106BD0 - .byte 0x87, 0x4D, 0x00, 0x00 - - .global gUnknown_8106BD4 -gUnknown_8106BD4: @ 8106BD4 - .byte 0x87, 0x42, 0x24, 0x6d, 0x30, 0x23, 0x3d, 0x59, 0x24, 0x6d, 0x31, 0x00 - - .global gUnknown_8106BE0 -gUnknown_8106BE0: @ 8106BE0 - .byte 0x87, 0x40, 0x24, 0x6d, 0x30, 0x23, 0x3d, 0x59, 0x24, 0x6d, 0x31, 0x00 - - .global gUnknown_8106BEC -gUnknown_8106BEC: @ 8106BEC - .byte 0x87, 0x42, 0x24, 0x6d, 0x30, 0x00, 0x00, 0x00 - - .global gUnknown_8106BF4 -gUnknown_8106BF4: @ 8106BF4 - .byte 0x87, 0x40, 0x24, 0x6d, 0x30, 0x00, 0x00, 0x00 - .global gUnknown_8106BFC - gUnknown_8106BFC: - .byte 0x01, 0x00, 0x0f, 0x00 - - .global gUnknown_8106C00 -gUnknown_8106C00: @ 8106C00 - .byte 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00 - .4byte gUnknown_8106BFC - - .global gUnknown_8106C18 -gUnknown_8106C18: @ 8106C18 - .byte 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00 - .4byte gUnknown_8106BFC - - .global gUnknown_8106C30 -gUnknown_8106C30: @ 8106C30 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x0e, 0x00, 0x02, 0x00 - .byte 0x0e, 0x00, 0x10, 0x00 - .byte 0x10, 0x00, 0x00, 0x00 - .byte 0x70, 0xf2, 0x02, 0x02 - - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x02, 0x00, 0x02, 0x00 - .byte 0x0a, 0x00, 0x02, 0x00 - .byte 0x02, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - - .global gUnknown_8106C90 -gUnknown_8106C90: @ 8106C90 - .string "????\0" - .align 2,0 - - .global gUnknown_8106C98 -gUnknown_8106C98: @ 8106C98 - .string "{MOVE_ITEM_0}\0" - .align 2,0 - - .global gUnknown_8106C9C -gUnknown_8106C9C: @ 8106C9C - .string "None\0" - - -@ sub_80633E4 - sub_80639E4 - .align 2,0 - .string "pksdir0\0" - .align 2,0 - - .global gUnknown_8106CAC -gUnknown_8106CAC: @ 8106CAC - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x02, 0x00, 0x0E, 0x00 - .byte 0x1A, 0x00, 0x03, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - - .global gUnknown_8106CC4 -gUnknown_8106CC4: @ 8106CC4 - .string "{MOVE_ITEM_0}\0" - .align 2,0 - - .global gUnknown_8106CC8 -gUnknown_8106CC8: @ 8106CC8 - .byte 0x01, 0x00, 0x10, 0x00 - - .global gUnknown_8106CCC -gUnknown_8106CCC: @ 8106CCC - .string "{POKEMON_0}\0" - -@ ??? - .align 2,0 - .string "pksdir0\0" - -@ ??? - .align 2,0 - .string "pksdir0\0" - -@ CreateFieldDungeonMenu - CreateFieldOthersMenu - .align 2,0 - .string "pksdir0\0" - - .align 2,0 - - .global gUnknown_8106CE8 -gUnknown_8106CE8: @ 8106CE8 - .byte 0x10, 0x00, 0x00, 0x00 - .byte 0x19, 0x00, 0x00, 0x00 - .byte 0x1b, 0x00, 0x00, 0x00 - - .global gUnknown_8106CF4 -gUnknown_8106CF4: @ 8106CF4 - .byte 0x13, 0x00, 0x00, 0x00 - .byte 0x11, 0x00, 0x00, 0x00 - .byte 0x19, 0x00, 0x00, 0x00 - -@ sub_8065FB4 - sub_8066358 - .string "pksdir0\0" - .align 2,0 - - .global gUnknown_8106D08 -gUnknown_8106D08: @ 8106D08 - .byte 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x02, 0x00, 0x3c, 0xb4, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .global gUnknown_8106D68 -gUnknown_8106D68: @ 8106D68 - .byte 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x38, 0x00, 0x68, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - - .global gUnknown_8106D8C -gUnknown_8106D8C: @ 8106D8C - .string "{color}%d{POKEMON_0}\0" @ ??? .align 2,0 diff --git a/data/data_8106A4C_0.s b/data/data_8106A4C_0.s new file mode 100644 index 000000000..fba5034bd --- /dev/null +++ b/data/data_8106A4C_0.s @@ -0,0 +1,44 @@ + .section .rodata + +@ sub_8048E04 - sub_805FC30 + .align 2,0 + .string "pksdir0\0" + + + .global gUnknown_8106A4C +gUnknown_8106A4C: @ 8106A4C + .4byte 0 + + .global gUnknown_8106A50 +gUnknown_8106A50: @ 8106A50 + .4byte 1 + + .global gUnknown_8106A54 +gUnknown_8106A54: @ 8106A54 +.byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 +.byte 0x80, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00 +.byte 0x80, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00 + +.align 2,0 +.string "pksdir0\0" +.align 2,0 + +.align 2,0 +.string "pksdir0\0" +.align 2,0 + + .global gUnknown_8106A8C +gUnknown_8106A8C: @ 8106A8C +.byte 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 +.byte 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x70, 0x6b, 0x73, 0x64 +.byte 0x69, 0x72, 0x30, 0x00 + +.align 2,0 +.string "pksdir0\0" +.align 2,0 + +.align 2,0 +.string "pksdir0\0" +.align 2,0 + + diff --git a/include/code_801B3C0.h b/include/code_801B3C0.h index 116f9816e..76ad0b429 100644 --- a/include/code_801B3C0.h +++ b/include/code_801B3C0.h @@ -17,7 +17,7 @@ typedef struct unkStruct_203B230 u8 fill18[0x20 - 0x18]; u32 unk20; u32 unk24; - Windows unk28; + WindowTemplates unk28; MenuInputStructSub unk88; } unkStruct_203B230; diff --git a/include/code_801B60C.h b/include/code_801B60C.h index 4ef7556ea..b673b5934 100644 --- a/include/code_801B60C.h +++ b/include/code_801B60C.h @@ -20,7 +20,7 @@ typedef struct unkStruct_203B234 MenuStruct unk78; /* 0xC8 */ u32 menuAction; MenuItem unkCC[5]; - Windows windows; + WindowTemplates windows; } unkStruct_203B234; bool8 sub_801B60C(u32, u8 id, u8 quantity); diff --git a/include/code_801D014.h b/include/code_801D014.h index ef70e1780..a79d975e8 100644 --- a/include/code_801D014.h +++ b/include/code_801D014.h @@ -21,7 +21,7 @@ struct unk_203B250 MenuStruct unk18; MenuItem unk68[8]; u16 unkA8[8]; - Windows windows; + WindowTemplates windows; }; // size: 0x8 diff --git a/include/code_801EE10.h b/include/code_801EE10.h index 73aca6d6c..a519b0572 100644 --- a/include/code_801EE10.h +++ b/include/code_801EE10.h @@ -21,7 +21,7 @@ typedef struct unkStruct_203B270 /* 0x1C */ MenuInputStruct input; u32 unk50; u32 unk54; - Windows windows; + WindowTemplates windows; const u8 *text; } unkStruct_203B270; diff --git a/include/code_80227B8.h b/include/code_80227B8.h index 96accc32c..4e8d7658c 100644 --- a/include/code_80227B8.h +++ b/include/code_80227B8.h @@ -26,7 +26,7 @@ typedef struct unkStruct_203B294 /* 0xF4 */ u32 menuAction; MenuItem unkF8[8]; u16 unk138[8]; - Windows windows; + WindowTemplates windows; } unkStruct_203B294; bool8 sub_80227B8(PokemonStruct1 *pkmn); diff --git a/include/code_8024458.h b/include/code_8024458.h index 7c40da5d5..624120372 100644 --- a/include/code_8024458.h +++ b/include/code_8024458.h @@ -15,8 +15,8 @@ struct unkStruct_203B2AC struct unkStruct_808FF20 unk4C; struct UnkInfoTabStruct unkB0; u32 unkE0; - Window *unkE4; - Windows unkE8; + WindowTemplate *unkE4; + WindowTemplates unkE8; WindowHeader unk148; }; diff --git a/include/code_802DB28.h b/include/code_802DB28.h index e9f040ce9..ca94c97a7 100644 --- a/include/code_802DB28.h +++ b/include/code_802DB28.h @@ -15,7 +15,7 @@ struct unkStruct_203B2FC /* 0x30 */ u8 jobSlotIndex; /* 0x34 */ WonderMail *jobInfo; /* 0x38 */ struct MonPortraitMsg monPortrait; - Windows unk48; + WindowTemplates unk48; }; bool8 sub_802DB28(u8 jobSlotIndex, u8 dungeon); diff --git a/include/code_802DE84.h b/include/code_802DE84.h index efe8f24ed..c1492410e 100644 --- a/include/code_802DE84.h +++ b/include/code_802DE84.h @@ -11,8 +11,8 @@ struct unkStruct_203B300 MenuInputStructSub unk0; /* 0xC */ unkStruct_802C39C *mail; u32 unk10; - Window *unk14; - Windows unk18; + WindowTemplate *unk14; + WindowTemplates unk18; u8 unk78[4]; }; diff --git a/include/code_803E46C.h b/include/code_803E46C.h index 270af6573..9588788e4 100644 --- a/include/code_803E46C.h +++ b/include/code_803E46C.h @@ -1,6 +1,6 @@ #ifndef GUARD_CODE_803E46C_H #define GUARD_CODE_803E46C_H -void sub_803E46C(u32); +void DungeonRunFrameActions(u32); #endif diff --git a/include/code_8044CC8.h b/include/code_8044CC8.h index 1931c4c0a..b75cfe009 100644 --- a/include/code_8044CC8.h +++ b/include/code_8044CC8.h @@ -4,11 +4,11 @@ // size: 0x4 typedef struct unkStruct_202EE44 { - u16 unk0; + u16 actionId; u8 unk2; - bool8 unk3; + bool8 canBeChosen; } unkStruct_202EE44; -extern unkStruct_202EE44 gUnknown_202EE44[10]; +extern unkStruct_202EE44 gDungeonSubMenu[10]; #endif // GUARD_CODE_8044CC8_H diff --git a/include/code_8097DD0.h b/include/code_8097DD0.h index 6a8ae9003..2a083c681 100644 --- a/include/code_8097DD0.h +++ b/include/code_8097DD0.h @@ -3,6 +3,6 @@ #include "structs/subStruct_203B240.h" -extern u32 sub_8097DF0(u8 *, struct subStruct_203B240 **); +extern u32 sub_8097DF0(const u8 *, struct subStruct_203B240 **); -#endif // GUARD_CODE_8097DD0_H \ No newline at end of file +#endif // GUARD_CODE_8097DD0_H diff --git a/include/constants/dungeon_action.h b/include/constants/dungeon_action.h index 7ffe68b7d..d01f17a83 100644 --- a/include/constants/dungeon_action.h +++ b/include/constants/dungeon_action.h @@ -8,12 +8,13 @@ enum DungeonAction ACTION_WALK = 0x2, ACTION_UNK5 = 0x5, // Switching between Pokémon in the moves menu. - ACTION_NEXT = 0x6, - ACTION_PREVIOUS = 0x7, + ACTION_MOVES_MENU_NEXT_MON = 0x6, + ACTION_MOVES_MENU_PREV_MON = 0x7, ACTION_PLACE_ITEM = 0x8, // Some actions are different between the leader and AI-controlled Pokémon. ACTION_PICK_UP_PLAYER = 0x9, // Picking up an item underfoot. ACTION_THROW_ITEM_PLAYER = 0xB, + ACTION_SHOW_INFO = 0xC, ACTION_EAT_BERRY_SEED_DRINK = 0xD, ACTION_USE_TM = 0x12, ACTION_TALK_FIELD = 0x13, // Talking to another Pokémon by facing them and interacting. @@ -24,16 +25,18 @@ enum DungeonAction ACTION_CHANGE_TACTICS = 0x1A, ACTION_CHECK_SUMMARY = 0x1B, ACTION_TALK_MENU = 0x1C, // Talking to another Pokémon via the menu. - ACTION_UNK1D = 0x1D, + ACTION_MOVE_INFO = 0x1D, ACTION_SET_MOVE = 0x1E, // Registering a move. - ACTION_UNK1F = 0x1F, - ACTION_UNK20 = 0x20, - ACTION_UNK21 = 0x21, + ACTION_SWITCH_AI_MOVE = 0x1F, + ACTION_LINK_MOVES = 0x20, + ACTION_DELINK_MOVES = 0x21, + ACTION_UNK22 = 0x22, ACTION_EAT_AI = 0x23, ACTION_THROW_ITEM_AI = 0x24, ACTION_STEPPED_ON_TRAP = 0x25, ACTION_STAIRS = 0x26, ACTION_THROW_STRAIGHT_PLAYER = 0x27, + ACTION_QUICK_SAVE = 0x2B, ACTION_USE_LINK_BOX = 0x2C, ACTION_GIVE_UP = 0x2E, ACTION_VIEW_IQ = 0x30, diff --git a/include/credits1.h b/include/credits1.h index 39c029595..5a1130ad0 100644 --- a/include/credits1.h +++ b/include/credits1.h @@ -6,7 +6,7 @@ // size: 0x6C typedef struct Credits1Work { - Windows unk0; + WindowTemplates unk0; s32 unk60; s32 unk64; /* 0x68 */ s32 creditsCategoryIndex; diff --git a/include/debug_menu1.h b/include/debug_menu1.h index 0fec0caaf..35912eb33 100644 --- a/include/debug_menu1.h +++ b/include/debug_menu1.h @@ -8,7 +8,7 @@ struct DebugMenu { MenuStruct unk0[4]; - Windows unk140; + WindowTemplates unk140; u32 fill1A0; }; diff --git a/include/debug_menu2.h b/include/debug_menu2.h index 39cbed18c..aaa5709db 100644 --- a/include/debug_menu2.h +++ b/include/debug_menu2.h @@ -14,7 +14,7 @@ typedef struct unkStruct_203B3F0 MenuStruct unk4C; unkStructFor8013AA0 unk9C; u8 fillCC[0xD8 - 0xCC]; - Windows unkD8; + WindowTemplates unkD8; } unkStruct_203B3F0; #endif // GUARD_DEBUG_MENU2_H diff --git a/include/debug_menu3.h b/include/debug_menu3.h index a5851b53a..0a5d923d6 100644 --- a/include/debug_menu3.h +++ b/include/debug_menu3.h @@ -12,7 +12,7 @@ typedef struct unkStruct_203B3F4 /* 0x8 */ u32 menuAction; /* 0xC */ MenuItem menuItems[8]; MenuStruct unk4C; - Windows unk9C; + WindowTemplates unk9C; } unkStruct_203B3F4; #endif // GUARD_DEBUG_MENU3_H diff --git a/include/debug_menu4.h b/include/debug_menu4.h index 7a886483a..9c78bd347 100644 --- a/include/debug_menu4.h +++ b/include/debug_menu4.h @@ -17,7 +17,7 @@ typedef struct unkStruct_203B3F8 unkStructFor8013AA0 unk60; MenuItem unk90[8]; u16 unkD0[8]; - Windows unkE0; + WindowTemplates unkE0; } unkStruct_203B3F8; #endif // GUARD_DEBUG_MENU4_H diff --git a/include/dungeon_main.h b/include/dungeon_main.h new file mode 100644 index 000000000..5067e39e3 --- /dev/null +++ b/include/dungeon_main.h @@ -0,0 +1,22 @@ +#ifndef GUARD_DUNGEON_MAIN_H +#define GUARD_DUNGEON_MAIN_H + +#include "structs/dungeon_entity.h" + +struct UnkMenuBitsStruct { + u8 a0_8; + u8 a0_16; + u8 a0_24; + u8 a0_32; +}; + +void DungeonHandlePlayerInput(void); +void sub_805E804(void); +void sub_805EE30(void); +void sub_805EFB4(Entity *a0, bool8 a1); +void sub_805F02C(void); +ActionContainer *GetLeaderActionContainer(void); +u16 GetLeaderActionId(void); +bool8 DungeonGiveNameToRecruitedMon(u8 *a0); + +#endif diff --git a/include/dungeon_map_access.h b/include/dungeon_map_access.h index 71532776d..36fc0440e 100644 --- a/include/dungeon_map_access.h +++ b/include/dungeon_map_access.h @@ -19,7 +19,7 @@ void sub_8049B8C(void); void sub_8049BB0(s32 x, s32 y); void sub_804A1F0(s32 a0, s32 a1); void sub_804A49C(s32 a0, s32 a1); -void sub_804A728(DungeonPos *pos, s32 a1, u8 a2, u8 a3); +void ChangeDungeonCameraPos(DungeonPos *pos, s32 a1, u8 a2, u8 a3); void sub_804AA60(void); void sub_804AAAC(void); void sub_804AAD4(void); diff --git a/include/dungeon_menu_items.h b/include/dungeon_menu_items.h new file mode 100644 index 000000000..ee8424def --- /dev/null +++ b/include/dungeon_menu_items.h @@ -0,0 +1,11 @@ +#ifndef GUARD_DUNGEON_MENU_ITEMS_H +#define GUARD_DUNGEON_MENU_ITEMS_H + +#include "dungeon_main.h" +#include "structs/dungeon_entity.h" + +bool8 sub_805FD3C(struct UnkMenuBitsStruct *a0); +bool8 ShowDungeonItemsMenu(Entity * a0, struct UnkMenuBitsStruct *a1); +void sub_8060D24(UNUSED ActionContainer *a0); + +#endif diff --git a/include/dungeon_menu_moves.h b/include/dungeon_menu_moves.h new file mode 100644 index 000000000..7334f36c3 --- /dev/null +++ b/include/dungeon_menu_moves.h @@ -0,0 +1,18 @@ +#ifndef GUARD_DUNGEON_MENU_MOVES_H +#define GUARD_DUNGEON_MENU_MOVES_H + +#include "structs/dungeon_entity.h" +#include "structs/menu.h" +#include "structs/subStruct_203B240.h" + +void ShowMovesFromTeamMenu(ActionContainer *a0); +bool8 ShowDungeonMovesMenu(Entity * entity, bool8 addLinkOptions, bool8 addUseMove, s32 a3, s32 a4); +void ActionShowMoveInfo(ActionContainer *a0); +void ShowStatusDescriptionMenu(struct subStruct_203B240 *status, MenuInputStructSub *menuSub); +void ActionSetOrUnsetMove(ActionContainer *a0, bool8 flagToSet); +void ActionToggleMoveUsableForAi(ActionContainer *a0); +void ActionLinkMoves(ActionContainer *a0); +void ActionDelinkMoves(ActionContainer *a0, bool8 showMsg); +bool8 sub_8063E70(Entity *entity, Move *moves, bool8 showYesNoBox, bool8 allowBPress); + +#endif diff --git a/include/dungeon_menu_others.h b/include/dungeon_menu_others.h new file mode 100644 index 000000000..3b6107abf --- /dev/null +++ b/include/dungeon_menu_others.h @@ -0,0 +1,6 @@ +#ifndef GUARD_DUNGEON_MENU_OTHERS_H +#define GUARD_DUNGEON_MENU_OTHERS_H + +void ShowDungeonOthersMenu(void); + +#endif diff --git a/include/dungeon_menu_recruitment.h b/include/dungeon_menu_recruitment.h new file mode 100644 index 000000000..b12b0bd61 --- /dev/null +++ b/include/dungeon_menu_recruitment.h @@ -0,0 +1,6 @@ +#ifndef GUARD_DUNGEON_MENU_RECRUITMENT_H +#define GUARD_DUNGEON_MENU_RECRUITMENT_H + +void ShowRecruitmentSearchMenu(void); + +#endif diff --git a/include/dungeon_menu_stairs.h b/include/dungeon_menu_stairs.h new file mode 100644 index 000000000..642d0ecf5 --- /dev/null +++ b/include/dungeon_menu_stairs.h @@ -0,0 +1,8 @@ +#ifndef GUARD_DUNGEON_MENU_STAIRS_H +#define GUARD_DUNGEON_MENU_STAIRS_H + +#include "structs/dungeon_entity.h" + +void ShowDungeonStairsMenu(Entity *mon); + +#endif diff --git a/include/dungeon_menu_team.h b/include/dungeon_menu_team.h new file mode 100644 index 000000000..615091ce7 --- /dev/null +++ b/include/dungeon_menu_team.h @@ -0,0 +1,16 @@ +#ifndef GUARD_DUNGEON_MENU_TEAM_H +#define GUARD_DUNGEON_MENU_TEAM_H + +#include "structs/dungeon_entity.h" +#include "structs/subStruct_203B240.h" + +bool8 ShowDungeonTeamMenu(Entity *a0); +void ShowDungeonTacticsMenu(ActionContainer *a0); +void ShowDungeonSummaryOrIQMenu(ActionContainer *a0, bool8 a1); +void ShowStatusDescriptionMenuArrow(void); +void ShowStatusesDescriptionMenu(s32 count, struct subStruct_203B240 **strings); +#define WHICH_MENU_MOVES 1 +#define WHICH_MENU_ITEMS 2 +Entity *ShowDungeonToWhichMonMenu(s32 *teamId, s32 caseId); + +#endif diff --git a/include/dungeon_menu_tile.h b/include/dungeon_menu_tile.h new file mode 100644 index 000000000..ba619f876 --- /dev/null +++ b/include/dungeon_menu_tile.h @@ -0,0 +1,8 @@ +#ifndef GUARD_DUNGEON_MENU_TRAP_H +#define GUARD_DUNGEON_MENU_TRAP_H + +#include "structs/dungeon_entity.h" + +void ShowDungeonTileMenu(Entity *mon); + +#endif diff --git a/include/dungeon_message.h b/include/dungeon_message.h index f8122c2c7..ea4fe1788 100644 --- a/include/dungeon_message.h +++ b/include/dungeon_message.h @@ -4,6 +4,10 @@ #include "structs/dungeon_entity.h" #include "string_format.h" +// These flags are used in dungeon message and dungeon menu recruitment file. It's possible these are general scroll flags and should be put elsewhere, like text.h, assuming more files actually use it. +#define FLAG_CAN_SCROLL_UP 0x1 +#define FLAG_CAN_SCROLL_DOWN 0x2 + struct MonDialogueSpriteInfo { s16 species; diff --git a/include/dungeon_submenu.h b/include/dungeon_submenu.h new file mode 100644 index 000000000..a9eead764 --- /dev/null +++ b/include/dungeon_submenu.h @@ -0,0 +1,8 @@ +#ifndef GUARD_DUNGEON_SUBMENU_H +#define GUARD_DUNGEON_SUBMENU_H + +#include "structs/str_text.h" + +void CreateDungeonMenuSubWindow(WindowTemplate *mainWindow, s32 subWindowX); + +#endif diff --git a/include/exclusive_pokemon.h b/include/exclusive_pokemon.h index e4818501f..a400fb5cc 100644 --- a/include/exclusive_pokemon.h +++ b/include/exclusive_pokemon.h @@ -55,7 +55,7 @@ bool8 sub_8098100(u8 param_1); bool8 sub_8098134(s16 pokeID); void SetTutorialFlag(s32 param_1); bool32 GetTutorialFlag(s32 param_1); -bool8 IsExclusivePokemonUnlocked(s16 pokeID); +bool8 IsExclusivePokemonUnlocked(s32 pokeID); void UnlockExclusivePokemon(s16 pokeID); void WriteExclusivePokemon(DataSerializer *r0); void ReadExclusivePokemon(DataSerializer *r0); diff --git a/include/felicity_bank.h b/include/felicity_bank.h index c4044d49d..7bf8b85b9 100644 --- a/include/felicity_bank.h +++ b/include/felicity_bank.h @@ -22,7 +22,7 @@ typedef struct FelicityBankWork unkStructFor8013AA0 unk64; /* 0x94 */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unkA8; + WindowTemplates unkA8; } FelicityBankWork; bool8 CreateFelicityBank(s32 mode); diff --git a/include/friend_area_action_menu.h b/include/friend_area_action_menu.h index 132d5d898..b95fb01a6 100644 --- a/include/friend_area_action_menu.h +++ b/include/friend_area_action_menu.h @@ -65,7 +65,7 @@ struct unkStruct_203B2BC MenuItem menuItems[4]; u8 fill120[0x16C - 0x13C]; u16 unk16C[10]; - Windows unk180; + WindowTemplates unk180; }; u32 sub_8027074(void); diff --git a/include/friend_list_menu.h b/include/friend_list_menu.h index a4c6d619f..d60b1af81 100644 --- a/include/friend_list_menu.h +++ b/include/friend_list_menu.h @@ -31,7 +31,7 @@ typedef struct unkStruct_203B2B4 MenuStruct unk78; MenuItem unkC8[8]; u16 unk108[8]; - Windows unk118; + WindowTemplates unk118; } unkStruct_203B2B4; bool8 CreateFriendListMenu(s32 param_1); diff --git a/include/friend_rescue.h b/include/friend_rescue.h index a349b7fad..95b8bbf8f 100644 --- a/include/friend_rescue.h +++ b/include/friend_rescue.h @@ -23,8 +23,8 @@ typedef struct WonderMailStruct_203B33C unkStruct_203B480 unk1E8; u8 unk218; MenuStruct unk21C[4]; - Windows unk35C; - Windows unk3BC; + WindowTemplates unk35C; + WindowTemplates unk3BC; /* 0x41C */ Item item; u32 unk420; // Is this supposed to be a File like 203B2C4? u8 unk424[0x100]; diff --git a/include/global.h b/include/global.h index 38f0ab311..100e30a63 100644 --- a/include/global.h +++ b/include/global.h @@ -46,6 +46,11 @@ static inline void InlineStrncpy(u8 *dst, const u8 *src, s32 n) strncpy(dst, src, n); } +static inline bool8 AreStringsDifferent(const u8 *str1, const u8 *str2) +{ + return strcmp(str1, str2) != 0; +} + // Sometimes incrementing and decrementing a variable changes how registers are allocated, which helps with matching functions. Functionality-wise this doesn't do anything. #ifdef NONMATCHING #define ASM_MATCH_TRICK(a) {;} diff --git a/include/gulpin_shop.h b/include/gulpin_shop.h index 4f5ef9b9d..fb798ae74 100644 --- a/include/gulpin_shop.h +++ b/include/gulpin_shop.h @@ -27,7 +27,7 @@ typedef struct GulpinShopWork u8 fillC8[0x118 - 0xC8]; /* 0x118 */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unk12C; + WindowTemplates unk12C; } GulpinShopWork; bool8 CreateGulpinShop(u32 mode, s16 pokeSpecies, Move *moves); diff --git a/include/gulpin_shop_801FB50.h b/include/gulpin_shop_801FB50.h index f0237f115..a141f018d 100644 --- a/include/gulpin_shop_801FB50.h +++ b/include/gulpin_shop_801FB50.h @@ -35,7 +35,7 @@ typedef struct unkStruct_203B27C u8 fill11C[0x16C - 0x11C]; /* 0x16C */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unk180; + WindowTemplates unk180; } unkStruct_203B27C; bool8 sub_801FB50(u32 mode); diff --git a/include/input.h b/include/input.h index 1dba6adad..2029913a8 100644 --- a/include/input.h +++ b/include/input.h @@ -59,4 +59,4 @@ void UpdateInput(void); bool8 sub_80048BC(void); bool8 sub_80048C8(void); -#endif // GUARD_INPUT_H \ No newline at end of file +#endif // GUARD_INPUT_H diff --git a/include/iq_skill_info_menu.h b/include/iq_skill_info_menu.h index d6f9dd661..5efb2c2a6 100644 --- a/include/iq_skill_info_menu.h +++ b/include/iq_skill_info_menu.h @@ -16,7 +16,7 @@ struct IQSkillInfoMenu u8 fill14[0x20 - 0x18]; u32 unk20; u32 unk24; - Windows unk28; + WindowTemplates unk28; MenuInputStructSub unk88; }; diff --git a/include/iq_skill_menu.h b/include/iq_skill_menu.h index 6a39ff357..06acfe5e8 100644 --- a/include/iq_skill_menu.h +++ b/include/iq_skill_menu.h @@ -19,7 +19,7 @@ struct IQSkillMenu /* 0x30 */ s32 menuAction; MenuItem unk34[8]; MenuStruct unk74; - Windows unkC4; + WindowTemplates unkC4; }; bool8 CreateIQSkillMenu(s16 species); diff --git a/include/kangaskhan_storage1.h b/include/kangaskhan_storage1.h index ecb31853d..dbaf17aee 100644 --- a/include/kangaskhan_storage1.h +++ b/include/kangaskhan_storage1.h @@ -47,7 +47,7 @@ struct KangaskhanStorageWork unkStructFor8013AA0 unkA8; /* 0xD8 */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unkEC; + WindowTemplates unkEC; }; bool8 CreateKangaskhanStorage(u32 mode); diff --git a/include/kangaskhan_storage2.h b/include/kangaskhan_storage2.h index 8fea21f32..dc88a73d9 100644 --- a/include/kangaskhan_storage2.h +++ b/include/kangaskhan_storage2.h @@ -27,7 +27,7 @@ typedef struct unkStruct_203B20C u16 unk60[8]; MenuStruct unk70; unkStructFor8013AA0 unkC0; - Windows unkF0; + WindowTemplates unkF0; } unkStruct_203B20C; bool8 sub_8017E1C(void); diff --git a/include/kecleon_bros1.h b/include/kecleon_bros1.h index 054ad9a75..5219dcebb 100644 --- a/include/kecleon_bros1.h +++ b/include/kecleon_bros1.h @@ -65,7 +65,7 @@ typedef struct KecleonBrosWork1 /* 0x84 */ MenuStruct menu; /* 0xD4 */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unkE8; + WindowTemplates unkE8; } KecleonBrosWork1; // mode corresponds to the enum: KecleonBrosMode diff --git a/include/luminous_cave.h b/include/luminous_cave.h index b18f45210..d96fae220 100644 --- a/include/luminous_cave.h +++ b/include/luminous_cave.h @@ -33,7 +33,7 @@ typedef struct LuminousCaveWork u8 unk110; u8 unk111; u8 unk112; - Windows unk114; + WindowTemplates unk114; } LuminousCaveWork; void CleanLuminousCave(void); diff --git a/include/mailbox.h b/include/mailbox.h index 6c181fd09..138537de5 100644 --- a/include/mailbox.h +++ b/include/mailbox.h @@ -19,7 +19,7 @@ struct unkStruct_203B304 MenuStruct unk6C; MenuItem menuItems[8]; u16 unkFC[8]; - Windows unk10C; + WindowTemplates unk10C; }; extern void SetMailboxState(u32); diff --git a/include/main_menu1.h b/include/main_menu1.h index 1ebc93f99..5f26006b5 100644 --- a/include/main_menu1.h +++ b/include/main_menu1.h @@ -38,12 +38,12 @@ void CleanUpMenu(void); void DeleteMainMenu(void); MainMenu1Work *GetMainMenu(void); void InitMainMenu(void); -void SetMenuItems(MenuStruct *, Windows *, s32 index, const Window *, const MenuItem *menuItems, bool8, u32 menuAction, bool8 unused); +void SetMenuItems(MenuStruct *, WindowTemplates *, s32 index, const WindowTemplate *, const MenuItem *menuItems, bool8, u32 menuAction, bool8 unused); void SetUpMenu(void); s32 UpdateMenu(void); void sub_8035C1C(void); -void sub_8035CC0(Windows *dataArray, u32 index); +void sub_8035CC0(WindowTemplates *dataArray, u32 index); void sub_8035CF4(MenuStruct *menu, u32 index, bool8); void sub_8035D1C(void); s16 sub_8035D3C(void); diff --git a/include/main_menu2.h b/include/main_menu2.h index d53af187c..221488aed 100644 --- a/include/main_menu2.h +++ b/include/main_menu2.h @@ -9,7 +9,7 @@ typedef struct MainMenu2Work { u32 unk0; MenuStruct unk4[4]; - Windows unk144; + WindowTemplates unk144; /* 0x1A4 */ u32 currMenuChoice; } MainMenu2Work; diff --git a/include/makuhita_dojo1.h b/include/makuhita_dojo1.h index 8c1301bb5..3fc978859 100644 --- a/include/makuhita_dojo1.h +++ b/include/makuhita_dojo1.h @@ -30,7 +30,7 @@ typedef struct MakuhitaDojoWork1 u8 fill38[0x58 - 0x38]; /* 0x58 */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unk6C; + WindowTemplates unk6C; } MakuhitaDojoWork1; void MakuhitaDojo_Delete(void); diff --git a/include/menu_input.h b/include/menu_input.h index 338b6f411..615919427 100644 --- a/include/menu_input.h +++ b/include/menu_input.h @@ -9,9 +9,9 @@ s32 GetKeyPress(MenuInputStruct *r0); s32 sub_8012AE8(void); void sub_8012BC4(u32 x, u32 y, s32 n, s32 len, u32 color, u32 param_6); void sub_8012C60(u32 x, u32 y, u32 param_3, u32 color, u32 param_5); -void sub_8012CAC(Window *param_1, const MenuItem *param_2); -void sub_8012D08(Window *param_1, s32 param_2); -void sub_8012D34(Window *param_1, s32 param_2); +void sub_8012CAC(WindowTemplate *param_1, const MenuItem *param_2); +void sub_8012D08(WindowTemplate *param_1, s32 param_2); +void sub_8012D34(WindowTemplate *param_1, s32 param_2); void sub_8012D60(MenuStruct *param_1, const MenuItem *menuItems, const u32 *colorArray, u16 *param_4, s32 menuAction, s32 index); void sub_8012E04(MenuStruct *param_1, const MenuItem *menuItems, const u32 *colorArray, u16 *param_4, s32 menuAction, s32 index); void sub_8012EA4(MenuStruct *param_1, bool8 r1); @@ -24,9 +24,9 @@ void AddMenuCursorSprite(MenuInputStruct *param_1); void sub_8013660(MenuInputStruct *param_1); void UpdateMenuCursorSpriteCoords(MenuInputStruct *param_1); void MoveMenuCursorDown(MenuInputStruct *param_1); -void sub_80136E0(MenuInputStruct *param_1, u8 param_2); +void MoveMenuCursorDownWrapAround(MenuInputStruct *param_1, u8 param_2); void MoveMenuCursorUp(MenuInputStruct *param_1); -void sub_8013744(MenuInputStruct *param_1, u8 param_2); +void MoveMenuCursorUpWrapAround(MenuInputStruct *param_1, u8 param_2); void sub_8013780(MenuInputStruct *param_1, s32 param_2); s32 sub_80137A8(MenuInputStruct *param_1); void sub_80137B0(MenuInputStruct *param_1, s32 param_2); @@ -49,7 +49,7 @@ void sub_8013C68(unkStructFor8013AA0 *); void sub_8013D10(unkStructFor8013AA0 *); void sub_8013E54(void); void sub_8013F84(void); -void sub_80140B4(Windows *); +void sub_80140B4(WindowTemplates *); #endif // GUARD_MENU_INPUT_H diff --git a/include/options_menu1.h b/include/options_menu1.h index 10247f132..d927bef9f 100644 --- a/include/options_menu1.h +++ b/include/options_menu1.h @@ -14,7 +14,7 @@ struct unkStruct_203B25C /* 0x1C */ MenuStruct menu; /* 0x6C */ MenuItem menuItems[8]; u16 unkAC[8]; - Windows unkBC; + WindowTemplates unkBC; }; bool8 sub_801DCC4(void); diff --git a/include/options_menu2.h b/include/options_menu2.h index f326e23b8..e0a140ca1 100644 --- a/include/options_menu2.h +++ b/include/options_menu2.h @@ -11,8 +11,8 @@ struct unkStruct_203B260 /* 0x4 */ MenuInputStructSub unk4; /* 0x10 */ MenuInputStruct input; u32 unk44; - Window *unk48; - Windows unk4C; + WindowTemplate *unk48; + WindowTemplates unk4C; }; bool8 sub_801E198(GameOptions *optionsMenu); diff --git a/include/other_menus1.h b/include/other_menus1.h index ad0e478f8..c87546e97 100644 --- a/include/other_menus1.h +++ b/include/other_menus1.h @@ -18,7 +18,7 @@ typedef struct unkStruct_203B35C u32 unk14; u8 fill18[0x1C - 0x18]; MenuStruct unk1C[4]; - Windows unk15C; + WindowTemplates unk15C; unkStruct_8035D94 unk1BC[2]; unkStruct_203B480 unk1CC; unkStruct_203B480 unk1FC; diff --git a/include/party_list_menu.h b/include/party_list_menu.h index f4ad8476e..c698012f1 100644 --- a/include/party_list_menu.h +++ b/include/party_list_menu.h @@ -32,7 +32,7 @@ typedef struct unkStruct_203B2B8 MenuItem unk16C[10]; MenuItem unk1BC[10]; u16 unk20C[10]; - Windows unk220; + WindowTemplates unk220; } unkStruct_203B2B8; bool8 CreatePartyListMenu(PokemonStruct1 *pokeStruct); diff --git a/include/pelipper_board.h b/include/pelipper_board.h index fc4892d72..b1f31c58e 100644 --- a/include/pelipper_board.h +++ b/include/pelipper_board.h @@ -17,7 +17,7 @@ struct unkStruct_203B308 MenuStruct unk6C; MenuItem menuItems[8]; u16 unkFC[8]; - Windows unk10C; + WindowTemplates unk10C; }; extern struct unkStruct_203B308 *gPelipperBoard; diff --git a/include/pokemon_news2.h b/include/pokemon_news2.h index d019d67e4..a3bad811f 100644 --- a/include/pokemon_news2.h +++ b/include/pokemon_news2.h @@ -14,7 +14,7 @@ struct unkStruct_203B2D4 const u8 *unk10[4]; u32 unk20; u32 unk24; - Windows unk28; + WindowTemplates unk28; MenuInputStructSub unk88; }; diff --git a/include/post_office_guide2.h b/include/post_office_guide2.h index a30bb5f71..95f782ac8 100644 --- a/include/post_office_guide2.h +++ b/include/post_office_guide2.h @@ -11,8 +11,8 @@ typedef struct unkStruct_203B330 u8 unkC; /* 0xD */ u8 dungeonIndex; u32 unk10; - Window *unk14; - Windows unk18; + WindowTemplate *unk14; + WindowTemplates unk18; } unkStruct_203B330; bool8 sub_80319A4(u8, u8 dungeon, s32); diff --git a/include/rescue_password_menu.h b/include/rescue_password_menu.h index 7c3563a94..e7c58b5cc 100644 --- a/include/rescue_password_menu.h +++ b/include/rescue_password_menu.h @@ -12,8 +12,8 @@ struct RescuePasswordMenu u32 currMenu; u32 state; MenuStruct unk8[4]; - Windows unk148; - Windows unk1A8; + WindowTemplates unk148; + WindowTemplates unk1A8; SpriteOAM unk208; u32 unk210; }; diff --git a/include/save_menu.h b/include/save_menu.h index 00bad9724..27d4e79e5 100644 --- a/include/save_menu.h +++ b/include/save_menu.h @@ -9,7 +9,7 @@ typedef struct SaveMenuWork /* 0x0 */ u32 currMenu; u32 unk4; MenuStruct unk8[4]; - Windows unk148; + WindowTemplates unk148; SpriteOAM unk1A8; u32 unk1B0; // Sprite count? } SaveMenuWork; diff --git a/include/structs/menu.h b/include/structs/menu.h index 78c36955d..9ab020421 100644 --- a/include/structs/menu.h +++ b/include/structs/menu.h @@ -72,7 +72,7 @@ typedef struct unkStructFor8013AA0 s32 unkC; // maxInclusive? s32 unk10; s32 unk14; // index of unk18? But read as chosenValue..? - Window *unk18; + WindowTemplate *unk18; s32 unk1C; // width of prompt? s32 unk20; // height of prompt? u8 unk24; // related to unk10 diff --git a/include/structs/sprite_oam.h b/include/structs/sprite_oam.h index b1e1c6e98..84d6e0042 100644 --- a/include/structs/sprite_oam.h +++ b/include/structs/sprite_oam.h @@ -259,16 +259,6 @@ typedef struct SpriteOAM (spritePtr)->attrib2 |= _xSpriteVal; \ } -// Hacky way of matching functions in menu_input.c AddMenuCursorSprite_, sub_801332C sub_8013470 -#define SpriteSetX_MatrixNumSize0(spritePtr, _x) \ -{ \ - u32 _xSpriteVal = _x; \ - _xSpriteVal &= SPRITEOAM_MAX_X; \ - _xSpriteVal <<= SPRITEOAM_SHIFT_X; \ - (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_X; \ - (spritePtr)->attrib2 = _xSpriteVal; \ -} - #define SpriteGetY(spritePtr)(((spritePtr)->unk6 >> SPRITEOAM_SHIFT_WORKING_Y) & SPRITEOAM_MAX_WORKING_Y) #define SpriteGetY_LocalVar(spritePtr, _y) \ diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 1e37b126e..845800a51 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -98,8 +98,8 @@ typedef struct UnkDungeonGlobal_unk181E8_sub u8 unk18218; // x30 u8 unk18219; // x31 u8 unk1821A; // x32 - u8 unk1821B; // x33 - u8 unk1821C; // x34 + u8 rotateModeDirection; // x33 + u8 prevRotateModeDirection; // x34 u8 fill1821D; // x35 s16 unk36; // x36 s16 unk38; // x38 @@ -249,7 +249,7 @@ typedef struct unkDungeon644 /* 0x8 */ unkStruct_Dungeon64C unk8; /* 0x10 */ u8 unk10; /* 0x11 */ u8 fill11[3]; - /* 0x14 */ u8 unk14; + /* 0x14 */ bool8 canRecruit; /* 0x15 */ u8 unk15; /* 0x16 */ u8 unk16; /* 0x17 */ u8 unk17; diff --git a/include/structs/str_text.h b/include/structs/str_text.h index 873ee8e15..2d4c4e152 100644 --- a/include/structs/str_text.h +++ b/include/structs/str_text.h @@ -2,14 +2,14 @@ #define GUARD_STR_TEXT_H // size: 0x48 -typedef struct UnkTextStruct1 +typedef struct Window { - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; + s16 x; + s16 y; + s16 width; + s16 height; s16 unk8; - u32 unkC; + s32 type; u32 unk10; u32 unk14; u32 *unk18; @@ -26,20 +26,20 @@ typedef struct UnkTextStruct1 u8 unk44; bool8 unk45; u8 unk46; -} UnkTextStruct1; +} Window; typedef struct WindowHeader { - u8 f0; - u8 f1; - u8 f2; + u8 count; // How many headers there are, it's used for windows which can be scrolled left/right + u8 currId; // Id of the current header + u8 width; u8 f3; } WindowHeader; #include "structs/str_position.h" // size: 0x18 -typedef struct Window +typedef struct WindowTemplate { u8 unk0; s32 type; @@ -48,26 +48,25 @@ typedef struct Window s16 height; s16 unk10; // In most cases it's the same as height. If it's smaller than height, the window may look glitchy. Maybe something with tile allocation/how the window is filled? s16 unk12; - const WindowHeader *unk14; -} Window; + const WindowHeader *header; +} WindowTemplate; -#define WINDOW_DUMMY (Window) {.type = WINDOW_TYPE_NORMAL, .width = 0} +// All fields are zeroed out except for type which is set to WINDOW_TYPE_NORMAL. +#define WINDOW_DUMMY (WindowTemplate) {.unk0 = 0, .type = WINDOW_TYPE_NORMAL, .width = 0, .pos = {0, 0}, .height = 0, .unk10 = 0, .unk12 = 0, .header = NULL} #define WINDOW_TYPE_0 0 #define WINDOW_TYPE_WITHOUT_BORDER 1 +#define WINDOW_TYPE_2 2 #define WINDOW_TYPE_NORMAL 3 +#define WINDOW_TYPE_4 4 #define WINDOW_TYPE_FILL_TRANSPARENT 5 #define WINDOW_TYPE_WITH_HEADER 6 #define WINDOW_TYPE_7 7 #define MAX_WINDOWS 4 -typedef struct Windows { - Window id[MAX_WINDOWS]; - // Something ugly, so that sub_805FD74 could match weird compiler memcpy/stack initialization - #ifndef NONMATCHING - u8 fakeMatch[0]; - #endif // NONMATCHING -} Windows; +typedef struct WindowTemplates { + WindowTemplate id[MAX_WINDOWS]; +} WindowTemplates; #endif // GUARD_STR_TEXT_H diff --git a/include/structs/struct_sub80095e4.h b/include/structs/struct_sub80095e4.h index 19eaea943..64c730531 100644 --- a/include/structs/struct_sub80095e4.h +++ b/include/structs/struct_sub80095e4.h @@ -12,8 +12,8 @@ typedef struct struct_Sub80095E4 { /* 0x0 */ MenuInputStruct input; u32 unk34; - Window *unk38; - Windows windows; + WindowTemplate *unk38; + WindowTemplates windows; // size: 0x9C } struct_Sub80095E4; diff --git a/include/text.h b/include/text.h index b961b1bb3..2f981e8b0 100644 --- a/include/text.h +++ b/include/text.h @@ -49,9 +49,10 @@ struct UnkDrawStringStruct s32 unk30; }; -extern UnkTextStruct1 gUnknown_2027370[4]; +extern Window gWindows[MAX_WINDOWS]; extern u8 gUnknown_202749A[11]; extern bool8 gUnknown_20274A5; + // These should probably go to code_8009804.h #define TILEMAP_TILE_NUM(num)(num & 0x3FF) // bits 0-9 #define TILEMAP_FLIP_HORIZONTAL(f)((f & 1) << 10) // bit 10 @@ -59,8 +60,8 @@ extern bool8 gUnknown_20274A5; #define TILEMAP_PAL(pal)((pal & 0xF) << 12) // bits 12-15 extern u16 gBgTilemaps[4][32][32]; // 4 bgs, 32x32 tiles, y dimension goes before x [bgId][y][x] -extern void (*gIwramTextFunc1)(s32 a0); -extern void (*gIwramTextFunc2)(s32 a0); +extern void (*ScrollDownWindowFunc)(s32 windowId); +extern void (*ScrollUpWindowFunc)(s32 windowId); extern void (*gIwramTextFunc3)(s32 a0); extern void (*gIwramTextFunc4)(s32 a0); @@ -69,15 +70,15 @@ u32 UpdateFadeInTile(u32 a0); u32 sub_80063B0(void); void SelectCharmap(u32 a0); void SetCharacterMask(int a0); -void ShowWindows(const Windows *windows, bool8 a1, bool8 a2); -void RestoreUnkTextStruct_8006518(Windows *unkData); +void ShowWindows(const WindowTemplates *windows, bool8 a1, bool8 a2); +void RestoreUnkTextStruct_8006518(WindowTemplates *unkData); u32 sub_8006544(u32 index); -void sub_8007334(s32 a0); +void sub_8007334(s32 windowId); void sub_80073B8(s32 a0); void sub_80073E0(s32 a0); u32 xxx_call_draw_char(s32 x, s32 y, u32 a2, u32 color, u32 a4); -void sub_80078A4(u32 a0, s32 x, s32 y, s32 a3, u32 color); -void sub_800792C(u32 a0, s32 x, s32 y, s32 a3, u32 color); +void AddDoubleUnderScoreHighlight(u32 windowId, s32 x, s32 y, s32 width, u32 color); +void AddUnderScoreHighlight(u32 windowId, s32 x, s32 y, s32 width, u32 color); void sub_8007A78(u32 a0, s32 x, s32 y, s32 a3, u32 color); void sub_8007B7C(u32 a0, s32 x, s32 y, s32 a3, u32 color); void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6); diff --git a/include/thank_you_wonder_mail.h b/include/thank_you_wonder_mail.h index 8761e25dc..f418f6bc0 100644 --- a/include/thank_you_wonder_mail.h +++ b/include/thank_you_wonder_mail.h @@ -22,8 +22,8 @@ typedef struct WonderMailStruct_203B2C4 unkStruct_203B480 unk1E8; /* 0x218 */ s8 mailIndex; MenuStruct unk21C[4]; - Windows unk35C; - Windows unk3BC; + WindowTemplates unk35C; + WindowTemplates unk3BC; Item unk41C; /* 0x420 */ struct MonPortraitMsg monPortrait; u32 unk430; diff --git a/include/trade_items_menu.h b/include/trade_items_menu.h index 6fa5cc386..9535c11d9 100644 --- a/include/trade_items_menu.h +++ b/include/trade_items_menu.h @@ -47,8 +47,8 @@ struct TradeItemsMenu u32 unk10; unkStructFor8013AA0 unk14; MenuStruct unk44[4]; - Windows unk184; - Windows unk1E4; + WindowTemplates unk184; + WindowTemplates unk1E4; // TODO These might be structs... struct TradeItem unk244; diff --git a/include/wigglytuff_shop2.h b/include/wigglytuff_shop2.h index b3477fd49..402d9fc74 100644 --- a/include/wigglytuff_shop2.h +++ b/include/wigglytuff_shop2.h @@ -13,8 +13,8 @@ typedef struct WigglytuffShop2Work u32 pokemonStatus[0x10]; /* 0x70 */ s32 numPokemoninFriendArea; s32 unk74; - Window *unk78; - Windows unk7C; + WindowTemplate *unk78; + WindowTemplates unk7C; u8 unkDC[4]; } WigglytuffShop2Work; diff --git a/include/wigglytuff_shop3.h b/include/wigglytuff_shop3.h index 59ae014c2..0466a1b27 100644 --- a/include/wigglytuff_shop3.h +++ b/include/wigglytuff_shop3.h @@ -54,7 +54,7 @@ typedef struct WigglytuffShop3Work MenuStruct unk6C; /* 0xBC */ struct MonPortraitMsg monPortrait; struct MonPortraitMsg *monPortraitPtr; - Windows unkD0; + WindowTemplates unkD0; u32 unk130; u32 unk134; } WigglytuffShop3Work; diff --git a/include/wonder_mail.h b/include/wonder_mail.h index 04690941d..40db9e853 100644 --- a/include/wonder_mail.h +++ b/include/wonder_mail.h @@ -22,8 +22,8 @@ typedef struct WonderMailStruct_203B2C0 u8 fill16A[0x218 - 0x1B8]; /* 0x218 */ u8 mailIndex; MenuStruct unk21C[4]; - Windows unk35C; - Windows unk3BC; + WindowTemplates unk35C; + WindowTemplates unk3BC; /* 0x41C */ u32 unkfill; // ItemSlot? /* 0x420 */ struct MonPortraitMsg monPortrait; /* 0x430 */ u8 padding3[0x534 - 0x430]; diff --git a/include/wonder_mail_802C860.h b/include/wonder_mail_802C860.h index c4436fc70..8dffc5b5c 100644 --- a/include/wonder_mail_802C860.h +++ b/include/wonder_mail_802C860.h @@ -19,7 +19,7 @@ struct unkStruct_203B2F0 MenuItem unk10C[8]; MenuItem unk14C[8]; u8 fill18C[0x19C - 0x18C]; - Windows unk19C; + WindowTemplates unk19C; }; bool8 InitializeJobListMenu(u32); diff --git a/include/wonder_mail_802D098.h b/include/wonder_mail_802D098.h index 85fb329d9..529d066c5 100644 --- a/include/wonder_mail_802D098.h +++ b/include/wonder_mail_802D098.h @@ -34,7 +34,7 @@ typedef struct unkStruct_203B2F8 MenuItem unk118[8]; MenuItem unk158[8]; u16 unk198[8]; - Windows unk1A8; + WindowTemplates unk1A8; } unkStruct_203B2F8; bool8 GetWonderMailAccepted(void); diff --git a/ld_script.txt b/ld_script.txt index 98e558b4a..a1b84279f 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -225,8 +225,15 @@ SECTIONS { src/move_actions.o(.text); src/status_actions.o(.text); src/move_checks.o(.text); - src/code_805D8C8_1.o(.text); - asm/code_805D8C8.o(.text); + src/dungeon_main.o(.text); + src/dungeon_submenu.o(.text); + src/dungeon_menu_items.o(.text); + src/dungeon_menu_team.o(.text); + src/dungeon_menu_moves.o(.text); + src/dungeon_menu_tile.o(.text); + src/dungeon_menu_stairs.o(.text); + src/dungeon_menu_others.o(.text); + src/dungeon_menu_recruitment.o(.text); src/code_8066D04.o(.text); src/code_805D8C8.o(.text); asm/code_805D8C8_1.o(.text); @@ -542,6 +549,16 @@ SECTIONS { data/data_80F59C8.o(.rodata); src/dungeon_message.o(.rodata); src/dungeon_move.o(.rodata); + data/data_8106A4C_0.o(.rodata); + src/dungeon_main.o(.rodata); + src/dungeon_submenu.o(.rodata); + src/dungeon_menu_items.o(.rodata); + src/dungeon_menu_team.o(.rodata); + src/dungeon_menu_moves.o(.rodata); + src/dungeon_menu_tile.o(.rodata); + src/dungeon_menu_stairs.o(.rodata); + src/dungeon_menu_others.o(.rodata); + src/dungeon_menu_recruitment.o(.rodata); data/data_8106A4C.o(.rodata); src/code_8066D04.o(.rodata); data/data_8106A4C_2.o(.rodata); diff --git a/src/adventure_log.c b/src/adventure_log.c index 5e658c0f2..396ffe2b4 100644 --- a/src/adventure_log.c +++ b/src/adventure_log.c @@ -26,7 +26,7 @@ bool8 CreateAdventureLogScreen(u32 kind) sAdventureLog->s0.unk38 = &sAdventureLog->s0.windows.id[kind]; RestoreUnkTextStruct_8006518(&sAdventureLog->s0.windows); sAdventureLog->s0.windows.id[sAdventureLog->s0.unk34] = sUnknown_80E2008; - sAdventureLog->s0.unk38->unk14 = &sAdventureLog->unk9C; + sAdventureLog->s0.unk38->header = &sAdventureLog->unk9C; ResetUnusedInputStruct(); ShowWindows(&sAdventureLog->s0.windows, TRUE, TRUE); @@ -73,9 +73,9 @@ void CleanAdventureLogScreen(void) static void sub_8032084(void) { - sAdventureLog->unk9C.f0 = sAdventureLog->s0.input.unk20; - sAdventureLog->unk9C.f1 = sAdventureLog->s0.input.unk1E; - sAdventureLog->unk9C.f2 = 11; + sAdventureLog->unk9C.count = sAdventureLog->s0.input.unk20; + sAdventureLog->unk9C.currId = sAdventureLog->s0.input.unk1E; + sAdventureLog->unk9C.width = 11; sAdventureLog->unk9C.f3 = 0; SUB_80095E4_CALL(sAdventureLog->s0); @@ -96,7 +96,7 @@ static void DisplayAdventureLog(void) PrintStringOnWindow(r6, 0, sAdventureLogText, sAdventureLog->s0.unk34, 0); r4 += 4; - r6 = r4 + (sAdventureLog->unk9C.f2 * 8); + r6 = r4 + (sAdventureLog->unk9C.width * 8); sub_8012BC4(r6, 0, sAdventureLog->s0.input.unk1E + 1, 1, 7, sAdventureLog->s0.unk34); for (i = 0; i < sAdventureLog->s0.input.unk1A; i++) { diff --git a/src/code_8015080.c b/src/code_8015080.c index 72ff7c990..ba719a8f7 100644 --- a/src/code_8015080.c +++ b/src/code_8015080.c @@ -16,13 +16,13 @@ struct unkStruct_203B1F8 // size: 0x4B4 u32 menuAction; MenuStruct unk4; - Windows windows; + WindowTemplates windows; u8 buffer[0x400]; }; EWRAM_INIT struct unkStruct_203B1F8 *gUnknown_203B1F8 = {NULL}; -const Window gUnknown_80DAF70 = { +const WindowTemplate gUnknown_80DAF70 = { 0x00, 0x03, 0x00, 0x00, @@ -31,7 +31,7 @@ const Window gUnknown_80DAF70 = { NULL }; -const Window gUnknown_80DAF88 = { +const WindowTemplate gUnknown_80DAF88 = { 0x00, 0x03, 0x02, 0x02, @@ -40,7 +40,7 @@ const Window gUnknown_80DAF88 = { NULL }; -const Window gUnknown_80DAFA0 = { +const WindowTemplate gUnknown_80DAFA0 = { 0x00, 0x03, 0x16, 0x0F, @@ -251,7 +251,7 @@ static const u8 *const gUnknown_80DB4F4[] = _("END"), }; -static const Window gUnknown_80DB538 = { +static const WindowTemplate gUnknown_80DB538 = { 0x00, 0x03, 0x00, 0x00, @@ -260,7 +260,7 @@ static const Window gUnknown_80DB538 = { NULL }; -static const Window gUnknown_80DB550 = { +static const WindowTemplate gUnknown_80DB550 = { 0x00, 0x01, 0x01, 0x0A, @@ -269,7 +269,7 @@ static const Window gUnknown_80DB550 = { NULL }; -static const Window gUnknown_80DB568 = { +static const WindowTemplate gUnknown_80DB568 = { 0x00, 0x01, 0x04, 0x03, @@ -278,7 +278,7 @@ static const Window gUnknown_80DB568 = { NULL }; -static const Window gUnknown_80DB580 = { +static const WindowTemplate gUnknown_80DB580 = { 0x00, 0x01, 0x01, 0x02, @@ -356,7 +356,7 @@ struct unkStruct_203B1FC u8 *unkF8; u8 unkFC[56]; u8 *unk134; - Windows windows; + WindowTemplates windows; }; extern struct unkStruct_203B1FC *gUnknown_203B1FC; @@ -640,34 +640,34 @@ bool8 sub_8015748(void) void sub_80157D8(void) { - UnkTextStruct1 *txtPtr = &gUnknown_2027370[1]; + Window *window = &gWindows[1]; // Note: for cases 4 and 5, the code is identical except for different position structs. if (gUnknown_203B1FC->unk0 == 4) { s32 x, y; - x = gUnknown_80DAFC0[gUnknown_203B1FC->unk1C].x + (txtPtr->unk0 * 8); + x = gUnknown_80DAFC0[gUnknown_203B1FC->unk1C].x + (window->x * 8); SpriteSetX((SpriteOAM *) &gUnknown_203B1FC->sprite1Attribs, x); - y = gUnknown_80DAFC0[gUnknown_203B1FC->unk1C].y + (txtPtr->unk2 * 8) + 5; + y = gUnknown_80DAFC0[gUnknown_203B1FC->unk1C].y + (window->y * 8) + 5; SpriteSetY((SpriteOAM *) &gUnknown_203B1FC->sprite1Attribs, y); } else if (gUnknown_203B1FC->unk0 == 5) { s32 x, y; - x = gUnknown_80DB098[gUnknown_203B1FC->unk1C].x + (txtPtr->unk0 * 8); + x = gUnknown_80DB098[gUnknown_203B1FC->unk1C].x + (window->x * 8); SpriteSetX((SpriteOAM *) &gUnknown_203B1FC->sprite1Attribs, x); - y = gUnknown_80DB098[gUnknown_203B1FC->unk1C].y + (txtPtr->unk2 * 8) + 5; + y = gUnknown_80DB098[gUnknown_203B1FC->unk1C].y + (window->y * 8) + 5; SpriteSetY((SpriteOAM *) &gUnknown_203B1FC->sprite1Attribs, y); } else { s32 x, y; - x = gUnknown_203B1FC->unk1E[gUnknown_203B1FC->unk1C] + (gUnknown_203B1FC->unk8A[gUnknown_203B1FC->unk1C] / 2) + 30 + (txtPtr->unk0 * 8); + x = gUnknown_203B1FC->unk1E[gUnknown_203B1FC->unk1C] + (gUnknown_203B1FC->unk8A[gUnknown_203B1FC->unk1C] / 2) + 30 + (window->x * 8); SpriteSetX((SpriteOAM *) &gUnknown_203B1FC->sprite1Attribs, (u16) x); - y = (txtPtr->unk2 * 8) + 34; + y = (window->y * 8) + 34; SpriteSetY((SpriteOAM *) &gUnknown_203B1FC->sprite1Attribs, y); } } @@ -675,7 +675,7 @@ void sub_80157D8(void) void sub_80158BC(void) { s32 x, y; - UnkTextStruct1 *txtPtr = &gUnknown_2027370[0]; + Window *window = &gWindows[0]; u32 var; switch (sub_8012AE8()) { @@ -702,8 +702,8 @@ void sub_80158BC(void) gUnknown_203B1FC->unk17 = 8; } - x = gUnknown_80DB0F8[gUnknown_203B1FC->unk19][gUnknown_203B1FC->unk1A].x + (txtPtr->unk0 * 8) - 5; - y = gUnknown_80DB0F8[gUnknown_203B1FC->unk19][gUnknown_203B1FC->unk1A].y + (txtPtr->unk2 * 8) + 1; + x = gUnknown_80DB0F8[gUnknown_203B1FC->unk19][gUnknown_203B1FC->unk1A].x + (window->x * 8) - 5; + y = gUnknown_80DB0F8[gUnknown_203B1FC->unk19][gUnknown_203B1FC->unk1A].y + (window->y * 8) + 1; SpriteSetX((SpriteOAM *) &gUnknown_203B1FC->sprite2Attribs, x); SpriteSetY((SpriteOAM *) &gUnknown_203B1FC->sprite2Attribs, y); } @@ -769,8 +769,8 @@ void sub_8015A08(u32 unused) } } - sub_800792C(0, 0, 0, 0xE0, 0xE); - sub_800792C(0, 0, 0x47, 0xE0, 0xE); + AddUnderScoreHighlight(0, 0, 0, 0xE0, 0xE); + AddUnderScoreHighlight(0, 0, 0x47, 0xE0, 0xE); sub_8007A78(0, 0, 0, 0x48, 0xE); sub_8007A78(0, 0xDF, 0, 0x48, 0xE); sub_80073E0(0); @@ -783,14 +783,14 @@ void sub_8015C1C(void) CallPrepareTextbox_8008C54(1); sub_80073B8(1); if (gUnknown_203B1FC->unk4 != 0) { - sub_800792C(1, 0, 0, 0xE0, 0xE); - sub_800792C(1, 0, 0x37, 0xE0, 0xE); + AddUnderScoreHighlight(1, 0, 0, 0xE0, 0xE); + AddUnderScoreHighlight(1, 0, 0x37, 0xE0, 0xE); sub_8007A78(1, 0, 0, 0x38, 0xE); sub_8007A78(1, 0xDF, 0, 0x38, 0xE); } else { - sub_800792C(1, 0, 0, 0xB0, 0xE); - sub_800792C(1, 0, 0x27, 0xB0, 0xE); + AddUnderScoreHighlight(1, 0, 0, 0xB0, 0xE); + AddUnderScoreHighlight(1, 0, 0x27, 0xB0, 0xE); sub_8007A78(1, 0, 0, 0x28, 0xE); sub_8007A78(1, 0xAF, 0, 0x28, 0xE); } @@ -827,7 +827,7 @@ void sub_8015C1C(void) case 1: case 2: case 3: - sub_80078A4(1, 38, 33, sub_8016028(), 4); + AddDoubleUnderScoreHighlight(1, 38, 33, sub_8016028(), 4); if (sub_8015FEC(gUnknown_203B1FC->unkF8, gUnknown_203B1FC->unk1B) > sub_8016028()) { sprintfStatic(text, _("{COLOR RED}%s{RESET}"), gUnknown_203B1FC->unkF8); } @@ -850,7 +850,7 @@ void sub_8015E10(u8 *a0, s32 a1, s32 _a2) s32 a2 = (s16) _a2; for (i = 0; i < ARRAY_COUNT_INT(gUnknown_80DAFC0); i++) { - sub_80078A4(a1, gUnknown_80DAFC0[i].x, gUnknown_80DAFC0[i].y + 11 + a2, 11, 5); + AddDoubleUnderScoreHighlight(a1, gUnknown_80DAFC0[i].x, gUnknown_80DAFC0[i].y + 11 + a2, 11, 5); } for (i = 0; i < ARRAY_COUNT_INT(gUnknown_80DAFC0) && a0[i] != 0; i++) { @@ -876,7 +876,7 @@ void sub_8015EB4(u8 *a0, s32 a1, s32 _a2) s32 a2 = (s16) _a2; for (i = 0; i < ARRAY_COUNT_INT(gUnknown_80DB098); i++) { - sub_80078A4(a1, gUnknown_80DB098[i].x, gUnknown_80DB098[i].y + 11 + a2, 12, 5); + AddDoubleUnderScoreHighlight(a1, gUnknown_80DB098[i].x, gUnknown_80DB098[i].y + 11 + a2, 12, 5); } for (i = 0; i < ARRAY_COUNT_INT(gUnknown_80DB098) && a0[i] != 0; i++) { diff --git a/src/code_801C8C4.c b/src/code_801C8C4.c index 4500f7b8a..76a38db8c 100644 --- a/src/code_801C8C4.c +++ b/src/code_801C8C4.c @@ -32,7 +32,7 @@ bool8 sub_801C8C4(s32 a0, s32 a1, DungeonPos *a2, u32 a3) sUnknown_203B244->unk4B4.s0.unk38 = &sUnknown_203B244->unk4B4.s0.windows.id[a1]; RestoreUnkTextStruct_8006518(&sUnknown_203B244->unk4B4.s0.windows); sUnknown_203B244->unk4B4.s0.windows.id[sUnknown_203B244->unk4B4.s0.unk34] = sUnknown_80DBE54; - sUnknown_203B244->unk4B4.s0.unk38->unk14 = &sUnknown_203B244->unk4B4.unk9C; + sUnknown_203B244->unk4B4.s0.unk38->header = &sUnknown_203B244->unk4B4.unk9C; if (a2 != NULL) sUnknown_203B244->unk4B4.s0.windows.id[sUnknown_203B244->unk4B4.s0.unk34].pos = *a2; @@ -137,9 +137,9 @@ void sub_801CBB8(void) static void sub_801CC38(void) { - sUnknown_203B244->unk4B4.unk9C.f0 = 1; - sUnknown_203B244->unk4B4.unk9C.f1 = 0; - sUnknown_203B244->unk4B4.unk9C.f2 = 12; + sUnknown_203B244->unk4B4.unk9C.count = 1; + sUnknown_203B244->unk4B4.unk9C.currId = 0; + sUnknown_203B244->unk4B4.unk9C.width = 12; sUnknown_203B244->unk4B4.unk9C.f3 = 0; SUB_80095E4_CALL(sUnknown_203B244->unk4B4.s0); @@ -156,7 +156,7 @@ void sub_801CCD8(void) CallPrepareTextbox_8008C54(sUnknown_203B244->unk4B4.s0.unk34); sub_80073B8(sUnknown_203B244->unk4B4.s0.unk34); PrintStringOnWindow(10, 0, sStorage, sUnknown_203B244->unk4B4.s0.unk34, 0); - sub_8012BC4(sUnknown_203B244->unk4B4.unk9C.f2 * 8 + 4, 0, sUnknown_203B244->unk4B4.s0.input.unk1E + 1, 2, 7, sUnknown_203B244->unk4B4.s0.unk34); + sub_8012BC4(sUnknown_203B244->unk4B4.unk9C.width * 8 + 4, 0, sUnknown_203B244->unk4B4.s0.input.unk1E + 1, 2, 7, sUnknown_203B244->unk4B4.s0.unk34); for(index = 0; index < sUnknown_203B244->unk4B4.s0.input.unk1A; index++) { itemID = sUnknown_203B244->itemIDs[(sUnknown_203B244->unk4B4.s0.input.unk1E * sUnknown_203B244->unk4B4.s0.input.unk1C) + index]; diff --git a/src/code_801D9E4.c b/src/code_801D9E4.c index 7e89b77d7..d3264dbf2 100644 --- a/src/code_801D9E4.c +++ b/src/code_801D9E4.c @@ -26,7 +26,7 @@ bool8 sub_801D9E4(void) sUnknown_203B258->s0.unk38 = &sUnknown_203B258->s0.windows.id[3]; RestoreUnkTextStruct_8006518(&sUnknown_203B258->s0.windows); sUnknown_203B258->s0.windows.id[sUnknown_203B258->s0.unk34] = sUnknown_80DBF88; - sUnknown_203B258->s0.unk38->unk14 = &sUnknown_203B258->unk9C; + sUnknown_203B258->s0.unk38->header = &sUnknown_203B258->unk9C; ResetUnusedInputStruct(); ShowWindows(&sUnknown_203B258->s0.windows, TRUE, TRUE); sub_8013818(&sUnknown_203B258->s0.input, 229, 10, sUnknown_203B258->s0.unk34); @@ -90,9 +90,9 @@ void sub_801DB0C(void) static void sub_801DB54(void) { - sUnknown_203B258->unk9C.f0 = 1; - sUnknown_203B258->unk9C.f1 = 0; - sUnknown_203B258->unk9C.f2 = 8; + sUnknown_203B258->unk9C.count = 1; + sUnknown_203B258->unk9C.currId = 0; + sUnknown_203B258->unk9C.width = 8; sUnknown_203B258->unk9C.f3 = 0; ResetUnusedInputStruct(); @@ -113,7 +113,7 @@ static void sub_801DBD4(void) sub_80073B8(sUnknown_203B258->s0.unk34); PrintStringOnWindow(10, 0, sField, sUnknown_203B258->s0.unk34, 0); // Field - x = (sUnknown_203B258->unk9C.f2 * 8) - 2; + x = (sUnknown_203B258->unk9C.width * 8) - 2; n = sUnknown_203B258->s0.input.unk1E + 1; sub_8012BC4(x, 0, n, 2, 7, sUnknown_203B258->s0.unk34); diff --git a/src/code_801EE10.c b/src/code_801EE10.c index d28889cb4..ce71e75c9 100644 --- a/src/code_801EE10.c +++ b/src/code_801EE10.c @@ -13,7 +13,7 @@ EWRAM_INIT unkStruct_203B270 *gUnknown_203B270 = {NULL}; -const Window gUnknown_80DC240 = { +const WindowTemplate gUnknown_80DC240 = { 0x00, 0x03, 0x00, 0x00, @@ -24,7 +24,7 @@ const Window gUnknown_80DC240 = { const WindowHeader gUnkData_80DC258 = {0x01, 0x00, 0x0F, 0x00}; -const Window gUnknown_80DC25C = { +const WindowTemplate gUnknown_80DC25C = { 0, 6, 0x2, 0x2, @@ -33,7 +33,7 @@ const Window gUnknown_80DC25C = { &gUnkData_80DC258 }; -const Window gUnknown_80DC274 = { +const WindowTemplate gUnknown_80DC274 = { 0, 3, 0x2, 0xF, @@ -320,7 +320,7 @@ void sub_801F280(bool8 param_1) linkChain = MoveFlagLinkChain(move); x = !linkChain ? 0x8 : 0xD; if (!linkChain && i != 0) { - sub_800792C(gUnknown_203B270->unk50,0xc,y - 2,0x78,7); + AddUnderScoreHighlight(gUnknown_203B270->unk50,0xc,y - 2,0x78,7); } PrintFormattedStringOnWindow(x,y,gUnknown_80DC2A0,gUnknown_203B270->unk50,0); // {ARG_MOVE_ITEM_0} } diff --git a/src/code_801F428.c b/src/code_801F428.c index 00a688777..8cef24760 100644 --- a/src/code_801F428.c +++ b/src/code_801F428.c @@ -20,7 +20,7 @@ struct unkStruct_203B274 }; EWRAM_INIT struct unkStruct_203B274 *gUnknown_203B274 = {NULL}; -static const Window sUnknown_80DC2AC = { +static const WindowTemplate sUnknown_80DC2AC = { 0, 3, 0, 0, @@ -28,7 +28,7 @@ static const Window sUnknown_80DC2AC = { 0, 0, NULL }; -static const Window sUnknown_80DC2C4 = { +static const WindowTemplate sUnknown_80DC2C4 = { 0, 6, 2, 2, @@ -55,10 +55,10 @@ bool8 sub_801F428(s16 index, s32 param_2) gUnknown_203B274->s348.s0.unk38 = &gUnknown_203B274->s348.s0.windows.id[gUnknown_203B274->s348.s0.unk34]; RestoreUnkTextStruct_8006518(&gUnknown_203B274->s348.s0.windows); gUnknown_203B274->s348.s0.windows.id[gUnknown_203B274->s348.s0.unk34] = sUnknown_80DC2C4; - gUnknown_203B274->s348.s0.unk38->unk14 = &gUnknown_203B274->s348.unk9C; - gUnknown_203B274->s348.unk9C.f0 = 1; - gUnknown_203B274->s348.unk9C.f1 = 0; - gUnknown_203B274->s348.unk9C.f2 = 0xC; + gUnknown_203B274->s348.s0.unk38->header = &gUnknown_203B274->s348.unk9C; + gUnknown_203B274->s348.unk9C.count = 1; + gUnknown_203B274->s348.unk9C.currId = 0; + gUnknown_203B274->s348.unk9C.width = 0xC; gUnknown_203B274->s348.unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B274->s348.s0.windows, TRUE, TRUE); diff --git a/src/code_801F808.c b/src/code_801F808.c index b08b685ed..8e68b93e4 100644 --- a/src/code_801F808.c +++ b/src/code_801F808.c @@ -23,15 +23,15 @@ struct unkStruct_203B278 u32 unk24; MenuInputStruct unk28; u32 unk5C; - Window *unk60; - Windows windows; + WindowTemplate *unk60; + WindowTemplates windows; WindowHeader unkC4; MenuInputStructSub unkC8; }; EWRAM_INIT struct unkStruct_203B278 *gUnknown_203B278 = {NULL}; -static const Window sUnknown_80DC2F8 = { +static const WindowTemplate sUnknown_80DC2F8 = { 0, 3, 0, 0, @@ -114,10 +114,10 @@ void sub_801F930(void) switch(gUnknown_203B278->state) { case 0: - gUnknown_203B278->unk60->unk14 = &gUnknown_203B278->unkC4; - gUnknown_203B278->unkC4.f0 = gUnknown_203B278->unk28.unk20; - gUnknown_203B278->unkC4.f1 = gUnknown_203B278->unk28.unk1E; - gUnknown_203B278->unkC4.f2 = 0x10; + gUnknown_203B278->unk60->header = &gUnknown_203B278->unkC4; + gUnknown_203B278->unkC4.count = gUnknown_203B278->unk28.unk20; + gUnknown_203B278->unkC4.currId = gUnknown_203B278->unk28.unk1E; + gUnknown_203B278->unkC4.width = 0x10; gUnknown_203B278->unkC4.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B278->windows, TRUE, TRUE); diff --git a/src/code_8023144.c b/src/code_8023144.c index fdb680ae2..b48f81678 100644 --- a/src/code_8023144.c +++ b/src/code_8023144.c @@ -51,7 +51,7 @@ bool8 sub_8023144(s32 a0, s32 index, DungeonPos *sub, u32 a3) RestoreUnkTextStruct_8006518(&gUnknown_3001B5C->s35C.s0.windows); gUnknown_3001B5C->s35C.s0.windows.id[gUnknown_3001B5C->s35C.s0.unk34] = sUnknown_80DC91C; - gUnknown_3001B5C->s35C.s0.unk38->unk14 = &gUnknown_3001B5C->s35C.unk9C; + gUnknown_3001B5C->s35C.s0.unk38->header = &gUnknown_3001B5C->s35C.unk9C; if (sub != NULL) gUnknown_3001B5C->s35C.s0.windows.id[gUnknown_3001B5C->s35C.s0.unk34].pos = *sub; @@ -137,9 +137,9 @@ void sub_80233A0(void) static void sub_8023420(void) { - gUnknown_3001B5C->s35C.unk9C.f0 = 1; - gUnknown_3001B5C->s35C.unk9C.f1 = 0; - gUnknown_3001B5C->s35C.unk9C.f2 = 12; + gUnknown_3001B5C->s35C.unk9C.count = 1; + gUnknown_3001B5C->s35C.unk9C.currId = 0; + gUnknown_3001B5C->s35C.unk9C.width = 12; gUnknown_3001B5C->s35C.unk9C.f3 = 0; SUB_80095E4_CALL_2(gUnknown_3001B5C->s35C.s0); @@ -162,7 +162,7 @@ static void sub_80234BC(void) sub_80073B8(gUnknown_3001B5C->s35C.s0.unk34); PrintStringOnWindow(10, 0, sPokemon, gUnknown_3001B5C->s35C.s0.unk34, 0); - sub_8012BC4((gUnknown_3001B5C->s35C.unk9C.f2 * 8) + 4, 0, gUnknown_3001B5C->s35C.s0.input.unk1E + 1, 2, 7, gUnknown_3001B5C->s35C.s0.unk34); + sub_8012BC4((gUnknown_3001B5C->s35C.unk9C.width * 8) + 4, 0, gUnknown_3001B5C->s35C.s0.input.unk1E + 1, 2, 7, gUnknown_3001B5C->s35C.s0.unk34); for (i = 0; i < gUnknown_3001B5C->s35C.s0.input.unk1A; i++) { y = GetMenuEntryYCoord(&gUnknown_3001B5C->s35C.s0.input, i); diff --git a/src/code_8024458.c b/src/code_8024458.c index de31fef05..3b59376a8 100644 --- a/src/code_8024458.c +++ b/src/code_8024458.c @@ -29,8 +29,8 @@ bool8 sub_8024458(s16 speciesNum, s32 a1) sUnknown_203B2AC->unkE4 = &sUnknown_203B2AC->unkE8.id[a1]; RestoreUnkTextStruct_8006518(&sUnknown_203B2AC->unkE8); sUnknown_203B2AC->unkE8.id[sUnknown_203B2AC->unkE0] = sUnknown_80DC9C8; - sUnknown_203B2AC->unkE4->unk14 = &sUnknown_203B2AC->unk148; - sUnknown_203B2AC->unk148.f2 = 10; + sUnknown_203B2AC->unkE4->header = &sUnknown_203B2AC->unk148; + sUnknown_203B2AC->unk148.width = 10; sub_8024604(); sub_802452C(); sub_8013984(&sUnknown_203B2AC->input); @@ -74,8 +74,8 @@ void sub_802453C(void) static void sub_8024588(void) { - sUnknown_203B2AC->unk148.f0 = sUnknown_203B2AC->input.unk20; - sUnknown_203B2AC->unk148.f1 = sUnknown_203B2AC->input.unk1E; + sUnknown_203B2AC->unk148.count = sUnknown_203B2AC->input.unk20; + sUnknown_203B2AC->unk148.currId = sUnknown_203B2AC->input.unk1E; sUnknown_203B2AC->unk148.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&sUnknown_203B2AC->unkE8, TRUE, TRUE); diff --git a/src/code_8031D70.c b/src/code_8031D70.c index 27dfee0a1..987c8e593 100644 --- a/src/code_8031D70.c +++ b/src/code_8031D70.c @@ -18,15 +18,15 @@ struct unkStruct_203B334 u32 mailIndex; MenuInputStructSub unk4; u32 unk10; - Window *unk14; - Windows unk18; + WindowTemplate *unk14; + WindowTemplates unk18; u8 unk78[4]; }; EWRAM_INIT struct unkStruct_203B334 *gUnknown_203B334 = {NULL}; extern unkStruct_203B480 *gUnknown_203B480; -const Window gUnknown_80E1FA8 = { +const WindowTemplate gUnknown_80E1FA8 = { 0, 3, 0x0, 0x0, @@ -37,7 +37,7 @@ const Window gUnknown_80E1FA8 = { const WindowHeader gUnkData_80E1FC0 = {0x01, 0x00, 0x0A, 0x00}; -const Window gUnknown_80E1FC4 = { +const WindowTemplate gUnknown_80E1FC4 = { 0, 6, 0x2, 0x2, @@ -170,7 +170,7 @@ void DrawSOSPasswordScreen(void) rowIndex = index % 0x12; x = rowIndex * 0xb + 6; sub_8012C60(x,y,buffer[index],color,gUnknown_203B334->unk10); // Draw character - sub_80078A4(gUnknown_203B334->unk10,x,y + 0xA,10,COLOR_CYAN); // Draw underscore beneath character + AddDoubleUnderScoreHighlight(gUnknown_203B334->unk10,x,y + 0xA,10,COLOR_CYAN); // Draw underscore beneath character } sub_80073E0(gUnknown_203B334->unk10); } diff --git a/src/code_803D110.c b/src/code_803D110.c index 82a23f61f..95e2d54d0 100644 --- a/src/code_803D110.c +++ b/src/code_803D110.c @@ -319,7 +319,7 @@ void ShowDungeonNameBanner(void) } CloseFile(gDungeonNameBannerFontFile); - sub_803E46C(2); + DungeonRunFrameActions(2); } s32 sub_803DC14(const u8 *dungName, s32 strWidth, s32 a2) diff --git a/src/code_803E46C.c b/src/code_803E46C.c index ce548ed02..c1cf6c4dc 100644 --- a/src/code_803E46C.c +++ b/src/code_803E46C.c @@ -20,7 +20,7 @@ EWRAM_INIT u8 gUnknown_203B40C = 0; EWRAM_INIT u8 gUnknown_203B40D = 0; extern s32 gDungeonBrightness; -extern s32 gUnknown_202EDCC; +extern s32 gDungeonFramesCounter; extern u32 gUnknown_202EDD0; extern s32 gUnknown_202EDD4; @@ -40,7 +40,7 @@ void sub_800F7D0(DungeonPos *); void sub_803E874(s32, s32); void sub_803EAF0(s32, s32); -void sub_803E46C(u32 a0) +void DungeonRunFrameActions(u32 a0) { if (gUnknown_203B40C != 0) sub_803E490(a0); @@ -92,7 +92,7 @@ void sub_803E490(u32 unused) nullsub_12(); sub_80060EC(); - gUnknown_202EDCC++; + gDungeonFramesCounter++; IncrementPlayTime(gPlayTimeRef); sub_800CB20(); @@ -125,7 +125,7 @@ void sub_803E668(u32 unused) nullsub_12(); sub_8005838(NULL, 0); sub_80060EC(); - gUnknown_202EDCC++; + gDungeonFramesCounter++; IncrementPlayTime(gPlayTimeRef); sub_800CB20(); LoadBufferedInputs(); @@ -147,7 +147,7 @@ void sub_803E668(u32 unused) void sub_803E708(s32 a0, u32 a1) { while (a0 != 0) { - sub_803E46C(a1); + DungeonRunFrameActions(a1); a0--; } } @@ -156,7 +156,7 @@ void sub_803E724(s32 r0) { do { - sub_803E46C(r0); + DungeonRunFrameActions(r0); } while (gRealInputs.held & 0xF0); } @@ -187,7 +187,7 @@ void sub_803E748(void) { if(gDungeonBrightness <= 0x1E) gDungeonBrightness++; sub_803E874(1, index2); - sub_803E46C(5); + DungeonRunFrameActions(5); } gUnknown_203B40D = 0; gDungeonBrightness = 0x1F; @@ -203,7 +203,7 @@ void sub_803E7C8(void) gUnknown_203B40D = 1; gDungeonBrightness = 0; - sub_803E46C(5); + DungeonRunFrameActions(5); for(index1 = 0; index1 < 0x2C; index1++) { @@ -218,7 +218,7 @@ void sub_803E7C8(void) gDungeon->unk181e8.unk18217 = index2; } } - sub_803E46C(5); + DungeonRunFrameActions(5); } gUnknown_203B40D = 0; } @@ -231,7 +231,7 @@ void sub_803E830(void) for(index = 0; index < 0x20; index++) { sub_803E874(0, 0); - sub_803E46C(5); + DungeonRunFrameActions(5); if(gDungeonBrightness > 0) gDungeonBrightness--; } diff --git a/src/code_803E724.c b/src/code_803E724.c index af6f25b51..04e65a7ed 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -42,7 +42,7 @@ extern struct DungeonPalFile *gDungeonNameBannerPalette; extern struct DungeonPalFile *gUnknown_202EC94; extern RGB gUnknown_202ECA4[]; extern u8 gUnknown_203B40C; -extern MenuInputStruct gUnknown_202EE10; +extern MenuInputStruct gDungeonMenu; extern SpriteOAM gUnknown_202EDDC; extern const u32 gUnknown_80F6490[]; @@ -54,10 +54,9 @@ extern const u16 gUnknown_80F6544[][9]; extern u8 gUnknown_20274A5; -extern s32 gUnknown_202EDCC; +extern s32 gDungeonFramesCounter; -extern void ShowWholeRevealedDungeonMap(); -extern void sub_8083D44(void); +extern void PlayDungeonStartButtonSE(void); extern void ShowWholeRevealedDungeonMap(void); extern void sub_80400D4(void); extern void sub_8041888(u8 param_1); @@ -174,7 +173,7 @@ void sub_803EA10(void) SetBGPaletteBufferColorRGB(248, &gFontPalette[8], gDungeonBrightness, NULL); } -static const struct Windows gUnknown_80F62B0 = +static const struct WindowTemplates gUnknown_80F62B0 = { .id = { [0] = { @@ -184,7 +183,7 @@ static const struct Windows gUnknown_80F62B0 = .height = 5, .unk10 = 7, .unk12 = 0, - .unk14 = NULL, + .header = NULL, }, [1] = WINDOW_DUMMY, [2] = WINDOW_DUMMY, @@ -192,7 +191,7 @@ static const struct Windows gUnknown_80F62B0 = } }; -static const struct Windows gUnknown_80F6310 = +static const struct WindowTemplates gUnknown_80F6310 = { .id = { [0] = { @@ -202,7 +201,7 @@ static const struct Windows gUnknown_80F6310 = .height = 7, .unk10 = 7, .unk12 = 0, - .unk14 = NULL, + .header = NULL, }, [1] = WINDOW_DUMMY, [2] = WINDOW_DUMMY, @@ -210,7 +209,7 @@ static const struct Windows gUnknown_80F6310 = } }; -static const struct Windows gUnknown_80F6370 = +static const struct WindowTemplates gUnknown_80F6370 = { .id = { [0] = { @@ -220,7 +219,7 @@ static const struct Windows gUnknown_80F6370 = .height = 7, .unk10 = 7, .unk12 = 0, - .unk14 = NULL, + .header = NULL, }, [1] = { .type = WINDOW_TYPE_NORMAL, @@ -229,7 +228,7 @@ static const struct Windows gUnknown_80F6370 = .height = 2, .unk10 = 2, .unk12 = 0, - .unk14 = NULL, + .header = NULL, }, [2] = { .type = WINDOW_TYPE_NORMAL, @@ -238,13 +237,13 @@ static const struct Windows gUnknown_80F6370 = .height = 6, .unk10 = 6, .unk12 = 0, - .unk14 = NULL, + .header = NULL, }, [3] = WINDOW_DUMMY, } }; -static const struct Windows gUnknown_80F63D0 = +static const struct WindowTemplates gUnknown_80F63D0 = { .id = { [0] = { @@ -254,7 +253,7 @@ static const struct Windows gUnknown_80F63D0 = .height = 14, .unk10 = 18, .unk12 = 2, - .unk14 = NULL, + .header = NULL, }, [1] = WINDOW_DUMMY, [2] = WINDOW_DUMMY, @@ -321,7 +320,7 @@ void sub_803EAF0(u32 a0, u8 *a1) break; case 8: if (gUnknown_203B40C != 0) { - sub_8083D44(); + PlayDungeonStartButtonSE(); sub_8052210(0); } CreateConfirmNameMenu(2, a1); @@ -329,13 +328,13 @@ void sub_803EAF0(u32 a0, u8 *a1) case 9: if (gUnknown_203B40C != 0) { sub_8052210(0); - sub_8083D44(); + PlayDungeonStartButtonSE(); } ResetUnusedInputStruct(); ShowWindows(&gUnknown_80F63D0, FALSE, TRUE); break; case 10: - sub_8083D44(); + PlayDungeonStartButtonSE(); break; case 150: // Dummy case put here to match, any value >= 150 works break; @@ -346,15 +345,15 @@ void sub_803EAF0(u32 a0, u8 *a1) void sub_803EC94(void) { - gUnknown_202EE10.unk1E = 0; - gUnknown_202EE10.unk20 = 0; - gUnknown_202EE10.unkC = 0; - gUnknown_202EE10.unkE = 0; - gUnknown_202EE10.unk14.x = 0; - sub_801317C(&gUnknown_202EE10.unk28); + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + sub_801317C(&gDungeonMenu.unk28); } -void sub_803ECB4(Windows *a0, bool8 a1) +void DungeonShowWindows(WindowTemplates *a0, bool8 a1) { gUnknown_202EDD0 = 10; sub_8052210(0); @@ -383,7 +382,7 @@ void sub_803ED30(s32 a0, Entity *mon, u8 a2, s32 a3) for (i = 0; i < 20; i++) { if (gUnknown_202EDE8.unk0 == 0) break; - sub_803E46C(0x29); + DungeonRunFrameActions(0x29); } var = sub_803EF90(a0, a2); @@ -687,8 +686,8 @@ void sub_803F27C(bool8 a0) strPtr->priority = 3; strPtr->unk1821A = 0; strPtr->unk18212 = 0; - strPtr->unk1821B = 0; - strPtr->unk1821C = 0; + strPtr->rotateModeDirection = 0; + strPtr->prevRotateModeDirection = 0; strPtr->inFloorMapMode = 0; strPtr->unk18215 = 1; sub_803F38C(); @@ -1098,14 +1097,14 @@ void sub_803FB74(void) hungry = TRUE; } - if (lowHp && (gUnknown_202EDCC & 16) != 0) { + if (lowHp && (gDungeonFramesCounter & 16) != 0) { r5 = 32, r6 = 32; } else { r5 = 0, r6 = 0; } - if (hungry && (gUnknown_202EDCC & 16) != 0) { + if (hungry && (gDungeonFramesCounter & 16) != 0) { r5 = 48, r6 = 48; } diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 89db6cfbf..7fc3c1646 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -32,7 +32,7 @@ extern void sub_800569C(DungeonPos *, axdata *, u8); extern void sub_800EEC8(u16 r0); extern void sub_800EF64(void); extern void sub_8042DD4(s32 a0, Entity *a1, s32 a2); -extern void sub_803E46C(u32); +extern void DungeonRunFrameActions(u32); extern u8 sub_800EA44(s32 species, u16 a2); extern s32 sub_800E790(s32 species, u16 a2); extern void sub_806CDD4(Entity *entity, u8, u32 direction); @@ -116,7 +116,7 @@ static void sub_8040C4C(Entity *entity, Move *move, bool32 a2) sub_8041500(&sp); sub_800EEC8(r9); sub_800EF64(); - sub_803E46C(0x58); + DungeonRunFrameActions(0x58); r4 = sub_800EA84(&sp); sub_8042DD4(r4, entity, 5); savedUnkVar = gUnknown_203B40D; @@ -139,7 +139,7 @@ static void sub_8040C4C(Entity *entity, Move *move, bool32 a2) r8 = FALSE; } sub_803EA10(); - sub_803E46C(0x26); + DungeonRunFrameActions(0x26); } gUnknown_203B40D = savedUnkVar; } @@ -225,7 +225,7 @@ void sub_8040DA0(Entity *entity, Move *move) for (i = 0; i < 120; i++) { u32 unk; - sub_803E46C(0x59); + DungeonRunFrameActions(0x59); unk = entity->axObj.axdata.sub1.unk10; if (var_24 == 9) { unk |= 2; @@ -280,7 +280,7 @@ static void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move sub_8041500(a0); sub_800EEF8(r4); sub_800EF64(); - sub_803E46C(0x5A); + DungeonRunFrameActions(0x5A); sub_8042DD4(sub_800E52C(a0), entity, 1); } } @@ -346,12 +346,12 @@ void sub_8041168(Entity *entity, Entity *entity2, Move *move, DungeonPos *pos) sub_800EEE0(r10); sub_800EF64(); var3 = sub_800EBC8(&sp); - sub_803E46C(0x5B); + DungeonRunFrameActions(0x5B); sub_8042DD4(var3, entity2, 6); while (1) { if (!sub_800E9A8(var3)) break; - sub_803E46C(0x28); + DungeonRunFrameActions(0x28); } } @@ -479,7 +479,7 @@ static bool8 sub_80414C0(Entity *entity, Move *move) static void sub_8041500(struct UnkStruct_8040094 *a0) { if (sub_800E7D0(a0)) { - sub_803E46C(0x5C); + DungeonRunFrameActions(0x5C); sub_8052740(0x5D); } } diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index f100b085d..267899ace 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -116,7 +116,7 @@ s32 sub_8041550(Entity *entity, s32 a1, u8 a2, u8 a3, s32 a4, u8 a5) if (!sub_800E9A8(r4)) { break; } - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); } r4 = -1; } @@ -155,7 +155,7 @@ s32 sub_80416E0(PixelPos *pos, u32 param_2, bool8 param_3) if (param_3) { counter = 0; while ((counter < 100 && (sub_800E9A8(ret)))) { - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); counter++; } ret = -1; @@ -168,7 +168,7 @@ u32 sub_8041764(unkStruct_80416E0 *param_1, bool8 param_2) sub_800EE5C(param_1->unk0); sub_800EF64(); if(param_2) - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); return sub_800E890(param_1); } @@ -181,11 +181,11 @@ void sub_804178C(u8 param_1) gDungeon->unk181e8.unk18204 = 0; if (sub_800E9FC(param_1) != 0) { while ((counter < 1000 && (sub_800E9FC(param_1) != 0))) { - sub_803E46C(0x4a); + DungeonRunFrameActions(0x4a); counter++; } - sub_803E46C(0x4a); - sub_803E46C(0x4a); + DungeonRunFrameActions(0x4a); + DungeonRunFrameActions(0x4a); } if ((counter == 1000) || (param_1 != 0)) { sub_800DBBC(); @@ -205,7 +205,7 @@ void sub_804178C(u8 param_1) gDungeonBrightness = 0x1f; } sub_803EA10(); - sub_803E46C(0x4a); + DungeonRunFrameActions(0x4a); if(gDungeonBrightness == 0x1f) break; }; gUnknown_2026E4E = 0x808; @@ -1011,7 +1011,7 @@ void sub_804225C(Entity *entity, DungeonPos *pos, u8 trapId) } for (i = 0; i < 1000; i++) { - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); if (!sub_800E9A8(uVar6)) break; } diff --git a/src/code_804267C.c b/src/code_804267C.c index 84ab5fd1c..57c523a34 100644 --- a/src/code_804267C.c +++ b/src/code_804267C.c @@ -60,7 +60,7 @@ void sub_8042390(Entity *entity, Item *item) sub_8005700(asStack_24,&entity->axObj); uVar6 = sub_800E49C(id,&local_14,asStack_24,0,sVar1); for (counter = 0; counter < 1000; counter++) { - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); if (!sub_800E9A8(uVar6)) { break; } @@ -88,7 +88,7 @@ void sub_804245C(Entity *entity, Item *item) sub_8005700(asStack_24,&entity->axObj); uVar6 = sub_800E49C(id,&local_14,asStack_24,1,sVar1); for (counter = 0; counter < 1000; counter++) { - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); if (!sub_800E9A8(uVar6)) { break; } @@ -128,7 +128,7 @@ s32 sub_8042520(Entity *a0) for (i = 0; i < 6; i++) { sub_800E8AC(uVar4, &pos, 0, iVar8, 0); - sub_803E46C(66); + DungeonRunFrameActions(66); pos.x += gAdjacentTileOffsets[dir].x * 4; pos.y += gAdjacentTileOffsets[dir].y * 4; iVar8 = (pos.y - gDungeon->unk181e8.cameraPixelPos.y) / 2; @@ -179,7 +179,7 @@ void sub_80426C8(u32 a0, u32 a1) sub_8042B34(a0, a1, 0x80); while (sub_8042CC0()) - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); sub_8042D7C(); LoadDungeonMapPalette(); @@ -192,7 +192,7 @@ void sub_8042730(Entity *a0, void *unused) sub_806CDD4(a0, 8, 8); for (i = 0; i < 100; i++) { - sub_803E46C(0x51); + DungeonRunFrameActions(0x51); if ((a0->axObj.axdata.sub1.unk10 & 3) != 0 || a0->axObj.unk43_animId2 != 8) break; } @@ -406,7 +406,7 @@ void sub_8042A84(s16 param_1, Entity *entity, u32 param_3) sub_803E708(param_3,0x42); do { if (entity->unk1C.raw > IntToF248_2(199.999).raw) break; - sub_803E46C(0x42); + DungeonRunFrameActions(0x42); entity->unk1C.raw += + r6; r6 += IntToF248_2(1).raw; iVar3 = (entity->pixelPos.y - entity->unk1C.raw) / 256; diff --git a/src/code_8042B34.c b/src/code_8042B34.c index d76bfeea6..3ada0f3ae 100644 --- a/src/code_8042B34.c +++ b/src/code_8042B34.c @@ -86,7 +86,7 @@ void sub_8042B34(s32 a0, s32 a1, s32 a2) sUnknown_203B414->unk8 = (a1 + 1) * 4; sub_800EE5C(gUnknown_80F6624[a0][0].unk0); sub_800EF64(); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); sUnknown_203B414->unk4 = a2; for (i = 0; i < sUnknown_203B414->unk8; i++) { s32 rnd; @@ -402,7 +402,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) gDungeon->unk644.unk55 = 0; gDungeon->unk644.unk18 = r8->unk9; gDungeon->unk644.unk16 = r8->unkC; - gDungeon->unk644.unk14 = r8->unkA; + gDungeon->unk644.canRecruit = r8->unkA; gDungeon->unk644.unk15 = r8->unkB; gDungeon->unk644.unk17 = r8->unkD; gDungeon->unk644.unk19 = r8->unkE; diff --git a/src/code_8044CC8.c b/src/code_8044CC8.c index 1de1a7fde..ee4717edc 100644 --- a/src/code_8044CC8.c +++ b/src/code_8044CC8.c @@ -2,6 +2,7 @@ #include "constants/dungeon_action.h" #include "dungeon_map_access.h" #include "dungeon_util.h" +#include "dungeon_generation.h" #include "code_8044CC8.h" #include "items.h" @@ -15,15 +16,15 @@ typedef struct ItemText // size: 0x8 typedef struct unkStr_80F7C54 { - u32 unk0; + s32 unk0; u8 *text; } unkStr_80F7C54; -EWRAM_DATA unkStruct_202EE44 gUnknown_202EE44[10] = {0}; +EWRAM_DATA unkStruct_202EE44 gDungeonSubMenu[10] = {0}; -extern s32 gUnknown_202EE6C; +extern s32 gDungeonSubMenuItemsCount; extern const ItemText gActions[]; extern u16 gUnknown_80F6964[NUM_ITEM_CATEGORIES]; @@ -159,79 +160,70 @@ void sub_8044E24(Entity *entity,int index,u32 unused) } // Similar to sub_8044BA8 -u8 *sub_8044EC8(s32 param_1) +u8 *GetDungeonSubMenuItemString(s32 param_1) { - u16 uVar1; - u32 uVar3; - u32 uVar4; + u16 actionId = gDungeonSubMenu[param_1].actionId; - uVar1 = gUnknown_202EE44[param_1].unk0; - - if ((uVar1 == 0x26) && (GetFloorType() == 2)) { + if (actionId == ACTION_STAIRS && GetFloorType() == FLOOR_TYPE_RESCUE) { return *gUnknown_80F91EC; } else { - uVar3 = uVar4 = strcmp(gUnknown_80F7C50[uVar1 << 1], gUnknown_80F697C); - if (uVar3 != 0) { - uVar4 = 1; + if (!AreStringsDifferent(gUnknown_80F7C50[actionId << 1], gUnknown_80F697C)) { + return gActions[GetItemActionType(gDungeonSubMenu[param_1].unk2)].useText; } - if ((u8)(uVar4) == 0) { - return gActions[GetItemActionType(gUnknown_202EE44[param_1].unk2)].useText; - } - else - { - return gUnknown_80F7C50[uVar1 << 1]; + else { + return gUnknown_80F7C50[actionId << 1]; } } } -bool8 sub_8044F3C(s32 param_1) +bool8 CanSubMenuItemBeChosen(s32 itemId) { - if(param_1 < 0) + if (itemId < 0) return FALSE; else - return gUnknown_202EE44[param_1].unk3; + return gDungeonSubMenu[itemId].canBeChosen; } -void sub_8044F5C(u16 param_1, u8 param_2) +void AddActionToDungeonSubMenu(u16 actionId, u8 param_2) { int index; - if (gUnknown_202EE6C < 10) { - for(index = 0; index < gUnknown_202EE6C; index++) + if (gDungeonSubMenuItemsCount < 10) { + for(index = 0; index < gDungeonSubMenuItemsCount; index++) { - if (gUnknown_202EE44[index].unk0 == param_1) { + if (gDungeonSubMenu[index].actionId == actionId) { return; } } - gUnknown_202EE44[gUnknown_202EE6C].unk0 = param_1; - gUnknown_202EE44[gUnknown_202EE6C].unk2 = param_2; - gUnknown_202EE44[gUnknown_202EE6C].unk3 = TRUE; - gUnknown_202EE6C++; + gDungeonSubMenu[gDungeonSubMenuItemsCount].actionId = actionId; + gDungeonSubMenu[gDungeonSubMenuItemsCount].unk2 = param_2; + gDungeonSubMenu[gDungeonSubMenuItemsCount].canBeChosen = TRUE; + gDungeonSubMenuItemsCount++; } } -s32 sub_8044FB4(u16 param_1) +s32 ActionToDungeonSubMenuId(u16 actionId) { int index; - for(index = 0; index < gUnknown_202EE6C; index++) + for(index = 0; index < gDungeonSubMenuItemsCount; index++) { - if (gUnknown_202EE44[index].unk0 == param_1) { + if (gDungeonSubMenu[index].actionId == actionId) { return index; } } return -1; } -void sub_8044FF0(u16 param_1) +void SetActionUnusableInDungeonSubMenu(u16 actionId) { int index; - for(index = 0; index < gUnknown_202EE6C; index++) + for(index = 0; index < gDungeonSubMenuItemsCount; index++) { - if (gUnknown_202EE44[index].unk0 == param_1) { - gUnknown_202EE44[index].unk3 = FALSE; + if (gDungeonSubMenu[index].actionId == actionId) { + gDungeonSubMenu[index].canBeChosen = FALSE; return; } } @@ -263,20 +255,16 @@ bool8 IsNotAttacking(Entity *param_1, bool8 param_2) void sub_8045064(void) { - s32 i; - s32 j; - unkStruct_202EE44 *iPtr; - unkStruct_202EE44 *jPtr; - unkStruct_202EE44 temp; + s32 i, j; - for (i = 0; i < gUnknown_202EE6C; i++) { - for (j = i + 1; j < gUnknown_202EE6C; j++) { - iPtr = &gUnknown_202EE44[i]; - jPtr = &gUnknown_202EE44[j]; - if ((s32)gUnknown_80F7C54[iPtr->unk0].unk0 > (s32)gUnknown_80F7C54[jPtr->unk0].unk0) { - temp = *iPtr; - *iPtr = *jPtr; - *jPtr = temp; + for (i = 0; i < gDungeonSubMenuItemsCount; i++) { + for (j = i + 1; j < gDungeonSubMenuItemsCount; j++) { + unkStruct_202EE44 temp; + unkStruct_202EE44 *iPtr = &gDungeonSubMenu[i]; + unkStruct_202EE44 *jPtr = &gDungeonSubMenu[j]; + + if (gUnknown_80F7C54[iPtr->actionId].unk0 > gUnknown_80F7C54[jPtr->actionId].unk0) { + SWAP(*iPtr, *jPtr, temp); } } } diff --git a/src/code_8048480.c b/src/code_8048480.c index 954771ce3..7ac03bd5f 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -27,6 +27,8 @@ #include "structs/str_dungeon.h" #include "structs/str_position.h" #include "dungeon_config.h" +#include "dungeon_menu_team.h" +#include "dungeon_menu_moves.h" extern s16 gTypeGummiIQBoost[NUM_TYPES][NUMBER_OF_GUMMIS]; @@ -68,16 +70,11 @@ extern void sub_8078B5C(Entity *, Entity *, u32, u32, u32); extern u8 sub_806A538(s32); extern void sub_8051E7C(Entity *pokemon); extern void sub_8045BF8(u8 *, Item *); -extern void sub_8063B54(ActionContainer *); -extern void sub_80637E8(ActionContainer *); -extern void sub_8063BB4(ActionContainer *); -extern void sub_8063CF0(ActionContainer *, u32); -extern void sub_8063A70(ActionContainer *, u32); -extern u8 sub_8062F90(Entity *, u32, u32, u32, u32); +extern void ActionShowMoveInfo(ActionContainer *); +extern void ActionLinkMoves(ActionContainer *); extern void sub_8044DF0(Entity *, u32, u32); extern void sub_803EAF0(u32, u32); -extern void sub_8044C10(bool8); -Entity *DrawFieldGiveItemMenu(u32, u32); +extern void SetLeaderActionToNothing(bool8); extern void sub_8044E24(Entity *, u32, u32); extern void sub_804245C(Entity *, Item *); extern u8 sub_8072938(Entity *, u16); @@ -813,7 +810,7 @@ bool8 sub_8048950(Entity *param_1,Item *item) entityInfo->unk157 = flag; } } - entity2 = DrawFieldGiveItemMenu(0,1); + entity2 = ShowDungeonToWhichMonMenu(NULL,WHICH_MENU_MOVES); if (!EntityIsValid(entity2)) { return FALSE; } @@ -878,7 +875,7 @@ bool8 sub_8048A68(Entity *param_1,Item *item) pEVar6->unk157 = flag; } } - entity2 = DrawFieldGiveItemMenu(0,1); + entity2 = ShowDungeonToWhichMonMenu(NULL,WHICH_MENU_MOVES); if (!EntityIsValid(entity2)) { return FALSE; } @@ -924,7 +921,7 @@ bool8 sub_8048B9C(Entity *entity, Item *item) } } - entity2 = DrawFieldGiveItemMenu(0,1); + entity2 = ShowDungeonToWhichMonMenu(NULL,WHICH_MENU_MOVES); if (!EntityIsValid(entity2)) { return FALSE; } @@ -932,32 +929,32 @@ bool8 sub_8048B9C(Entity *entity, Item *item) originalAction = *entityActionPtr; goto LOOP_MIDDLE; // Needed to match while (1) { - if (entityActionPtr->action == ACTION_UNK1D) { - sub_80637E8(entityActionPtr); + if (entityActionPtr->action == ACTION_MOVE_INFO) { + ActionShowMoveInfo(entityActionPtr); } - else if (entityActionPtr->action == ACTION_UNK20) { + else if (entityActionPtr->action == ACTION_LINK_MOVES) { sub_803EAF0(0,0); - sub_8063BB4(entityActionPtr); - sub_8044C10(TRUE); + ActionLinkMoves(entityActionPtr); + SetLeaderActionToNothing(TRUE); ret = TRUE; } - else if (entityActionPtr->action == ACTION_UNK21) { + else if (entityActionPtr->action == ACTION_DELINK_MOVES) { sub_803EAF0(0,0); - sub_8063CF0(entityActionPtr,0); - sub_8044C10(TRUE); + ActionDelinkMoves(entityActionPtr,0); + SetLeaderActionToNothing(TRUE); } else if ((entityActionPtr->action == ACTION_SET_MOVE) || (entityActionPtr->action == ACTION_UNSET_MOVE)) { sub_803EAF0(0,0); - sub_8063A70(entityActionPtr,0); + ActionSetOrUnsetMove(entityActionPtr, FALSE); } - else if (entityActionPtr->action == ACTION_UNK1F) { + else if (entityActionPtr->action == ACTION_SWITCH_AI_MOVE) { sub_803EAF0(0,0); - sub_8063B54(entityActionPtr); + ActionToggleMoveUsableForAi(entityActionPtr); } LOOP_MIDDLE: ClearMonsterActionFields(entityActionPtr); - if (sub_8062F90(entity2,1,0,0,1) != 0) { + if (ShowDungeonMovesMenu(entity2,1,0,0,1) != 0) { if (ret) { ASM_MATCH_TRICK(ret); if (DisplayDungeonYesNoMessage(0,*gUnknown_80FECA0,1) == 1) { @@ -969,7 +966,7 @@ bool8 sub_8048B9C(Entity *entity, Item *item) } else { - sub_8044C10(TRUE); + SetLeaderActionToNothing(TRUE); break; } } diff --git a/src/code_805D8C8.c b/src/code_805D8C8.c index 16fafdc0d..87f3c0b39 100644 --- a/src/code_805D8C8.c +++ b/src/code_805D8C8.c @@ -15,7 +15,7 @@ extern const u8 gUnknown_8106E98[]; // palet // ??? extern s32 sprintf(char *, const char *, ...); -extern u32 gUnknown_202EDCC; +extern u32 gDungeonFramesCounter; static void EnsureCastformLoaded(void); static void EnsureDeoxysLoaded(void); @@ -37,9 +37,9 @@ void sub_8068310(s32 size, u16 **param_2) } void sub_8068344(void) -{ - if ((gUnknown_202EDCC & 8) != 0) { - UnkTextStruct1 *ptr = &gUnknown_2027370[0]; +{ + if ((gDungeonFramesCounter & 8) != 0) { + Window *window = &gWindows[0]; SpriteOAM sprite = {0}; SpriteSetAffine1(&sprite, 0); @@ -49,20 +49,21 @@ void sub_8068344(void) SpriteSetBpp(&sprite, 0); SpriteSetShape(&sprite, 1); SpriteSetMatrixNum(&sprite, 16); - SpriteSetSize(&sprite, 0); + SpriteSetSize(&sprite, 0); SpriteSetTileNum(&sprite, 0x3F0); SpriteSetPriority(&sprite, 0); SpriteSetPalNum(&sprite, 15); - SpriteSetY(&sprite, (ptr->unk2 * 8) + 0x8); - SpriteSetX(&sprite, (ptr->unk0 * 8) + 0x40); + SpriteSetY(&sprite, (window->y * 8) + 0x8); + SpriteSetX(&sprite, (window->x * 8) + 0x40); AddSprite(&sprite,0x100,NULL,NULL); } } +// The same as sub_80623B0 void sub_80684C4(void) -{ - if ((gUnknown_202EDCC & 8) != 0) { - UnkTextStruct1 *ptr = &gUnknown_2027370[0]; +{ + if ((gDungeonFramesCounter & 8) != 0) { + Window *window = &gWindows[0]; SpriteOAM sprite = {0}; SpriteSetAffine1(&sprite, 0); @@ -71,12 +72,13 @@ void sub_80684C4(void) SpriteSetMosaic(&sprite, 0); SpriteSetBpp(&sprite, 0); SpriteSetShape(&sprite, 1); + SpriteSetMatrixNum(&sprite, 0); SpriteSetSize(&sprite, 0); SpriteSetTileNum(&sprite, 0x3F0); SpriteSetPriority(&sprite, 0); SpriteSetPalNum(&sprite, 15); - SpriteSetY(&sprite, (ptr->unk2 * 8) + 0x70); - SpriteSetX_MatrixNumSize0(&sprite, (ptr->unk0 * 8) + 0x40); + SpriteSetY(&sprite, (window->y * 8) + 0x70); + SpriteSetX(&sprite, (window->x * 8) + 0x40); AddSprite(&sprite,0x100,NULL,NULL); } } diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c deleted file mode 100644 index 7fe39989b..000000000 --- a/src/code_805D8C8_1.c +++ /dev/null @@ -1,3099 +0,0 @@ -#include "global.h" -#include "structs/str_dungeon.h" -#include "number_util.h" -#include "input.h" -#include "structs/map.h" -#include "dungeon_message.h" -#include "dungeon_action.h" -#include "dungeon_ai_targeting.h" -#include "dungeon_pokemon_attributes.h" -#include "dungeon_random.h" -#include "dungeon_util.h" -#include "dungeon_map.h" -#include "pokemon.h" -#include "moves.h" -#include "items.h" -#include "dungeon_music.h" -#include "dungeon_ai_movement.h" -#include "code_8045A00.h" -#include "string_format.h" -#include "code_803E46C.h" -#include "code_801602C.h" -#include "code_800D090.h" -#include "trap.h" -#include "charge_move.h" -#include "dungeon_map_access.h" -#include "status_checks_1.h" -#include "game_options.h" -#include "weather.h" -#include "dungeon_items.h" -#include "dungeon_leader.h" -#include "tile_types.h" -#include "dungeon_visibility.h" -#include "dungeon_movement.h" -#include "bg_control.h" -#include "menu_input.h" -#include "music.h" -#include "items.h" -#include "play_time.h" -#include "pokemon_3.h" -#include "text.h" -#include "code_806CD90.h" -#include "code_8044CC8.h" -#include "code_801B3C0.h" -#include "dungeon_capabilities.h" -#include "constants/dungeon.h" -#include "constants/status.h" -#include "constants/tactic.h" -#include "constants/iq_skill.h" -#include "constants/dungeon_action.h" -#include "structs/struct_sub80095e4.h" -#include "structs/str_text.h" - -struct UnkMenuBitsStruct { - u8 a0_8; - u8 a0_16; - u8 a0_24; - u8 a0_32; -}; - -extern void HandleSetItemAction(Entity *,bool8); -extern void HandleUnsetItemAction(Entity *,bool8); -extern bool8 sub_8048A68(Entity *param_1,Item *item); -extern bool8 sub_8048950(Entity *param_1,Item *item); -extern bool8 sub_8048B9C(Entity *param_1,Item *item); -extern Item *sub_8044D90(Entity *, s32, u32); -extern void sub_8083D44(void); -extern void sub_8083D30(void); -extern void sub_8083D08(void); -extern void sub_806A6E8(Entity *); -extern bool8 sub_8047084(s32 itemFlag); -extern void HandleTrap(Entity *pokemon, DungeonPos *pos, int param_3, char param_4); -extern void sub_8045DB4(DungeonPos *, u32); -bool8 sub_807EF48(void); -void sub_806A2BC(Entity *a0, u8 a1); -bool8 sub_805E874(void); -bool8 sub_80701A4(Entity *a0); -void sub_80647F0(Entity *a0); -void sub_805E738(Entity *a0); -void sub_803E708(s32 a0, s32 a1); -void sub_805E804(void); -void sub_8064BE0(void); -void sub_8075680(u32); -void sub_8094C88(void); -void ShowWholeRevealedDungeonMap(void); -void sub_8047158(void); -void sub_806A914(u8 a0, u8 a1, u8 a2); -void sub_8044C10(u8 a0); -u16 GetLeaderActionId(void); -void sub_80978C8(s16 a0); -static void TryCreateModeArrows(Entity *leader); -bool8 sub_8094C48(void); -bool8 sub_805EC4C(Entity *a0, u8 a1); -void sub_803E724(s32 a0); -void HandleTalkFieldAction(Entity *); -bool8 sub_8044B28(void); -bool8 IsNotAttacking(Entity *param_1, bool8 param_2); -void ShowFieldMenu(u8 a0, bool8 a1); -bool8 sub_805EF60(Entity *a0, EntityInfo *a1); -s32 GetTeamMemberEntityIndex(Entity *pokemon); -bool8 sub_8070F80(Entity * pokemon, s32 direction); -void DrawFieldMenu(u8 a0); -bool8 sub_805FD74(Entity * a0, struct UnkMenuBitsStruct *a1); -bool8 sub_805FD3C(struct UnkMenuBitsStruct *a0); -void sub_8060D24(UNUSED ActionContainer *a0); -bool8 sub_8060E38(Entity *a0); -void sub_8062D8C(ActionContainer *a0); -void sub_80637E8(ActionContainer *a0); -void sub_8063B54(ActionContainer *a0); -void sub_8063BB4(ActionContainer *a0); -void sub_806752C(ActionContainer *a0); -bool8 sub_8061A38(ActionContainer *a0, bool8 a1); -void sub_8063A70(ActionContainer *a0, bool8 a1); -void sub_8063CF0(ActionContainer *a0, bool8 a1); -void sub_8067768(ActionContainer *a0); -void ShowTacticsMenu(ActionContainer *a0); -void sub_804A728(DungeonPos *pos, s32 a1, u8 a2, u8 a3); -extern bool8 sub_8071A8C(Entity *pokemon); -extern void sub_80643AC(Entity *pokemon); -extern u8 sub_8062F90(Entity *, u32, u32, u32, u32); - -extern Entity *gLeaderPointer; - -extern const u8 *gUnknown_80F8A84; -extern const u8 *gUnknown_80F8A6C; -extern const u8 *gUnknown_80F8ADC; -extern const u8 *gUnknown_80F8AB0; -extern const u8 *gUnknown_80F8B0C; -extern const u8 *gUnknown_80FD4B0; -extern const u8 *gUnknown_80F8A4C; -extern const u8 *gUnknown_80F8A28; -extern const u8 *gUnknown_8100208; -extern const u8 *gUnknown_80F9BD8; -extern const u8 *gUnknown_80F9C08; -extern const u8 *gUnknown_80F9C2C; -extern const u8 *gUnknown_80F9BB0; -extern const u8 *gUnknown_80FDE18; -extern const u8 *gUnknown_80F8B24; -extern const u8 *gTeamToolboxAPtr; -extern const u8 *gTeamToolboxBPtr; -extern const u8 *gFieldItemMenuGroundTextPtr; -extern const u8 *gUnknown_80FE940; -extern const u8 *gWhichTextPtr1; - -static EWRAM_DATA bool8 sInDiagonalMode = 0; -static EWRAM_DATA bool8 sInRotateMode = 0; -// Frames counter for arrows in diagonal/rotate mode. -static EWRAM_DATA s16 sArrowsFrames = 0; -// If both of these are set to TRUE, there are 3 arrows visible instead of 1 in rotate mode -static EWRAM_DATA bool8 sShowThreeArrows1 = 0; -static EWRAM_DATA bool8 sShowThreeArrows2 = 0; - -void DungeonHandlePlayerInput(void) -{ - struct UnkMenuBitsStruct r6; - bool8 triggers[5]; // Always FALSE, if one of these is TRUE - they can open various menus or cause an item throw. Most likely used for debugging/testing. - s32 frames; - s32 var_38; - UnkDungeonGlobal_unk181E8_sub *unkPtr; - - unkPtr = &gDungeon->unk181e8; - var_38 = 3; - gDungeon->unk12 = 0; - sub_806A2BC(GetLeader(), 1); - if (sub_80701A4(GetLeader())) { - sub_803E708(60, 16); - return; - } - - gDungeon->unk644.unk2F = 0; - ResetMapPlayerDotFrames(); - if (gDungeon->unk1 != 0) { - gDungeon->unk1 = 0; - if (!ShouldMonsterRunAwayAndShowEffect(GetLeader(), TRUE)) { - sub_8044C10(1); - sub_805E804(); - sub_80647F0(GetLeader()); - ResetRepeatTimers(); - ResetUnusedInputStruct(); - if (GetLeaderActionId() != 0) { - return; - } - } - } - - sub_806A914(1, 1, 1); - while (1) { - Entity *leader = GetLeader(); - EntityInfo *leaderInfo = GetEntInfo(leader); - - sub_80978C8(leaderInfo->id); - if (gDungeon->unk644.unk28 != 0) { - if (sub_805E874() != 0) { - leaderInfo->action.action = 2; - leaderInfo->action.actionParameters[0].actionUseIndex = 0; - break; - } - sub_805E804(); - } - sInRotateMode = FALSE; - sInDiagonalMode = FALSE; - if (gDungeon->unk5C0 >= 0) { - r6.a0_8 = 1; - r6.a0_16 = 0; - r6.a0_24 = 0; - } - else { - r6.a0_8 = 0; - r6.a0_16 = 0; - r6.a0_24 = 0; - } - - frames = 0; - sub_8044C50(ACTION_NOTHING); - sShowThreeArrows1 = FALSE; - sShowThreeArrows2 = FALSE; - - while (r6.a0_8 == 0) { - u32 dpadDiagonal, dpadSimple; - bool32 highlightTiles, tryItemThrow; - bool32 bPress, rPress, unkBool; // Always FALSE, might've been used as debug variables. - s32 directionNew; - - sArrowsFrames++; - if (unkPtr->unk1821A != 0) { - frames = 0; - } - else { - frames++; - } - - if (var_38 != 0 && --var_38 == 0) { - sub_8075680(0); - } - - TryCreateModeArrows(leader); - unkBool = FALSE; - { - s32 i; - for (i = 0; i < 5; i++) { - triggers[i] = FALSE; - } - } - - if (gRealInputs.held & A_BUTTON && gRealInputs.held & B_BUTTON && FixedPointToInt(leaderInfo->belly) != 0) { - sub_8044C50(ACTION_PASS_TURN); - gDungeon->unk644.unk2F = 1; - break; - } - - bPress = FALSE; - rPress = FALSE; - - if (gRealInputs.pressed & A_BUTTON) { - if (gRealInputs.held & B_BUTTON) { - if (FixedPointToInt(leaderInfo->belly) != 0) { - sub_8044C50(ACTION_PASS_TURN); - gDungeon->unk644.unk2F = 1; - break; - } - } - else if (ShouldMonsterRunAwayAndShowEffect(leader, TRUE)) { - LogMessageByIdWithPopupCheckUser(leader, gUnknown_80FD4B0); - sub_8044C50(ACTION_PASS_TURN); - gDungeon->unk644.unk2F = 1; - break; - } - else if (gRealInputs.held & L_BUTTON) { - bool32 canUseMove; - s32 i, j; - - for (i = 0; i < MAX_MON_MOVES; i++) { - if (MoveFlagExists(&leaderInfo->moves.moves[i]) && MoveFlagSet(&leaderInfo->moves.moves[i])) { - break; - } - } - if (i == MAX_MON_MOVES) { - LogMessageByIdWithPopupCheckUser(leader, gUnknown_80F8A28); - break; - } - - for (j = 0; j < MAX_MON_MOVES; j++) { - if (MoveFlagExists(&leaderInfo->moves.moves[j])) { - if (leaderInfo->moves.moves[j].PP != 0) - break; - } - } - if (j == MAX_MON_MOVES) { - SetMonsterActionFields(&leaderInfo->action, ACTION_STRUGGLE); - break; - } - - canUseMove = FALSE; - for (j = i; j < MAX_MON_MOVES; j++) { - if (j != i && !(leaderInfo->moves.moves[j].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { - break; - } - if (leaderInfo->moves.moves[j].PP != 0) { - canUseMove = TRUE; - break; - } - } - if (!canUseMove) { - LogMessageByIdWithPopupCheckUser(leader, gUnknown_80F8A4C); - } - else { - SetMonsterActionFields(&leaderInfo->action, ACTION_USE_MOVE_PLAYER); - leaderInfo->action.actionParameters[0].actionUseIndex = GetTeamMemberEntityIndex(leader); - leaderInfo->action.actionParameters[1].actionUseIndex = i; - } - break; - } - else { - if (!sub_805EF60(leader, leaderInfo)) { - SetMonsterActionFields(&leaderInfo->action, ACTION_REGULAR_ATTACK); - } - break; - } - } - - if (gRealInputs.shortPress & B_BUTTON) { - r6.a0_8 = 1; - r6.a0_16 = 0; - r6.a0_24 = 0; - break; - } - else if (triggers[1]) { // Opens moves menu - gDungeon->unk5C0 = 0; - r6.a0_8 = 1; - r6.a0_16 = 0; - r6.a0_24 = 1; - break; - } - else if (triggers[2]) { // Opens item menu - gDungeon->unk5C0 = 1; - r6.a0_8 = 1; - r6.a0_16 = 0; - r6.a0_24 = 1; - break; - } - else if (triggers[3]) { // Opens pokemon menu - gDungeon->unk5C0 = 2; - r6.a0_8 = 1; - r6.a0_16 = 0; - r6.a0_24 = 1; - break; - } - else if (triggers[4]) { // Opens regular menu - r6.a0_8 = 1; - r6.a0_16 = 0; - r6.a0_24 = 1; - break; - } - else if (frames > 0x707) { // Opens simple menu when idling - r6.a0_8 = 1; - r6.a0_16 = 1; - r6.a0_24 = 0; - break; - } - - if (gGameOptionsRef->unk9 == 0 - && (gRealInputs.pressed & B_BUTTON || (!unkBool && bPress)) - && unkPtr->unk1821A != 0) - { - sub_804AA60(); - sInRotateMode = FALSE; - ResetRepeatTimers(); - ResetUnusedInputStruct(); - } - - if (gRealInputs.held & L_BUTTON) { - if (gRealInputs.pressed & B_BUTTON) { - DisplayMessageLog(); - ResetRepeatTimers(); - ResetUnusedInputStruct(); - } - } - - tryItemThrow = FALSE; - if (gRealInputs.held & R_BUTTON) { - if (!sInDiagonalMode) { - sArrowsFrames = 0; - } - sInDiagonalMode = TRUE; - } - else { - sInDiagonalMode = FALSE; - } - - highlightTiles = FALSE; - if (gGameOptionsRef->unk9 == 0) { - if (gRealInputs.shortPress & R_BUTTON || rPress || gRealInputs.pressed & START_BUTTON) { - highlightTiles = TRUE; - } - } - if (highlightTiles) { - sub_805E738(leader); - sInRotateMode = TRUE; - unkPtr->unk1821B = leaderInfo->action.direction; - unkPtr->unk1821C = 0xFF; - ResetRepeatTimers(); - } - - if ((gRealInputs.held & L_BUTTON) == L_BUTTON && (gRealInputs.pressed & R_BUTTON) == R_BUTTON) { - tryItemThrow = TRUE; - } - if (triggers[0]) { - tryItemThrow = TRUE; - } - if (tryItemThrow) { - s32 i; - for (i = 0; i < INVENTORY_SIZE; i++) { - if (ItemExists(&gTeamInventoryRef->teamItems[i]) && ItemSet(&gTeamInventoryRef->teamItems[i])) { - sub_8044C50(ACTION_THROW_ITEM_PLAYER); - leaderInfo->action.actionParameters[0].actionUseIndex = i +1; - leaderInfo->action.actionParameters[0].itemPos.x = 0; - leaderInfo->action.actionParameters[0].itemPos.y = 0; - break; - } - } - if (leaderInfo->action.action != 0) { - break; - } - } - - // SELECT button - if (!gDungeon->unk181e8.blinded && gGameOptionsRef->mapOption != TOP_MAP_AND_TEAM_NO_BOTTOM && gRealInputs.pressed & SELECT_BUTTON) { - s32 prevMapOption = gGameOptionsRef->mapOption; - gShowMonsterDotsInDungeonMap = TRUE; - gDungeon->unk181e8.inFloorMapMode = TRUE; - if (!sub_8094C48()) { - sub_8094C88(); - } - sub_8052210(1); - ShowWholeRevealedDungeonMap(); - SetBGOBJEnableFlags(0x1E); - sub_803E708(0xA, 0x2F); - while (1) { - sub_803E46C(0x2F); - if (gRealInputs.pressed & SELECT_BUTTON) - break; - if (gRealInputs.pressed & B_BUTTON) - break; - - if (gRealInputs.pressed & A_BUTTON) { - gShowMonsterDotsInDungeonMap = (gShowMonsterDotsInDungeonMap == FALSE) ? TRUE : FALSE; // Flip - ShowWholeRevealedDungeonMap(); - } - } - gDungeon->unk181e8.inFloorMapMode = FALSE; - gGameOptionsRef->mapOption = prevMapOption; - gShowMonsterDotsInDungeonMap = TRUE; - ShowWholeRevealedDungeonMap(); - SetBGOBJEnableFlags(0); - sub_803E46C(0x2F); - sub_803E46C(0x2F); - } - - if (gDungeon->unk644.unk29 != 0 && !sInDiagonalMode) { - dpadDiagonal = dpadSimple = gRealInputs.pressed; - } - else { - dpadDiagonal = gRealInputs.held; - dpadSimple = (unkPtr->unk1821A == 0) ? gRealInputs.held : gRealInputs.pressed; - } - - dpadDiagonal &= DPAD_ANY; - dpadSimple &= DPAD_ANY; - directionNew = -1; - if (dpadDiagonal == (DPAD_UP | DPAD_RIGHT)) - directionNew = DIRECTION_NORTHEAST; - if (dpadDiagonal == (DPAD_UP | DPAD_LEFT)) - directionNew = DIRECTION_NORTHWEST; - if (dpadDiagonal == (DPAD_DOWN | DPAD_RIGHT)) - directionNew = DIRECTION_SOUTHEAST; - if (dpadDiagonal == (DPAD_DOWN | DPAD_LEFT)) - directionNew = DIRECTION_SOUTHWEST; - - if (dpadSimple == DPAD_UP) - directionNew = DIRECTION_NORTH; - if (dpadSimple == DPAD_DOWN) - directionNew = DIRECTION_SOUTH; - if (dpadSimple == DPAD_RIGHT) - directionNew = DIRECTION_EAST; - if (dpadSimple == DPAD_LEFT) - directionNew = DIRECTION_WEST; - - if (directionNew >= 0 && (!sInDiagonalMode || (directionNew & 1))) { - bool32 directionChanged = (leaderInfo->action.direction != directionNew); - leaderInfo->action.direction = directionNew & DIRECTION_MASK; - if (sInRotateMode) { - unkPtr->unk1821B = directionNew; - sub_806CDD4(leader, sub_806CEBC(leader), directionNew); - } - else { - u8 canMoveFlags = 0; - const u8 *immobilizedMsg = NULL; - - if (sub_805EC4C(leader, 1)) - break; - - if (leaderInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) { - immobilizedMsg = gUnknown_80F8A84, canMoveFlags |= 1; - } - else if (leaderInfo->frozenClassStatus.status == STATUS_CONSTRICTION) { - immobilizedMsg = gUnknown_80F8A6C, canMoveFlags |= 1; - } - else if (leaderInfo->frozenClassStatus.status == STATUS_INGRAIN) { - immobilizedMsg = gUnknown_80F8AB0, canMoveFlags |= 1; - } - else if (leaderInfo->frozenClassStatus.status == STATUS_WRAP) { - immobilizedMsg = gUnknown_80F8ADC, canMoveFlags |= 1; - } - else if (leaderInfo->frozenClassStatus.status == STATUS_WRAPPED) { - immobilizedMsg = gUnknown_80F8B0C, canMoveFlags |= 1; - } - - if (!CanMoveInDirection(leader, directionNew)) - canMoveFlags |= 2; - - if (directionChanged) { - sub_806CDD4(leader, sub_806CEBC(leader), directionNew); - } - - if (!(canMoveFlags & 2)) { - if (canMoveFlags & 1) { - if (immobilizedMsg != NULL) { - LogMessageByIdWithPopupCheckUser(leader, immobilizedMsg); - } - sub_8044C50(ACTION_PASS_TURN); - gDungeon->unk644.unk2F = 1; - } - else { - sub_8044C50(ACTION_WALK); - if ((gRealInputs.held & B_BUTTON || bPress) && FixedPointToInt(leaderInfo->belly) != 0) { - if (GetEntInfo(leader)->cringeClassStatus.status != STATUS_CONFUSED) { - gDungeon->unk644.unk28 = 1; - } - leaderInfo->action.actionParameters[0].actionUseIndex = 0; - } - else { - leaderInfo->action.actionParameters[0].actionUseIndex = 1; - } - } - break; - } - else if (canMoveFlags & 1) { - sub_803E724(0x23); - } - - } - } - sub_803E46C(0xF); - } - - if (unkPtr->unk1821A != 0) { - sub_804AA60(); - } - - if (leaderInfo->action.action == 0x2D || leaderInfo->action.action == 0x13) { - HandleTalkFieldAction(leader); - if (sub_8044B28()) - break; - sub_8044C50(ACTION_NOTHING); - } - else if ((r6.a0_8) == 0) { - gDungeon->unk644.unk29 = 0; - if (leaderInfo->action.action != 0) { - if (!IsNotAttacking(leader, FALSE)) { - sub_803E46C(0xF); - } - break; - } - sub_803E46C(0xF); - } - else { - sub_803E46C(0xF); - sub_8047158(); - ShowFieldMenu((r6.a0_16 == 0) ? 1 : 0, r6.a0_24); - ResetRepeatTimers(); - ResetUnusedInputStruct(); - sInRotateMode = FALSE; - unkPtr->unk1821A = 0; - sub_804AA60(); - if (sub_8044B28()) - break; - if (leaderInfo->action.action != 0) { - if (leaderInfo->action.action == 0x2B) { - gDungeon->unk4 = 1; - gDungeon->unk3 = 1; - } - if (leaderInfo->action.action == 0x2E) { - gDungeon->unk4 = 1; - gDungeon->unk3 = 0; - } - break; - } - sub_803E46C(0xF); - if (gDungeon->unk4 != 0) - break; - } - } -} - -struct UnkStruct_8106AC8 -{ - s16 unk0; - s16 unk2; - u8 unk4; - u8 unk5; -}; - -extern const struct UnkStruct_8106AC8 gUnknown_8106AC8[]; - -struct UnkStruct_8106AE8 -{ - s16 unk0; - s16 unk2; - u32 unk4; - u8 unk8; - u8 unk9; - u8 unkA; -}; - -extern const struct UnkStruct_8106AE8 gUnknown_8106AE8[]; - -// Creates arrow sprites which are used when in rotate or diagonal modes. -static void TryCreateModeArrows(Entity *leader) -{ - UnkDungeonGlobal_unk181E8_sub *unkPtr = &gDungeon->unk181e8; - - if (sInDiagonalMode) { - s32 i; - SpriteOAM sprite; - - for (i = 0; i < 4; i++) { - u32 matrixNum; - s32 x, xMul, x2; - s32 y, yMul, y2; - - SpriteSetAffine1(&sprite, 0); - SpriteSetAffine2(&sprite, 0); - SpriteSetObjMode(&sprite, 1); - SpriteSetMosaic(&sprite, 0); - SpriteSetBpp(&sprite, 0); - SpriteSetShape(&sprite, 0); - - matrixNum = (gUnknown_8106AC8[i].unk4 != 0) ? 8 : 0; - - if (gUnknown_8106AC8[i].unk5) - matrixNum += 16; - - SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); - SpriteSetSize(&sprite, 0); - - SpriteSetTileNum(&sprite, 0x213); - SpriteSetPriority(&sprite, 2); - SpriteSetPalNum(&sprite, 0); - - SpriteSetUnk6_0(&sprite, 0); - SpriteSetUnk6_1(&sprite, 0); - - xMul = gUnknown_8106AC8[i].unk0 * 10; - x2 = (sArrowsFrames / 2) & 7; - x = (x2 * gUnknown_8106AC8[i].unk0) + xMul + 116; - SpriteSetX(&sprite, x); - - yMul = gUnknown_8106AC8[i].unk2 * 10; - y2 = (sArrowsFrames / 2) & 7; - y = (y2 * gUnknown_8106AC8[i].unk2) + yMul + 82; - SpriteSetY(&sprite, y); - - AddSprite(&sprite, 0x100, NULL, NULL); - } - } - - else if (unkPtr->unk1821A) { - s32 i; - SpriteOAM sprite; - s32 var_2C = unkPtr->unk1821B; - - if (unkPtr->unk1821B < 8) { - s32 x, xMul, x2; - s32 y, yMul, y2; - s32 to = (sShowThreeArrows2 != FALSE && sShowThreeArrows1 != FALSE) ? 3 : 1; - - xMul = gUnknown_8106AE8[var_2C].unk0 * 10; - x2 = (sArrowsFrames / 2) & 7; - x = (gUnknown_8106AE8[var_2C].unk0 * x2) + xMul + 116; - - yMul = gUnknown_8106AE8[var_2C].unk2 * 10; - y2 = (sArrowsFrames / 2) & 7; - y = (y2 * gUnknown_8106AE8[var_2C].unk2) + yMul + 82; - for (i = 0; i < to; i++) { - u32 matrixNum; - - SpriteSetAffine1(&sprite, 0); - SpriteSetAffine2(&sprite, 0); - SpriteSetObjMode(&sprite, 1); - SpriteSetMosaic(&sprite, 0); - SpriteSetBpp(&sprite, 0); - SpriteSetShape(&sprite, 0); - - matrixNum = (gUnknown_8106AE8[var_2C].unk8 != 0) ? 8 : 0; - - if (gUnknown_8106AE8[var_2C].unk9) - matrixNum += 16; - - SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); - SpriteSetSize(&sprite, 0); - - SpriteSetTileNum(&sprite, gUnknown_8106AE8[var_2C].unk4); - SpriteSetPriority(&sprite, 2); - SpriteSetPalNum(&sprite, 0); - - SpriteSetUnk6_0(&sprite, 0); - SpriteSetUnk6_1(&sprite, 0); - - SpriteSetX(&sprite, x); - SpriteSetY(&sprite, y); - - AddSprite(&sprite, 0x100, NULL, NULL); - x += gUnknown_8106AE8[var_2C].unk0 * 4; - y += gUnknown_8106AE8[var_2C].unk2 * 4; - } - } - } - - if (sInRotateMode && unkPtr->unk1821C != unkPtr->unk1821B) { - unkPtr->unk1821C = unkPtr->unk1821B; - sub_804A728(&leader->pos, unkPtr->unk1821B, 0, sInRotateMode); - } -} - -void sub_805E738(Entity *a0) -{ - const Tile *tile; - s32 i, j; - EntityInfo *entityInfo = GetEntInfo(a0); - if (entityInfo->blinkerClassStatus.status != 1 && entityInfo->blinkerClassStatus.status != 2) { - // What??? - for (i = 0; i < 1; i++) { - bool8 r9 = FALSE; - u32 direction = entityInfo->action.direction; - direction++; - for (j = 1; j < 8; j++, direction++) { - direction &= DIRECTION_MASK; - tile = GetTile(a0->pos.x + gAdjacentTileOffsets[direction].x, a0->pos.y + gAdjacentTileOffsets[direction].y); - if (tile->monster != NULL && GetEntityType(tile->monster) == ENTITY_MONSTER) { - EntityInfo *tileMonsterInfo = GetEntInfo(tile->monster); - if (CanSeeTarget(a0, tile->monster)) { - if (i != 0 || tileMonsterInfo->isNotTeamMember) { - r9 = TRUE; - break; - } - } - } - } - if (r9) { - GetEntInfo(a0)->action.direction = direction & DIRECTION_MASK; - sub_806CDD4(a0, sub_806CEBC(a0), direction); - break; - } - } - } -} - -void sub_805E804(void) -{ - gDungeon->unk644.unk29 |= gDungeon->unk644.unk28; - gDungeon->unk644.unk28 = 0; - while (gDungeon->unk644.unk29 != 0 && gRealInputs.held & R_BUTTON) { - sub_803E46C(0x54); - } -} - -extern bool8 sub_8070F14(Entity * pokemon, s32 direction); -bool8 sub_805EC2C(Entity *a0, s32 x, s32 y); - -bool8 sub_805E874(void) -{ - u8 r7, r8, r0; - s32 i, j, k; - s32 xArray[3]; - s32 yArray[3]; - Dungeon *dungeon = gDungeon; - Entity *leader = GetLeader(); - s32 direction = GetEntInfo(leader)->action.direction; - s32 x = leader->pos.x; - s32 y = leader->pos.y; - const Tile *leaderTile = GetTile(x, y); - s32 xAdjacent = x + gAdjacentTileOffsets[direction].x; - s32 yAdjacent = y + gAdjacentTileOffsets[direction].y; - s32 room; - - if (dungeon->unk644.unk28 == 0) - return FALSE; - if (leaderTile->object != NULL) - return FALSE; - if (sub_805EC2C(leader, x, y)) - return FALSE; - if (!sub_8070F14(leader, direction)) - return FALSE; - - room = leaderTile->room; - if (room == 0xFF) { - if (GetTile(xAdjacent, yAdjacent)->room != 0xFF) - return FALSE; - } - else { - if (leaderTile->terrainType & TERRAIN_TYPE_NATURAL_JUNCTION) - return FALSE; - } - - for (j = -1; j < 2; j++) { - const Tile *tile = GetTile(x + gAdjacentTileOffsets[(direction + j) & 7].x, y + gAdjacentTileOffsets[(direction + j) & 7].y); - if (tile->monster != NULL) - return FALSE; - if (tile->terrainType & TERRAIN_TYPE_STAIRS) - return FALSE; - } - - xArray[0] = x + gAdjacentTileOffsets[(direction + 3) & 7].x; - xArray[1] = x + gAdjacentTileOffsets[(direction + 4) & 7].x; - xArray[2] = x + gAdjacentTileOffsets[(direction + 5) & 7].x; - - yArray[0] = y + gAdjacentTileOffsets[(direction + 3) & 7].y; - yArray[1] = y + gAdjacentTileOffsets[(direction + 4) & 7].y; - yArray[2] = y + gAdjacentTileOffsets[(direction + 5) & 7].y; - - for (i = -1; i < 2; i++) { - for (j = -1; j < 2; j++) { - const Tile *tile = GetTile(x + i, y + j); - if (tile->object != NULL) { - for (k = 0; k < 3; k++) { - if (x + i == xArray[k] && y + j == yArray[k]) - break; - } - if (k == 3 && GetEntityType(tile->object) == ENTITY_ITEM) - return FALSE; - } - - if (direction & 1) { - // This doesn't really have to be called two times... - if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP && GetEntityType(tile->object) == ENTITY_TRAP) { - if (tile->object->isVisible) - return FALSE; - if (gDungeon->unk181e8.showInvisibleTrapsMonsters) - return FALSE; - } - } - else if (i == 0 || j == 0) { - if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP) { - if (tile->object->isVisible) - return FALSE; - if (gDungeon->unk181e8.showInvisibleTrapsMonsters) - return FALSE; - } - } - - if (i != 0 && j != 0) continue; - if (i == 0 && j == 0) continue; - - if ((xArray[1] != x + i || yArray[1] != y + j) && !sub_805EC2C(leader, x + i, y + j) && room != 0xFF && room != tile->room) - return FALSE; - } - } - - if (!(direction & 1)) { - if (direction == 0 || direction == 4) { - r8 = sub_805EC2C(leader, x - 1, y - 1); - r7 = sub_805EC2C(leader, x - 1, y); - r0 = sub_805EC2C(leader, x - 1, y + 1); - if (r7 == 0) { - if (r8 != 0 || r7 != r0) - return FALSE; - } - - r8 = sub_805EC2C(leader, x + 1, y - 1); - r7 = sub_805EC2C(leader, x + 1, y); - r0 = sub_805EC2C(leader, x + 1, y + 1); - if (r7 == 0) { - if (r8 != 0 || r7 != r0) - return FALSE; - } - } - else { - r8 = sub_805EC2C(leader, x - 1, y - 1); - r7 = sub_805EC2C(leader, x, y - 1); - r0 = sub_805EC2C(leader, x + 1, y - 1); - if (r7 == 0) { - if (r8 != 0 || r7 != r0) - return FALSE; - } - - r8 = sub_805EC2C(leader, x - 1, y + 1); - r7 = sub_805EC2C(leader, x, y + 1); - r0 = sub_805EC2C(leader, x + 1, y + 1); - if (r7 == 0) { - if (r8 != 0 || r7 != r0) - return FALSE; - } - } - } - - return TRUE; -} - -bool8 sub_805EC2C(Entity *a0, s32 x, s32 y) -{ - DungeonPos pos = {.x = x, .y = y}; - return sub_8070564(a0, &pos); -} - -bool8 sub_805EC4C(Entity *a0, u8 a1) -{ - DungeonPos pos; - const Tile *tile; - EntityInfo *tileMonsterInfo; - Entity *tileMonster; - EntityInfo *entityInfo = GetEntInfo(a0); - - pos.x = a0->pos.x + gAdjacentTileOffsets[entityInfo->action.direction].x; - pos.y = a0->pos.y + gAdjacentTileOffsets[entityInfo->action.direction].y; - tile = GetTile(pos.x, pos.y); - tileMonster = tile->monster; - - if (tileMonster == NULL) return FALSE; - if (GetEntityType(tileMonster) != ENTITY_MONSTER) return FALSE; - - tileMonsterInfo = GetEntInfo(tileMonster); - if (tileMonsterInfo->isNotTeamMember - && (tileMonsterInfo->shopkeeper != 1 && tileMonsterInfo->shopkeeper != 2) - && !IsExperienceLocked(tileMonsterInfo->joinedAt.id) - && tileMonsterInfo->monsterBehavior != BEHAVIOR_RESCUE_TARGET) { - return FALSE; - } - - if (entityInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) return FALSE; - if (entityInfo->frozenClassStatus.status == STATUS_FROZEN) return FALSE; - if (entityInfo->frozenClassStatus.status == STATUS_CONSTRICTION) return FALSE; - if (entityInfo->frozenClassStatus.status == STATUS_INGRAIN) return FALSE; - if (entityInfo->frozenClassStatus.status == STATUS_WRAP) return FALSE; - if (entityInfo->frozenClassStatus.status == STATUS_WRAPPED) return FALSE; - - if (tileMonsterInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) return FALSE; - if (tileMonsterInfo->frozenClassStatus.status == STATUS_FROZEN) return FALSE; - if (tileMonsterInfo->frozenClassStatus.status == STATUS_CONSTRICTION) return FALSE; - if (tileMonsterInfo->frozenClassStatus.status == STATUS_INGRAIN) return FALSE; - if (tileMonsterInfo->frozenClassStatus.status == STATUS_WRAP) return FALSE; - if (tileMonsterInfo->frozenClassStatus.status == STATUS_WRAPPED) return FALSE; - - if (entityInfo->cringeClassStatus.status == STATUS_CONFUSED) return FALSE; - if (tileMonsterInfo->cringeClassStatus.status == STATUS_CONFUSED) return FALSE; - - if (tileMonsterInfo->sleepClassStatus.status != STATUS_NONE && tileMonsterInfo->sleepClassStatus.status != STATUS_SLEEPLESS && tileMonsterInfo->sleepClassStatus.status != STATUS_YAWNING) return FALSE; - if (entityInfo->sleepClassStatus.status != STATUS_NONE && entityInfo->sleepClassStatus.status != STATUS_SLEEPLESS && entityInfo->sleepClassStatus.status != STATUS_YAWNING) return FALSE; - - if (IsChargingAnyTwoTurnMove(tileMonster, FALSE)) return FALSE; - if (!sub_8070F80(a0, entityInfo->action.direction)) return FALSE; - - if (a1 != 0 && sub_807049C(tileMonster, &a0->pos) && !DisplayDungeonYesNoMessage(0, gUnknown_8100208, 0)) return FALSE; - - SetMonsterActionFields(&entityInfo->action, ACTION_WALK); - if (gRealInputs.held & B_BUTTON) { - entityInfo->action.actionParameters[0].actionUseIndex = 0; - } - else { - entityInfo->action.actionParameters[0].actionUseIndex = 1; - } - entityInfo->flags |= 0x8000; - - SetMonsterActionFields(&tileMonsterInfo->action, ACTION_WALK); - tileMonsterInfo->action.actionParameters[0].actionUseIndex = 0; - tileMonsterInfo->action.direction = (entityInfo->action.direction + 4) & 7; - tileMonsterInfo->flags |= 0x8000; - tileMonsterInfo->targetPos.x = tileMonster->pos.x; - tileMonsterInfo->targetPos.y = tileMonster->pos.y; - gDungeon->unkE = 1; - return TRUE; -} - -void sub_805EE30(void) -{ - Entity *tileObject; - Tile *tile; - Entity *leader = GetLeader(); - if (leader == NULL) - return; - if (sub_8044B28()) - return; - - tile = GetTileAtEntitySafe(leader); - if (IQSkillIsEnabled(leader, IQ_SUPER_MOBILE) && GetEntInfo(leader)->invisibleClassStatus.status != STATUS_MOBILE && !HasHeldItem(leader, ITEM_MOBILE_SCARF)) - sub_804AE84(&leader->pos); - if (tile->terrainType & TERRAIN_TYPE_STAIRS) - gDungeon->unk1 = 1; - - tileObject = tile->object; - if (tileObject == NULL) - return; - switch (GetEntityType(tileObject)) - { - case ENTITY_TRAP: { - Trap *trap = GetTrapData(tileObject); - bool32 r8 = FALSE; - bool32 r7 = FALSE; - if (IQSkillIsEnabled(leader, IQ_TRAP_SEER) && !tileObject->isVisible) { - tileObject->isVisible = TRUE; - sub_8049ED4(); - r7 = TRUE; - } - if (trap->unk1 != 0) { - if (trap->unk1 == 1) - break; - if (trap->unk1 == 2) - r8 = TRUE; - if (r8 == FALSE) - break; - } - if (!r7) { - HandleTrap(leader, &leader->pos, 0, 1); - } - } - break; - case ENTITY_ITEM: { - Item *item = GetItemData(tileObject); - if (!(item->flags & ITEM_FLAG_IN_SHOP)) { - sub_8045DB4(&leader->pos, 1); - } - else { - gDungeon->unk5C0 = 4; - } - } - break; - case ENTITY_NOTHING: - case ENTITY_MONSTER: - case ENTITY_UNK_4: - case ENTITY_UNK_5: - default: - break; - } -} - -extern Entity *sub_80696A8(Entity *a0); -extern u8 sub_806A538(s32); - -bool8 sub_805EF60(Entity *a0, EntityInfo *a1) -{ - Entity *r4 = sub_80696A8(a0); - - if (r4 == NULL) - return FALSE; - if (GetEntityType(r4) != ENTITY_MONSTER) - return FALSE; - if (!sub_8070BC0(a0)) - return FALSE; - if (GetEntInfo(r4)->isNotTeamMember && GetEntInfo(r4)->monsterBehavior != BEHAVIOR_RESCUE_TARGET && GetEntInfo(r4)->shopkeeper != 1) - return FALSE; - - SetMonsterActionFields(&a1->action, ACTION_TALK_FIELD); - return TRUE; -} - -void sub_805EFB4(Entity *a0, bool8 a1) -{ - s32 i; - EntityInfo *leaderInfo = GetLeaderInfo(); - if (a1 && leaderInfo->cringeClassStatus.status == STATUS_COWERING) { - leaderInfo->action.direction += 4; - leaderInfo->action.direction &= 7; - } - else if (leaderInfo->cringeClassStatus.status == STATUS_CONFUSED) { - s32 rnd = DungeonRandInt(8); - for (i = 0; i < 8; i++) { - if (a1 || CanMoveInDirection(a0, rnd)) { - leaderInfo->action.direction = rnd & 7; - return; - } - rnd = (rnd + 1) & 7; - } - } -} - -extern void sub_803EAF0(u32, u8 *); -extern void sub_803F508(Entity *); -extern void sub_8041AD0(Entity *pokemon); -extern void sub_8041AE0(Entity *pokemon); -extern void sub_807EC28(bool8); -extern void sub_8083CE0(u8 param_1); - -extern MenuInputStruct gUnknown_202EE10; - -void sub_805F02C(void) -{ - s32 i; - Entity *r7 = gDungeon->unkBC; - Entity *leader = GetLeader(); - EntityInfo *r8 = GetEntInfo(r7); - EntityInfo *leaderInfo = GetEntInfo(leader); - - if (r8->isTeamLeader) { - DisplayDungeonLoggableMessageTrue(r7, gUnknown_80F9BD8); - } - else if (sub_8047084(ITEM_FLAG_IN_SHOP) || sub_807EF48()) { - DisplayDungeonLoggableMessageTrue(r7, gUnknown_80F9C08); - } - else if (gDungeon->unk644.unk2A) { - DisplayDungeonLoggableMessageTrue(r7, gUnknown_80F9C2C); - } - else { - gDungeon->unk644.unk35 = 0; - r8->isTeamLeader = TRUE; - leaderInfo->isTeamLeader = FALSE; - for (i = 0; i < 4; i++) { - PokemonStruct2 *mon = &gRecruitedPokemonRef->pokemon2[i]; - PokemonStruct1 *r5 = NULL; - - if ((u8)mon->unk0 & 1) { - if (!sub_806A538(mon->unkA)) { - r5 = &gRecruitedPokemonRef->pokemon[mon->unkA]; - } - if (i == r8->teamIndex) { - mon->isTeamLeader = TRUE; - if (r5 != NULL) { - r5->isTeamLeader = TRUE; - } - } - else { - mon->isTeamLeader = FALSE; - if (r5 != NULL) { - r5->isTeamLeader = FALSE; - } - } - } - } - gLeaderPointer = NULL; - r8->action = leaderInfo->action; - sub_803F508(r7); - sub_8041AD0(leader); - sub_8041AE0(GetLeader()); - SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], r7, 0); - LogMessageByIdWithPopupCheckUser(r7, gUnknown_80F9BB0); - sub_807EC28(FALSE); - r8->unk64 = 0; - leaderInfo->unk64 = 0; - sub_806A6E8(leader); - sub_806A6E8(r7); - } -} - -ActionContainer *GetLeaderActionContainer(void) -{ - return &GetLeaderInfo()->action; -} - -u16 GetLeaderActionId(void) -{ - return GetLeaderInfo()->action.action; -} - -// Could this be a start of a new file? -static UNUSED EWRAM_DATA u8 sUnused[4] = {0}; -static EWRAM_DATA ActionParameter sUnknownActionUnk4 = {0}; -static EWRAM_DATA s32 sUnknown_202F240 = 0; -static UNUSED EWRAM_DATA u8 sUnused2[4] = {0}; -static EWRAM_DATA s16 sUnknown_202F248[8] = {0}; -static EWRAM_DATA s32 sUnknown_202F258 = 0; -static UNUSED EWRAM_DATA u8 sUnused3[4] = {0}; -static EWRAM_DATA s32 sTeamMenuChosenId = 0; -static UNUSED EWRAM_DATA u8 sUnused4[4] = {0}; - -void ShowFieldMenu(u8 a0_, bool8 a1) -{ - Item *item; - s32 r10; - u8 a0 = a0_; // Needed to match. - s32 var_28; - s32 var_24; - struct UnkMenuBitsStruct var_30; - struct UnkMenuBitsStruct var_34; - - r10 = gDungeon->unk5C0; - var_28 = 0; - var_24 = (gDungeon->unk5C0 > - 1); - gDungeon->unk5C0 = -1; - if (r10 >= 0) { - var_28 = r10; - } - - if (a1) { - PlayFanfareSE(0x137, 0x100); - } - else { - sub_8083D44(); - } - - while (1) { - if (r10 < 0) { - sub_8044C10(1); - sTeamMenuChosenId = -1; - DrawFieldMenu(a0); - sub_806A2BC(GetLeader(), 0); - while (1) { - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x1D); - if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); - } - if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); - } - if ((gRealInputs.pressed & A_BUTTON || gUnknown_202EE10.unk28.a_button)) { - if (gUnknown_202749A[gUnknown_202EE10.menuIndex + 1] == 7) { - sub_8083D08(); - var_28 = gUnknown_202EE10.menuIndex; - break; - } - sub_8083D30(); - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - var_28 = -1; - break; - } - } - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x1D); - a0 = 1; - } - - r10 = var_28; - if (var_28 == 1) { - u16 action; - - sub_8044C10(1); - var_34.a0_8 = 0; - var_34.a0_16 = 1; - var_34.a0_24 = 0; - var_34.a0_32 = 0; - if (sub_805FD74(GetLeader(), &var_34)) { - r10 = -1; - } - if (sub_805FD3C(&var_34) && sub_805FD74(GetLeader(), &var_34)) { - sub_8044C10(1); - } - action = GetLeaderActionId(); - if (action == 12) { - sub_8044D90(GetLeader(), 0, 12)->flags |= ITEM_FLAG_UNPAID; - sub_8060D24(GetLeaderActionContainer()); - sub_8044C10(1); - } - else if (action == 53) { - item = sub_8044D90(GetLeader(), 0, 13); - if (!sub_8048A68(GetLeader(), item)) { - sub_8044C10(1); - } - } - else if (action == 16) { - item = sub_8044D90(GetLeader(), 0, 14); - if (!sub_8048950(GetLeader(), item)) { - sub_8044C10(1); - } - } - else if (action == 44) { - item = sub_8044D90(GetLeader(), 0, 15); - if (!sub_8048B9C(GetLeader(), item)) { - sub_8044C10(1); - } - } - else if (action == 60) { - HandleSetItemAction(GetLeader(), TRUE); - sub_8044C10(1); - sub_803E708(0x50, 0x4D); - sub_8052210(0); - break; - } - else if (action == 61) { - HandleUnsetItemAction(GetLeader(), TRUE); - sub_8044C10(1); - sub_803E708(0x50, 0x4D); - sub_8052210(0); - break; - } - - if (GetLeaderActionId() != 0) - break; - } - else if (var_28 == 2) { - sub_8044C10(1); - if (sub_8060E38(GetLeader())) { - r10 = -1; - } - - if (GetLeaderActionId() == 0x1B) { - sub_8061A38(GetLeaderActionContainer(), FALSE); - sub_8044C10(1); - } - else if (GetLeaderActionId() == 0x1C) { - sub_806752C(GetLeaderActionContainer()); - sub_8044C10(1); - } - else if (GetLeaderActionId() == 0x34) { - sub_8067768(GetLeaderActionContainer()); - sub_8044C10(1); - } - else if (GetLeaderActionId() == 0x1A) { - ShowTacticsMenu(GetLeaderActionContainer()); - sub_8044C10(1); - } - else if (GetLeaderActionId() == 0x30) { - sub_8061A38(GetLeaderActionContainer(), TRUE); - sub_8044C10(1); - } - else if (GetLeaderActionId() == 0x19) { - s32 i, count; - - sub_8062D8C(GetLeaderActionContainer()); - count = 0; - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon)) { - if (i == GetLeaderActionContainer()->actionParameters[0].actionUseIndex) { - sTeamMenuChosenId = count; - if (GetLeaderActionId() != 0) { - sub_806A2BC(teamMon, 0); - } - break; - } - count++; - } - } - } - - if (GetLeaderActionId() != 0) - break; - } - else if (var_28 == 0) { - s32 i, r7, r8, r9, r4; - Entity *r6; - - r7 = 0; - sub_8044C10(1); - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon)) { - if (GetEntInfo(teamMon)->isTeamLeader) { - r7 = i; - break; - } - } - } - - - while (1) { - sub_8044C10(0); - LOOP_START_NO_CALL: // Actions 6 and 7 don't call sub_8044C10 - r6 = NULL; - r9 = 0; - r8 = 0; - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (sub_8071A8C(teamMon)) { - if (i == r7) { - r9 = r8; - r6 = teamMon; - } - r8++; - } - } - if (r6 == NULL) { - r6 = GetLeader(); - } - - sub_806A2BC(r6, 0); - sub_804A728(&r6->pos, 0, 1, 1); - GetLeaderInfo()->action.actionParameters[0].actionUseIndex = r7; - sub_8044C10(0); - if (sub_8062F90(r6, 0, 1, r9, r8)) { - r10 = -1; - } - - if (GetLeaderActionId() == 6) { - r4 = r7; - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - if (++r7 >= MAX_TEAM_MEMBERS) { - r7 = 0; - } - r6 = gDungeon->teamPokemon[r7]; - if (sub_8071A8C(r6)) - break; - } - GetLeaderInfo()->action.actionParameters[0].actionUseIndex = r7; - if (r4 != r7) { - sub_8083CE0(0); - } - goto LOOP_START_NO_CALL; - } - else if (GetLeaderActionId() == 7) { - r4 = r7; - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - if (--r7 < 0) { - r7 = MAX_TEAM_MEMBERS - 1; - } - r6 = gDungeon->teamPokemon[r7]; - if (sub_8071A8C(r6)) - break; - } - GetLeaderInfo()->action.actionParameters[0].actionUseIndex = r7; - if (r4 != r7) { - sub_8083CE0(0); - } - goto LOOP_START_NO_CALL; - } - else if (GetLeaderActionId() == 0x1D) { - sub_80637E8(GetLeaderActionContainer()); - } - else if (GetLeaderActionId() == 0x1E || GetLeaderActionId() == 0x33) { - sub_8063A70(GetLeaderActionContainer(), FALSE); - } - else if (GetLeaderActionId() == 0x1F) { - sub_8063B54(GetLeaderActionContainer()); - } - else if (GetLeaderActionId() == 0x20) { - sub_8063BB4(GetLeaderActionContainer()); - } - else if (GetLeaderActionId() == 0x21) { - sub_8063CF0(GetLeaderActionContainer(), FALSE); - } - else { - break; - } - } - sub_806A2BC(GetLeader(), 0); - sub_804A728(&GetLeader()->pos, 0, 1, 1); - if (GetLeaderActionId() != 0) - break; - } - else if (var_28 == 4) { - Entity *leader = GetLeader(); - const Tile *tile = GetTile(leader->pos.x, leader->pos.y); - Entity *tileObject = tile->object; - if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_ITEM) { - u16 action; - - sub_8044C10(1); - var_30.a0_8 = 0; - var_30.a0_16 = 1; - var_30.a0_24 = 1; - var_30.a0_32 = 1; - if (sub_805FD74(GetLeader(), &var_30)) { - // This actually doesn't do anything, it's just there to make the code match as the compiler does a `lsl r0, r0, #0x10, mov r0, r4` - ASM_MATCH_TRICK(leader); - } - if (sub_805FD3C(&var_30) && sub_805FD74(GetLeader(), &var_30)) { - sub_8044C10(1); - } - - action = GetLeaderActionId(); - if (action == 0xC) { - sub_8044D90(GetLeader(), 0, 0x10)->flags |= ITEM_FLAG_UNPAID; - sub_8060D24(GetLeaderActionContainer()); - sub_8044C10(1); - } - else if (action == 0x35) { - item = sub_8044D90(GetLeader(), 0, 0x11); - if (!sub_8048A68(GetLeader(), item)) { - sub_8044C10(1); - } - } - else if (action == 0x10) { - item = sub_8044D90(GetLeader(), 0, 0x12); - if (!sub_8048950(GetLeader(), item)) { - sub_8044C10(1); - } - } - else if (action == 0x2C) { - item = sub_8044D90(GetLeader(), 0, 0x13); - if (!sub_8048B9C(GetLeader(), item)) { - sub_8044C10(1); - } - } - if (GetLeaderActionId() != 0) - break; - } - else if (GetEntityType(tileObject) == ENTITY_TRAP) { - sub_8044C10(1); - sub_80643AC(GetLeader()); - if (GetLeaderActionId() != 0) - break; - } - } - else - { - if (tile->terrainType & TERRAIN_TYPE_STAIRS) { - sub_8044C10(1); - sub_80647F0(GetLeader()); - if (GetLeaderActionId() != 0) - break; - } - else { - SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], GetLeader(), 0); - DisplayDungeonMessage(0, gUnknown_80FDE18, 1); - } - } - r10 = -1; - } - else if (var_28 == 3) { - sub_8064BE0(); - if (gDungeon->unk4) - break; - if (GetLeaderActionId() != 0) - break; - r10 = -1; - } - - if (var_28 < 0) - break; - - if (var_24 == 0) { - ResetRepeatTimers(); - ResetUnusedInputStruct(); - } - else { - sub_806A2BC(GetLeader(), 0); - break; - } - } - - sub_803EAF0(0, NULL); - ResetRepeatTimers(); - ResetUnusedInputStruct(); -} - -extern const u8 *const gFieldMenuMovesPtr; -extern const u8 *const gFieldMenuItemsPtr; -extern const u8 *const gFieldMenuTeamPtr; -extern const u8 *const gFieldMenuOthersPtr; -extern const u8 *const gFieldMenuGroundPtr; -extern const u8 *const gUnknown_80F9174; -extern const u8 *const gUnknown_80F9190; -extern const u8 *const gUnknown_80F91C8; -extern const u8 *const gUnknown_80F91E0; -extern const u8 *const gUnknown_80F91A8; -extern const u8 *const gUnknown_80FE954; - -const u8 *GetCurrentDungeonName(void); -void GetWeatherName(u8 *dst, u8 weatherId); - -extern s32 gFormatArgs[]; - -void DrawFieldMenu(u8 a0) -{ - s32 i, x, y, yLoop; - - gUnknown_202EE10.menuIndex = 0; - gUnknown_202EE10.unk1A = 5; - gUnknown_202EE10.unk1C = 5; - gUnknown_202EE10.unk1E = 0; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.firstEntryY = 2; - gUnknown_202EE10.unkC = 0; - gUnknown_202EE10.unkE = 0; - gUnknown_202EE10.unk0 = 0; - gUnknown_202EE10.unk14.x = 0; - sub_801317C(&gUnknown_202EE10.unk28); - sub_80137B0(&gUnknown_202EE10, 0x38); - if (a0) { - sub_803EAF0(7, NULL); - } - else { - sub_803EAF0(6, NULL); - } - - sub_80073B8(0); - if (ShouldMonsterRunAwayAndShowEffect(GetLeader(), TRUE)) { - gUnknown_202749A[1] = 2; - gUnknown_202749A[2] = 2; - gUnknown_202749A[3] = 2; - gUnknown_202749A[4] = 7; - gUnknown_202749A[5] = 2; - } - else - { - gUnknown_202749A[1] = 7; - gUnknown_202749A[2] = 7; - gUnknown_202749A[3] = 7; - gUnknown_202749A[4] = 7; - gUnknown_202749A[5] = 7; - } - - y = GetMenuEntryYCoord(&gUnknown_202EE10, 0); - PrintStringOnWindow(8, y, gFieldMenuMovesPtr, 0, 0); - - y = GetMenuEntryYCoord(&gUnknown_202EE10, 1); - PrintStringOnWindow(8, y, gFieldMenuItemsPtr, 0, 0); - - y = GetMenuEntryYCoord(&gUnknown_202EE10, 2); - PrintStringOnWindow(8, y, gFieldMenuTeamPtr, 0, 0); - - y = GetMenuEntryYCoord(&gUnknown_202EE10, 3); - PrintStringOnWindow(8, y, gFieldMenuOthersPtr, 0, 0); - - y = GetMenuEntryYCoord(&gUnknown_202EE10, 4); - PrintStringOnWindow(8, y, gFieldMenuGroundPtr, 0, 0); - - sub_80073E0(0); - if (a0) { - u32 hours, minutes, seconds; - EntityInfo *leaderInfo = GetEntInfo(GetLeader()); - const u8 *dungeonName = GetCurrentDungeonName(); - - x = (136 - sub_8008ED0(dungeonName)) / 2; - sub_80073B8(1); - PrintStringOnWindow(x, 2, dungeonName, 1, 0); - sub_80073E0(1); - sub_80073B8(2); - DeconstructPlayTime(gPlayTimeRef, &hours, &minutes, &seconds); - - gFormatArgs[0] = FixedPointToInt(leaderInfo->belly); - gFormatArgs[1] = FixedPointToInt(leaderInfo->maxBelly); - PrintFormattedStringOnWindow(0x73, 0, gUnknown_80F9174, 2, 0); - - gFormatArgs[0] = gTeamInventoryRef->teamMoney; - PrintFormattedStringOnWindow(0x73, 12, gUnknown_80F9190, 2, 0); - - GetWeatherName(gFormatBuffer_Monsters[0], GetApparentWeather(NULL)); - PrintFormattedStringOnWindow(0x73, 24, gUnknown_80F91A8, 2, 0); - - gFormatArgs[0] = hours; - gFormatArgs[1] = minutes; - gFormatArgs[2] = seconds; - PrintFormattedStringOnWindow(0x73, 36, gUnknown_80F91C8, 2, 0); - for (yLoop = 0, i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon)) { - EntityInfo *monInfo = GetEntInfo(teamMon); - SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], teamMon, 0); - gFormatArgs[0] = monInfo->HP; - gFormatArgs[1] = monInfo->maxHPStat; - PrintFormattedStringOnWindow(4, yLoop, gUnknown_80F91E0, 2, 0); - yLoop += 12; - if (yLoop >= 12 * MAX_TEAM_MEMBERS) - break; - } - } - sub_80073E0(2); - } -} - -bool8 sub_805FBE8(u8 *a0) -{ - s32 r4; - sub_803EAF0(8, a0); - do - { - sub_803E46C(0xE); - DrawDialogueBoxString(); - r4 = sub_8016080(); - } while (r4 == 0); - CleanConfirmNameMenu(); - sub_803E46C(0xE); - sub_803EAF0(0, NULL); - if (r4 == 3 && *a0 != 0) - return TRUE; - - return FALSE; -} - -extern u8 *sub_8044EC8(s32 param_1); -extern bool8 sub_8044F3C(s32 param_1); -extern s32 gUnknown_202EE6C; -extern const u8 gUnknown_8106B50[]; - -extern void sub_803ECB4(Windows *a0, u8 a1); -static void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, Windows *a4, WindowHeader *a5); - -// Inline needed to (fake?)match. -static inline void sub_805FC30_SetUpTxtStruct(Windows *src) -{ - memset(src, 0, sizeof(*src)); - src->id[0].type = WINDOW_TYPE_NORMAL; - src->id[1].type = WINDOW_TYPE_NORMAL; - src->id[1].pos.x = 0x16; - src->id[1].pos.y = 4; - src->id[1].width = 6; - src->id[1].height = 4; - src->id[1].unk10 = 4; - src->id[2].type = WINDOW_TYPE_NORMAL; - src->id[3].type = WINDOW_TYPE_NORMAL; -} - -void sub_805FC30(Windows *a0, s32 a1) -{ - s32 i; - Windows sp; - - sub_805FC30_SetUpTxtStruct(&sp); - sp.id[0] = a0->id[0]; - sp.id[0].unk0 = 0x80; - - gUnknown_202EE10.menuIndex = 0; - gUnknown_202EE10.unk1C = gUnknown_202EE6C; - gUnknown_202EE10.unk1A = gUnknown_202EE6C; - gUnknown_202EE10.unk1E = 0; - gUnknown_202EE10.unk20 = 0; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.firstEntryY = 0; - gUnknown_202EE10.unk0 = 1; - gUnknown_202EE10.unkC = 0; - gUnknown_202EE10.unkE = 0; - gUnknown_202EE10.unk14 = gUnknown_202EE10.unk8; - - sub_801317C(&gUnknown_202EE10.unk28); - - sp.id[1].pos.x = a1; - sp.id[1].width = 28 - a1; - sp.id[1].height = sp.id[1].unk10 = sub_80095E4(gUnknown_202EE10.unk1C, 0); - sub_803ECB4(&sp, 0); - sub_80137B0(&gUnknown_202EE10, sp.id[1].height * 8); - sub_80073B8(1); - - for (i = 0; i < gUnknown_202EE6C; i++) { - s32 r4, y; - u8 text[20]; - - r4 = (sub_8044F3C(i) != 0) ? 7 : 2; - sprintfStatic(text, gUnknown_8106B50, r4, sub_8044EC8(i)); - y = GetMenuEntryYCoord(&gUnknown_202EE10, i); - PrintStringOnWindow(8, y, text, 1, 0); - } - sub_80073E0(1); -} - -bool8 sub_805FD3C(struct UnkMenuBitsStruct *a0) -{ - u16 action = GetLeaderActionId(); - - a0->a0_8 = 0; - a0->a0_16 = 0; - a0->a0_24 = 0; - a0->a0_32 = 0; - if (action == 0xA) { - a0->a0_8 = 1; - a0->a0_32 = 1; - } - if (action == 0x3E) { - a0->a0_8 = 1; - a0->a0_16 = 0; - a0->a0_32 = 1; - } - return a0->a0_8; -} - -s32 sub_8060D64(s16 *a0, bool8 a1, bool8 a2, bool8 a3, Entity *a4); - -void sub_8060890(DungeonPos *a0); -bool8 sub_8060860(s32 a0); -void sub_8060900(Entity *a0); -s32 sub_8060800(WindowHeader *a0, s32 a1); -void sub_8060CE8(ActionContainer *a0); -extern Entity *DrawFieldGiveItemMenu(u8 *a0, s32 a1); - -bool8 sub_805FD74(Entity * a0, struct UnkMenuBitsStruct *a1) -{ - s32 i, i_r6; - s32 r8; - s32 r9 = 0; - - u8 var_34 = 1; - u8 var_30 = 0; - u8 var_2C = 0; - u8 var_28 = 0; - EntityInfo *a0Info = GetEntInfo(a0); - WindowHeader var_3C; - - Windows var_FC = - { - .id = - { - [0] = - { - .type = WINDOW_TYPE_WITH_HEADER, - .pos = {2, 2}, - .width = 0x12, - .height = 0x10, - .unk10 = 0x10, - .unk14 = &var_3C, - }, - WINDOW_DUMMY, WINDOW_DUMMY, WINDOW_DUMMY - }, - }; - - sUnknownActionUnk4.actionUseIndex = 0; - sUnknownActionUnk4.itemPos.x = 0; - sUnknownActionUnk4.itemPos.y = 0; - if (a1 != NULL) { - var_2C = (a1->a0_8 != 0); - var_34 = (a1->a0_16 != 0); - var_30 = (a1->a0_24 != 0); - var_28 = (a1->a0_32 != 0); - } - - sUnknown_202F258 = sub_8060D64(sUnknown_202F248, var_30, var_34, var_28, a0); - if (sUnknown_202F258 == 0) { - DisplayDungeonMessage(0, gUnknown_80F8B24, 1); - return TRUE; - } - - r8 = 0; - sUnknown_202F240 = 0; - while (1) - { - s32 id; - Entity *r4; - - r9 = 0; - for (i = 0; i < INVENTORY_SIZE; i++) { - Item *item = &gTeamInventoryRef->teamItems[i]; - if (item->flags & ITEM_FLAG_EXISTS && item->flags & ITEM_FLAG_UNPAID) { - item->flags &= ~(ITEM_FLAG_UNPAID); - r8 = i / 10; - sUnknown_202F240 = i % 10; - } - } - for (i_r6 = 0; i_r6 < MAX_TEAM_MEMBERS; i_r6++) { - Entity *teamMon = gDungeon->teamPokemon[i_r6]; - if (EntityIsValid(teamMon)) { - EntityInfo *monInfo = GetEntInfo(teamMon); - if (monInfo->heldItem.flags & ITEM_FLAG_EXISTS && monInfo->heldItem.flags & ITEM_FLAG_UNPAID) { - monInfo->heldItem.flags &= ~(ITEM_FLAG_UNPAID); - for (i = 0; i < sUnknown_202F258; i++) { - if (sUnknown_202F248[i] == i_r6 + 4) { - r8 = i; - break; - } - } - sUnknown_202F240 = 0; - } - } - } - CreateFieldItemMenu(r8, a0, var_2C, var_30, &var_FC, &var_3C); - - id = sUnknown_202F248[gUnknown_202EE10.unk1E]; - if (id >= MAX_TEAM_MEMBERS) { - r4 = gDungeon->teamPokemon[id - MAX_TEAM_MEMBERS]; - } - else { - r4 = a0; - } - sub_806A2BC(r4, 0); - sub_804A728(&r4->pos, 0, 1, 1); - - while (1) { - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x14); - if (!var_30) { - if (sUnknown_202F258 > 1) { - if ((gRealInputs.pressed & DPAD_LEFT) || gUnknown_202EE10.unk28.dpad_left) { - sub_8083CE0(0); - if (--r8 < 0) { - r8 = sUnknown_202F258 - 1; - } - sUnknown_202F240 = var_30; - break; - } - if ((gRealInputs.pressed & DPAD_RIGHT) || gUnknown_202EE10.unk28.dpad_right) { - sub_8083CE0(0); - if (++r8 == sUnknown_202F258) { - r8 = 0; - } - sUnknown_202F240 = var_30; - break; - } - } - if (gRealInputs.repeated & DPAD_DOWN && sub_8060860(r8)) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); - } - if (gRealInputs.repeated & DPAD_UP && sub_8060860(r8)) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); - } - if (gRealInputs.pressed & SELECT_BUTTON && sUnknown_202F248[r8] <= 1) { - s32 r3; - bool32 r7 = TRUE; - s16 arr[10]; - - PlaySoundEffect(0x132); - sub_8047158(); - ConvertMoneyItemToMoney(); - sUnknown_202F240 = 0; - r3 = sub_8060D64(arr, var_30, var_34, var_28, a0); - if (sUnknown_202F258 == r3) { - for (i_r6 = 0; i_r6 < r3; i_r6++) { - if (arr[i_r6] != sUnknown_202F248[i_r6]) { - break; - } - } - if (i_r6 == r3) { - r7 = FALSE; - } - } - if (r7) { - r8 = 0; - sUnknown_202F240 = 0; - sUnknown_202F258 = r3; - for (i_r6 = 0; i_r6 < sUnknown_202F258; i_r6++) { - sUnknown_202F248[i_r6] = arr[i_r6]; - } - } - break; - } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - sub_8083D08(); - sub_8060890(&a0->pos); - r9 = 1; - break; - } - if (gRealInputs.pressed & START_BUTTON) { - sub_8083D44(); - sub_8060890(&a0->pos); - r9 = 3; - break; - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - r9 = 2; - break; - } - } - else { - sub_8060890(&a0->pos); - r9 = 1; - break; - } - } - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x14); - if (sUnknown_202F248[gUnknown_202EE10.unk1E] <= 1 && !(gTeamInventoryRef->teamItems[0].flags & ITEM_FLAG_EXISTS)) { - r9 = 2; - } - - if (r9 == 2) { - sub_803EAF0(0, NULL); - r9 = 1; - break; - } - else if (r9 == 0) { - continue; - } - else if (r9 == 3) { - SetMonsterActionFields(&a0Info->action, 0xC); - a0Info->action.actionParameters[0] = sUnknownActionUnk4; - sub_803EAF0(0, NULL); - r9 = 0; - break; - } - else { - sUnknown_202F240 = gUnknown_202EE10.menuIndex; - if (var_2C != 0) { - a0Info->action.actionParameters[1] = sUnknownActionUnk4; - sub_803EAF0(0, NULL); - r9 = 0; - break; - } - - sub_8060900(a0); - sub_8060800(&var_3C, gUnknown_202EE10.unk1E); - sub_805FC30(&var_FC, 0x16); - while (1) { - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x14); - if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); - } - if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); - } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - if (sub_8044F3C(gUnknown_202EE10.menuIndex)) { - sub_8083D08(); - sub_8060CE8(&a0Info->action); - r9 = 0; - break; - } - sub_8083D30(); - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - r9 = 1; - break; - } - } - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x14); - gDungeon->unk181e8.unk18212 = 0; - if (r9 != 1 || var_30 != 0) { - if (a0Info->action.action == 0x37 || a0Info->action.action == 0x38 || a0Info->action.action == 0x3E) { - // Hm... - int newAction = sUnknownActionUnk4.actionUseIndex - 0x90; - a0Info->action.actionParameters[0].actionUseIndex = newAction; - sub_803EAF0(0, 0); - r9 = 0; - break; - } - else if (a0Info->action.action == 0x36) { - u32 var_38; - if (DrawFieldGiveItemMenu((void*)&var_38, 2) != NULL) { - a0Info->action.actionParameters[1].actionUseIndex = var_38; - sub_803EAF0(0, 0); - r9 = 0; - break; - } - sub_803EAF0(0, NULL); - sub_8044C10(1); - } - else { - sub_803EAF0(0, 0); - r9 = 0; - break; - } - } - } - } - - gDungeon->unk181e8.unk18212 = 0; - sub_803E708(2, 0x61); - sub_804AA60(); - sub_803E708(2, 0x61); - return r9; -} - -extern const struct Window gUnknown_8106B6C; -extern const struct unkStruct_8090F58 gUnknown_8106B60; - -static void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, Windows *windows, WindowHeader *a5) -{ - s32 i, x, y; - s32 r10; - UnkTextStruct1 *txtStrPtr; - Window var_94; - u8 txtBuff[80]; - EntityInfo *a1Info; - - var_94 = gUnknown_8106B6C; - a1Info = GetEntInfo(a1); - r10 = sub_8060800(a5, a0); - gUnknown_202EE10.menuIndex = sUnknown_202F240; - gUnknown_202EE10.unk1A = 0; - gUnknown_202EE10.unk1E = a0; - gUnknown_202EE10.unk20 = sUnknown_202F258; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.unk0 = 0; - gUnknown_202EE10.unk14.x = 0; - sub_801317C(&gUnknown_202EE10.unk28); - gDungeon->unk181e8.unk18212 = 0; - switch (sUnknown_202F248[a0]) { - case 0: - case 1: - windows->id[0].unk10 = 0x10; - windows->id[0].height = 0x10; - a5->f2 = 0xC; - gUnknown_202EE10.firstEntryY = 0x10; - gUnknown_202EE10.unk1C = 0xA; - gDungeon->unk181e8.unk18212 = 1; - break; - case 2: - windows->id[0].unk10 = 4; - windows->id[0].height = 4; - a5->f2 = 6; - gUnknown_202EE10.firstEntryY = 0x12; - gUnknown_202EE10.unk1C = 1; - break; - case 3: - default: - windows->id[0].unk10 = 4; - windows->id[0].height = 4; - a5->f2 = 0xC; - gUnknown_202EE10.firstEntryY = 0x12; - gUnknown_202EE10.unk1C = 1; - break; - } - - if (a2) { - gUnknown_202EE10.unkC += 0x40; - windows->id[0].pos.x = 0xA; - windows->id[1] = var_94; - } - else { - windows->id[0].pos.x = 2; - windows->id[1] = windows->id[3]; - } - - sub_803ECB4(windows, 1); - txtStrPtr = &gUnknown_2027370[0]; - gUnknown_202EE10.unkC = (txtStrPtr->unk0 + 0x10) * 8; - gUnknown_202EE10.unkE = ((txtStrPtr->unk2 + 1) * 8) - 2; - sub_80137B0(&gUnknown_202EE10, 0x70); - sub_80073B8(0); - x = ((a0 - r10) * 8) + 0xC; - switch (sUnknown_202F248[a0]) - { - case 0: - PrintFormattedStringOnWindow(x, 0, gTeamToolboxAPtr, 0, 0); - for (i = 0; i < 10; i++) { - if (ItemExists(&gTeamInventoryRef->teamItems[i])) { - gUnknown_202EE10.unk1A++; - sub_8090E14(txtBuff, &gTeamInventoryRef->teamItems[i], &gUnknown_8106B60); - y = GetMenuEntryYCoord(&gUnknown_202EE10, i); - PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); - } - else { - break; - } - } - break; - case 1: - PrintFormattedStringOnWindow(x, 0, gTeamToolboxBPtr, 0, 0); - for (i = 0; i < 10; i++) { - if (ItemExists(&gTeamInventoryRef->teamItems[i + 10])) { - gUnknown_202EE10.unk1A++; - sub_8090E14(txtBuff, &gTeamInventoryRef->teamItems[i + 10], &gUnknown_8106B60); - y = GetMenuEntryYCoord(&gUnknown_202EE10, i); - PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); - } - else { - break; - } - } - break; - case 2: { - const Tile *tile = GetTile(a1->pos.x, a1->pos.y); - Item *item = GetItemData(tile->object); - PrintFormattedStringOnWindow(x, 0, gFieldItemMenuGroundTextPtr, 0, 0); - if (item->flags & ITEM_FLAG_EXISTS) { - gUnknown_202EE10.unk1A++; - sub_8090E14(txtBuff, item, &gUnknown_8106B60); - y = GetMenuEntryYCoord(&gUnknown_202EE10, 0); - PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); - } - if (a3) { - gUnknown_202EE10.unk8.x = gUnknown_202EE10.unk8.y = 0; - } - } - break; - case 3: { - Item *item = &GetEntInfo(a1)->heldItem; - SetMessageArgument_2(gFormatBuffer_Monsters[0], a1Info, 0); - PrintFormattedStringOnWindow(x, 0, gUnknown_80FE940, 0, 0); - if (item->flags & ITEM_FLAG_EXISTS) { - gUnknown_202EE10.unk1A++; - sub_8090E14(txtBuff, item, &gUnknown_8106B60); - y = GetMenuEntryYCoord(&gUnknown_202EE10, 0); - PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); - } - } - break; - default: { - Entity *chosenTeamMember = gDungeon->teamPokemon[sUnknown_202F248[a0] - MAX_TEAM_MEMBERS]; - if (EntityIsValid(chosenTeamMember)) { - EntityInfo *monInfo = GetEntInfo(chosenTeamMember); - Item *item = &monInfo->heldItem; - SetMessageArgument_2(gFormatBuffer_Monsters[0], monInfo, 0); - PrintFormattedStringOnWindow(x, 0, gUnknown_80FE940, 0, 0); - if (item->flags & ITEM_FLAG_EXISTS) { - gUnknown_202EE10.unk1A++; - sub_8090E14(txtBuff, item, &gUnknown_8106B60); - y = GetMenuEntryYCoord(&gUnknown_202EE10, 0); - PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); - } - } - } - break; - } - - if (gUnknown_202EE10.menuIndex >= gUnknown_202EE10.unk1A) { - gUnknown_202EE10.menuIndex = 0; - } - sub_80073E0(0); - if (a2) { - sub_80073B8(1); - PrintFormattedStringOnWindow(4, 2, gWhichTextPtr1, 1, 0); - sub_80073E0(1); - } -} - -s32 sub_8060800(WindowHeader *a0, s32 a1) -{ - s32 i, r1, r2, r3; - - r1 = 0; - for (i = 0; i < sUnknown_202F258; i++) { - if (sUnknown_202F248[i] <= 1) { - r1++; - } - } - - if (sUnknown_202F248[a1] <= 1) { - r3 = a1; - r2 = r1; - r1 = 0; - } - else { - r3 = a1 - r1; - r2 = sUnknown_202F258 - r1; - } - - if (a0 != NULL) { - a0->f0 = r2; - a0->f1 = r3; - a0->f3 = 0; - } - - return r1; -} - -bool8 sub_8060860(s32 a0) -{ - if (gUnknown_202EE10.unk1A <= 1 || sUnknown_202F248[a0] > 1) - return FALSE; - else - return TRUE; -} - -void sub_8060890(DungeonPos *a0) -{ - s32 var = sUnknown_202F248[gUnknown_202EE10.unk1E]; - switch (var) - { - case 0: - sUnknownActionUnk4.actionUseIndex = gUnknown_202EE10.menuIndex + 1; - break; - case 1: - sUnknownActionUnk4.actionUseIndex = gUnknown_202EE10.menuIndex + 11; - break; - case 2: - sUnknownActionUnk4.actionUseIndex = 128; - break; - default: - sUnknownActionUnk4.actionUseIndex = var - 116; - break; - } - - sUnknownActionUnk4.itemPos.x = a0->x; - sUnknownActionUnk4.itemPos.y = a0->y; -} - -extern Item * sub_8044CC8(Entity *param_1, ActionParameter *param_2, UNUSED s32 a3); -extern void sub_8044F5C(u16 param_1, u8 param_2); -extern void sub_8044FF0(u16 param_1); -extern u16 sub_8044DC8(Item *param_1); -extern bool8 sub_8046F00(Item *item); -extern void sub_8045064(void); - -void sub_8060900(Entity *a0) -{ - u16 val_sub8044DC8; - Item *item = sub_8044CC8(a0, &sUnknownActionUnk4, 0xA); - EntityInfo *a0Info = GetEntInfo(a0); - - gUnknown_202EE6C = 0; - if (sUnknownActionUnk4.actionUseIndex < 144) { - if (sUnknownActionUnk4.actionUseIndex == 128) { - sub_8044F5C(9, item->id); - if (GetItemCategory(item->id) != CATEGORY_POKE) { - bool32 r2 = 0; - if (gDungeon->unk644.unk17 != 0) { - if (gTeamInventoryRef->teamItems[INVENTORY_SIZE - 1].flags & ITEM_FLAG_EXISTS) { - r2 = TRUE; - } - } - else if (a0Info->heldItem.flags & ITEM_FLAG_EXISTS) { - r2 = TRUE; - } - - if (r2) { - sub_8044FF0(9); - } - } - } - if (sUnknownActionUnk4.actionUseIndex == 128 && gDungeon->unk644.unk17 != 0) { - sub_8044F5C(10, item->id); - } - val_sub8044DC8 = sub_8044DC8(item); - if (val_sub8044DC8 != 0) { - sub_8044F5C(val_sub8044DC8, item->id); - if (item->flags & ITEM_FLAG_STICKY) { - sub_8044FF0(val_sub8044DC8); - } - if (!sub_8046F00(item)) { - sub_8044FF0(val_sub8044DC8); - } - } - - if (sUnknownActionUnk4.actionUseIndex <= 20 - && (GetItemCategory(item->id) == CATEGORY_THROWN_LINE || GetItemCategory(item->id) == CATEGORY_THROWN_ARC)) - { - s32 i; - - if (ItemSet(item)) { - sub_8044F5C(0x3D, item->id); - } - else { - sub_8044F5C(0x3C, item->id); - } - - for (i = 0; i < INVENTORY_SIZE; i++) { - if (ItemExists(&gTeamInventoryRef->teamItems[i]) - && ItemSet(&gTeamInventoryRef->teamItems[i]) - && ItemSticky(&gTeamInventoryRef->teamItems[i])) - { - sub_8044FF0(0x3C); - sub_8044FF0(0x3D); - break; - } - } - } - - if (sUnknownActionUnk4.actionUseIndex != 129) { - if (sUnknownActionUnk4.actionUseIndex != 128) { - s32 i; - bool32 r8 = FALSE; - - sub_8044F5C(0x36, item->id); - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon)) { - EntityInfo *teamMonInfo = GetEntInfo(teamMon); - teamMonInfo->unk157 = FALSE; - if (!CheckVariousConditions(teamMon)) { - r8 = TRUE; - teamMonInfo->unk157 = TRUE; - } - } - } - if (!r8) { - sub_8044FF0(0x36); - } - } - } - else if (gDungeon->unk644.unk17) { - if (gTeamInventoryRef->teamItems[INVENTORY_SIZE - 1].flags & ITEM_FLAG_EXISTS) { - sub_8044F5C(0x3E, item->id); - } - else { - sub_8044F5C(0x37, item->id); - } - - if (CheckVariousConditions(a0)) { - sub_8044FF0(0x37); - sub_8044FF0(0x3E); - } - } - - if (sUnknownActionUnk4.actionUseIndex <= 20) { - Entity *tileEntity = GetTile(a0->pos.x, a0->pos.y)->object; - if (tileEntity == NULL) { - sub_8044F5C(8, item->id); - } - else if (GetEntityType(tileEntity) == ENTITY_ITEM) { - sub_8044F5C(0x3A, item->id); - } - } - - if (GetItemCategory(item->id) == CATEGORY_THROWN_LINE) { - sub_8044F5C(0x27, item->id); - } - else if (GetItemCategory(item->id) == CATEGORY_THROWN_ARC) { - sub_8044F5C(0x41, item->id); - } - else { - sub_8044F5C(0xB, item->id); - } - - if (!MonsterCanThrowItems(a0Info)) { - sub_8044FF0(0x27); - sub_8044FF0(0x41); - sub_8044FF0(0xB); - } - } - else { - s32 index = sUnknownActionUnk4.actionUseIndex - 144; - Entity *teamMon = gDungeon->teamPokemon[index]; - if (EntityIsValid(teamMon)) { - bool32 r5, r6, r4; - EntityInfo *teamMonInfo = GetEntInfo(teamMon); - - r5 = FALSE; - if (CheckVariousConditions(teamMon)) - r6 = TRUE; - else - r6 = FALSE; - - if (gTeamInventoryRef->teamItems[INVENTORY_SIZE - 1].flags & ITEM_FLAG_EXISTS) - r4 = TRUE; - else - r4 = FALSE; - - if (GetItemCategory(item->id) == CATEGORY_TMS_HMS) r5 = TRUE; - if (GetItemCategory(item->id) == CATEGORY_ORBS) r5 = TRUE; - - if (gDungeon->unk644.unk17) { - if (r4) { - sub_8044F5C(0x3E, item->id); - } - else { - sub_8044F5C(0x37, item->id); - } - - if (r6) { - sub_8044FF0(0x37); - sub_8044FF0(0x3E); - } - } - - if (teamMonInfo->isTeamLeader) { - val_sub8044DC8 = sub_8044DC8(item); - if (val_sub8044DC8 != 0) { - sub_8044F5C(val_sub8044DC8, item->id); - if (item->flags & ITEM_FLAG_STICKY) { - sub_8044FF0(val_sub8044DC8); - } - if (!sub_8046F00(item)) { - sub_8044FF0(val_sub8044DC8); - } - } - } - else { - sub_8044F5C(0x38, item->id); - if (r5) { - sub_8044FF0(0x38); - } - } - } - } - - sub_8044F5C(0xC, item->id); - sub_8045064(); -} - -void sub_8060CE8(ActionContainer *a0) -{ - SetMonsterActionFields(a0, gUnknown_202EE44[gUnknown_202EE10.menuIndex].unk0); - a0->actionParameters[0] = sUnknownActionUnk4; - a0->actionParameters[1].actionUseIndex = 0; - a0->actionParameters[1].itemPos.x = 0; - a0->actionParameters[1].itemPos.y = 0; -} - -void sub_8060D24(UNUSED ActionContainer *a0) -{ - Item *item = sub_8044D90(GetLeader(), 0, 0xB); - sub_803ECB4(NULL, 0); - sub_801B3C0(item); - - do { - sub_803E46C(0x16); - } while (sub_801B410() == 0); - - sub_801B450(); - sub_803EAF0(0, NULL); -} - -extern bool8 PosHasItem(DungeonPos *pos); - -s32 sub_8060D64(s16 *a0, bool8 a1, bool8 a2, bool8 a3, Entity *a4) -{ - s32 i; - s32 count = 0; - - if (gDungeon->unk644.unk17 && !a1) { - if (gTeamInventoryRef->teamItems[0].flags & ITEM_FLAG_EXISTS) { - a0[count++] = 0; - } - if (gTeamInventoryRef->teamItems[INVENTORY_SIZE / 2].flags & ITEM_FLAG_EXISTS) { - a0[count++] = 1; - } - } - - if (a2 && PosHasItem(&a4->pos)) { - a0[count++] = 2; - } - - if (!a1 && !a3) { - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon) && GetEntInfo(teamMon)->heldItem.flags & ITEM_FLAG_EXISTS) { - a0[count++] = i + MAX_TEAM_MEMBERS; - } - } - } - - return count; -} - -extern WindowHeader gUnknown_202F270; - -struct UnkFieldTeamMenuStruct -{ - s32 unk0; - s32 unk4[MAX_TEAM_MEMBERS]; - u8 unk14[MAX_TEAM_MEMBERS]; -}; - -void DrawFieldTeamMenu(struct UnkFieldTeamMenuStruct *a0, Windows *a1, bool8 a2); -void sub_806145C(struct UnkFieldTeamMenuStruct *a0); -void sub_80615B4(ActionContainer *a0, struct UnkFieldTeamMenuStruct *a1); - -extern u8 gUnknown_202EE39; - -bool8 sub_8060E38(Entity *a0) -{ - s32 i; - bool32 r10, ret; - - struct UnkFieldTeamMenuStruct sp; - Windows var_84 = {0}; - - var_84.id[0].type = WINDOW_TYPE_WITH_HEADER; - var_84.id[0].pos.x = 2; - var_84.id[0].pos.y = 2; - var_84.id[0].width = 0xE; - var_84.id[0].height = 0x10; - var_84.id[0].unk10 = 0x10; - var_84.id[0].unk14 = &gUnknown_202F270; - var_84.id[1].type = WINDOW_TYPE_NORMAL; - var_84.id[2].type = WINDOW_TYPE_NORMAL; - var_84.id[3].type = WINDOW_TYPE_NORMAL; - - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon)) { - GetEntInfo(teamMon)->unk157 = TRUE; - } - } - - if (!gDungeon->unk644.unk17) { - var_84.id[0].type = WINDOW_TYPE_NORMAL; - var_84.id[0].pos.y++; - } - - while (1) { - s32 id; - bool32 r4; - - ret = FALSE; - DrawFieldTeamMenu(&sp, &var_84, TRUE); - r10 = FALSE; - while (1) { - s32 id = sp.unk4[gUnknown_202EE10.menuIndex]; - if (id >= 0) { - Entity *teamMon = gDungeon->teamPokemon[id]; - sub_806A2BC(teamMon, 0); - sub_804A728(&teamMon->pos, 0, 1, 1); - } - - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x1B); - if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); - } - if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); - } - if (gRealInputs.pressed & START_BUTTON) { - if (sp.unk14[gUnknown_202EE10.menuIndex] != 0) { - sub_8083D44(); - r10 = TRUE; - break; - } - sub_8083D30(); - } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) - { - if (sp.unk14[gUnknown_202EE10.menuIndex] != 0) { - sub_8083D08(); - break; - } - sub_8083D30(); - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - ret = TRUE; - break; - } - } - - id = sp.unk4[gUnknown_202EE10.menuIndex]; - if (id >= 0) { - Entity *teamMon = gDungeon->teamPokemon[id]; - sub_806A2BC(teamMon, 0); - sub_804A728(&teamMon->pos, 0, 1, 1); - } - - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x1B); - sub_804AA60(); - if (ret) { - break; - } - - sp.unk0 = gUnknown_202EE10.menuIndex; - sTeamMenuChosenId = gUnknown_202EE10.menuIndex; - sub_806145C(&sp); - if (r10) { - EntityInfo *info = GetEntInfo(a0); - SetMonsterActionFields(&info->action, 0x1B); - info->action.actionParameters[0].actionUseIndex = sp.unk4[sp.unk0]; - ret = FALSE; - break; - } - - sub_805FC30(&var_84, 0x12); - while (1) { - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x1B); - if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); - } - if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); - } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - if (sub_8044F3C(gUnknown_202EE10.menuIndex)) { - sub_80615B4(&GetEntInfo(a0)->action, &sp); - sub_8083D08(); - r4 = FALSE; - break; - } - sub_8083D30(); - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - r4 = TRUE; - break; - } - } - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x1B); - if (r4 != TRUE) { - ret = FALSE; - break; - } - } - - if (ret) { - sub_806A2BC(GetLeader(), 0); - } - sub_803EAF0(0, NULL); - return ret; -} - -bool32 sub_8069D18(DungeonPos *a0, Entity *a1); - -extern const u8 gTeamFormat[]; -extern const u8 gHeartRedTiny[]; -extern const u8 gHeartRedSmall[]; -extern const u8 gHeartRedMedium[]; -extern const u8 gHeartRedLarge[]; -extern const u8 gHeartYellowTiny[]; -extern const u8 gHeartYellowSmall[]; -extern const u8 gHeartYellowMedium[]; -extern const u8 gHeartYellowLarge[]; -extern const u8 gUnknown_8106BD4[]; -extern const u8 gUnknown_8106BE0[]; -extern const u8 gUnknown_8106BEC[]; -extern const u8 gUnknown_8106BF4[]; - -extern void sub_8070968(u8 *buffer, EntityInfo *entityInfo, s32 colorNum); - -void DrawFieldTeamMenu(struct UnkFieldTeamMenuStruct *a0, Windows *windows, bool8 a2) -{ - s32 r0; - DungeonPos pos; - s32 i; - - s32 count = 0; - bool8 r10 = (windows->id[0].type == WINDOW_TYPE_WITH_HEADER); - - sub_8069D18(&pos, GetLeader()); - for (i = 0; i < MAX_TEAM_MEMBERS; i++) { - EntityInfo *monInfo; - Entity *teamMon = gDungeon->teamPokemon[i]; - if (EntityIsValid(teamMon)) { - a0->unk4[count] = i; - monInfo = GetEntInfo(teamMon); - a0->unk14[count] = monInfo->unk157; - if (pos.x == teamMon->pos.x && pos.y == teamMon->pos.y && sTeamMenuChosenId < 0) { - sTeamMenuChosenId = count; - } - count++; - } - } - - if (sTeamMenuChosenId >= count) { - sTeamMenuChosenId = count - 1; - } - if (sTeamMenuChosenId < 0) { - sTeamMenuChosenId = 0; - } - - for (i = count; i < MAX_TEAM_MEMBERS; i++) { - a0->unk4[i] = -1; - a0->unk14[i] = 0; - } - - gUnknown_202F270.f0 = 1; - gUnknown_202F270.f1 = 0; - gUnknown_202F270.f3 = 0; - gUnknown_202EE10.menuIndex = sTeamMenuChosenId; - gUnknown_202EE10.unk1A = count; - gUnknown_202EE10.unk1C = count; - gUnknown_202EE10.unk1E = 0; - gUnknown_202EE10.unk20 = 0; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.firstEntryY = (r10 != FALSE) * 16; - gUnknown_202EE10.unkC = 0; - gUnknown_202EE10.unkE = 0; - gUnknown_202EE10.unk14.x = 0; - gUnknown_202EE10.unk0 = 0; - sub_801317C(&gUnknown_202EE10.unk28); - r0 = sub_80095E4(count, 0); - if (r10) { - r0 += 2; - } - windows->id[0].unk10 = r0; - windows->id[0].height = r0; - gUnknown_202F270.f2 = 8; - if (a2) { - windows->id[1] = windows->id[3]; - } - - sub_803ECB4(windows, 1); - sub_80137B0(&gUnknown_202EE10, 0); - sub_80073B8(0); - if (r10) { - PrintFormattedStringOnWindow(0xC, 0, gTeamFormat, 0, 0); - } - - // Print hp/max hp - for (i = 0; i < count; i++) { - s32 y; - s32 id = a0->unk4[i]; - if (id >= 0) { - Entity *teamMon = gDungeon->teamPokemon[id]; - if (EntityIsValid(teamMon)) - { - EntityInfo *monInfo = GetEntInfo(teamMon); - s32 color = (a0->unk14[i] != 0) ? 6 : 2; - - sub_8070968(gFormatBuffer_Monsters[0], monInfo, color); - if (sub_806A538(gRecruitedPokemonRef->pokemon2[monInfo->teamIndex].unkA)) { - if (monInfo->HP <= monInfo->maxHPStat / 4) { - strcpy(gFormatBuffer_Monsters[1], gHeartRedTiny); - } - else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 2) { - strcpy(gFormatBuffer_Monsters[1], gHeartRedSmall); - } - else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 3) { - strcpy(gFormatBuffer_Monsters[1], gHeartRedMedium); - } - else { - strcpy(gFormatBuffer_Monsters[1], gHeartRedLarge); - } - } - else { - if (monInfo->HP <= monInfo->maxHPStat / 4) { - strcpy(gFormatBuffer_Monsters[1], gHeartYellowTiny); - } - else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 2) { - strcpy(gFormatBuffer_Monsters[1], gHeartYellowSmall); - } - else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 3) { - strcpy(gFormatBuffer_Monsters[1], gHeartYellowMedium); - } - else { - strcpy(gFormatBuffer_Monsters[1], gHeartYellowLarge); - } - } - - gFormatArgs[0] = monInfo->HP; - gFormatArgs[1] = monInfo->maxHPStat; - y = GetMenuEntryYCoord(&gUnknown_202EE10, i); - if (monInfo->isTeamLeader) { - PrintFormattedStringOnWindow(9, y, gUnknown_8106BD4, 0, 0); - } - else { - PrintFormattedStringOnWindow(9, y, gUnknown_8106BE0, 0, 0); - } - } - } - } - - sub_80073E0(0); -} - -extern bool8 CanLeaderSwitch(u8 dungeon); - -void sub_806145C(struct UnkFieldTeamMenuStruct *a0) -{ - Entity *teamMon; - EntityInfo *monInfo; - - gUnknown_202EE6C = 0; - teamMon = gDungeon->teamPokemon[a0->unk4[gUnknown_202EE10.menuIndex]]; - monInfo = GetEntInfo(teamMon); - sub_8044F5C(0x1B, 0); - sub_8044F5C(0x19, 0); - if (!monInfo->isTeamLeader) { - if (!gDungeon->unk644.unk19 && (monInfo->joinedAt.id != DUNGEON_JOIN_LOCATION_PARTNER || gDungeon->unk644.unk18)) { - sub_8044F5C(0x34, 0); - } - sub_8044F5C(0x1C, 0); - } - sub_8044F5C(0x30, 0); - if (!monInfo->isTeamLeader) { - sub_8044F5C(0x1A, 0); - } - if (!monInfo->isTeamLeader && gDungeon->unk644.unk18 && CanLeaderSwitch(gDungeon->unk644.dungeonLocation.id)) { - bool32 r5; - - sub_8044F5C(0x3B, 0); - r5 = TRUE; - if (monInfo->teamIndex >= MAX_TEAM_MEMBERS) { - r5 = FALSE; - } - else { - PokemonStruct2 *mon = &gRecruitedPokemonRef->pokemon2[monInfo->teamIndex]; - if (sub_806A538(mon->unkA)) { - r5 = FALSE; - } - } - - if (CheckVariousStatuses2(teamMon, FALSE)) { - r5 = FALSE; - } - if (!r5) { - sub_8044FF0(0x3B); - } - } - - if (IsExperienceLocked(monInfo->joinedAt.id)) { - sub_8044FF0(0x19); - sub_8044FF0(0x3B); - sub_8044FF0(0x1A); - sub_8044FF0(0x30); - sub_8044FF0(0x34); - } - - sub_8045064(); -} - -void sub_80615B4(ActionContainer *a0, struct UnkFieldTeamMenuStruct *a1) -{ - SetMonsterActionFields(a0, gUnknown_202EE44[gUnknown_202EE10.menuIndex].unk0); - a0->actionParameters[0].actionUseIndex = a1->unk4[a1->unk0]; -} - -void PrintMonTactics(s32 a0, u8 *tacticIds, EntityInfo *mon, s32 windowId); -void sub_80623B0(void); -void sub_8062D68(void); -void sub_8062230(void); -void sub_8062748(u8 a0); - -static inline void SetTxtStruct(Windows *sp) -{ - memset(sp, 0, sizeof(*sp)); - sp->id[0].type = WINDOW_TYPE_WITH_HEADER; - sp->id[0].pos.x = 2; - sp->id[0].pos.y = 2; - sp->id[0].width = 0x12; - sp->id[0].height = 0xE; - sp->id[0].unk10 = 0x12; - sp->id[0].unk12 = 2; - sp->id[0].unk14 = &gUnknown_202F270; - sp->id[1].type = WINDOW_TYPE_NORMAL; - sp->id[2].type = WINDOW_TYPE_NORMAL; - sp->id[3].type = WINDOW_TYPE_NORMAL; -} - -void ShowTacticsMenu(ActionContainer *a0) -{ - Windows sp; - EntityInfo *monInfo; - u8 tacticIds[NUM_TACTICS]; - s32 scrollFirstId; - s32 menuIndex; - Entity *teamMon; - - SetTxtStruct(&sp); - teamMon = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; - monInfo = GetEntInfo(teamMon); - menuIndex = 0; - scrollFirstId = 0; - while (1) { - s32 i; - bool32 addCursor = TRUE; - bool32 loopBreak = FALSE; - - gUnknown_202F270.f0 = 1; - gUnknown_202F270.f1 = 0; - gUnknown_202F270.f2 = 10; - gUnknown_202F270.f3 = 0; - sub_803ECB4(&sp, 1); - PrintMonTactics(scrollFirstId, tacticIds, monInfo, 0); - for (i = 0; i < 8; i++) { - if (tacticIds[i] == TACTIC_UNUSED) - break; - } - gUnknown_202EE10.unk1A = i; - gUnknown_202EE10.unk1C = 8; - gUnknown_202EE10.unk1E = 0; - gUnknown_202EE10.unk20 = 0; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.firstEntryY = 16; - gUnknown_202EE10.unkC = 0; - gUnknown_202EE10.unkE = 0; - gUnknown_202EE10.unk14.x = 0; - gUnknown_202EE10.unk0 = 0; - sub_801317C(&gUnknown_202EE10.unk28); - sub_80137B0(&gUnknown_202EE10, 0); - gUnknown_202EE10.menuIndex = menuIndex; - while (1) { - s32 i; - - AddMenuCursorSprite(&gUnknown_202EE10); - if (tacticIds[8] != TACTIC_UNUSED) { - sub_80623B0(); - } - if (scrollFirstId != 0) { - sub_8062230(); - } - sub_803E46C(0x3D); - if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - if (gUnknown_202EE10.menuIndex == 7) { - if (tacticIds[8] != TACTIC_UNUSED) { - for (i = 0; i < 6; i++) { - gIwramTextFunc1(0); - sub_803E46C(0x3D); - } - scrollFirstId++; - } - menuIndex = 7; - break; - } - sub_80136E0(&gUnknown_202EE10, 0); - } - if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - if (gUnknown_202EE10.menuIndex == 0) { - if (scrollFirstId != 0) { - for (i = 0; i < 6; i++) { - gIwramTextFunc2(0); - sub_803E46C(0x3D); - } - scrollFirstId--; - } - menuIndex = 0; - break; - } - sub_8013744(&gUnknown_202EE10, 0); - } - if (gRealInputs.pressed & START_BUTTON) { - u32 tacticId = tacticIds[gUnknown_202EE10.menuIndex]; - menuIndex = gUnknown_202EE10.menuIndex; - sub_8083D44(); - sub_8062748(tacticId); - loopBreak = FALSE; - break; - } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - bool32 changed; - - u32 tacticId = tacticIds[gUnknown_202EE10.menuIndex]; - menuIndex = gUnknown_202EE10.menuIndex; - sub_8062D68(); - sub_8083D08(); - gUnknown_202EE6C = 0; - sub_8044F5C(0x2F, 0); - sub_8044F5C(0xC, 0); - if (CheckVariousStatuses2(teamMon, TRUE)) { - sub_8044FF0(0x2F); - } - sub_805FC30(&sp, 0x16); - while (1) { - changed = FALSE; - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x3D); - if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); - } - if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); - } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - if (sub_8044F3C(gUnknown_202EE10.menuIndex)) { - changed = TRUE; - break; - } - sub_8083D30(); - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - changed = FALSE; - break; - } - } - if (changed) { - sub_8083D08(); - if (gUnknown_202EE10.menuIndex == 0) { - PlaySoundEffect(0x133); - monInfo->tactic = tacticId; - monInfo->aiTarget.aiObjective = 6; - monInfo->aiTarget.aiTarget = NULL; - monInfo->aiTarget.unkC = 0; - monInfo->aiTarget.aiTargetSpawnGenID = 0; - if (!monInfo->isTeamLeader) { - AIMovement(teamMon, TRUE); - } - } - else { - sub_8062748(tacticId); - addCursor = FALSE; - } - } - loopBreak = FALSE; - break; - } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); - loopBreak = TRUE; - break; - } - } - - if (addCursor) { - AddMenuCursorSprite(&gUnknown_202EE10); - } - sub_803E46C(0x3D); - if (loopBreak) - break; - } - sub_803EAF0(0, NULL); -} - -extern void GetAvailTacticsforLvl(u8 *tacticsBuffer, s32 pokeLevel); - -void PrintMonTactics(s32 firstId, u8 *tacticIds, EntityInfo *mon, s32 windowId) -{ - u8 tacticsBuffer[NUM_TACTICS]; - u32 tactic; - s32 y, i, j; - - firstId--; - sub_80073B8(windowId); - PrintStringOnWindow(0x10, 0, gUnknown_80FE954, windowId, 0); - y = 0x14; - for (j = 0; j < 9; j++) { - tacticIds[j] = TACTIC_UNUSED; - } - GetAvailTacticsforLvl(tacticsBuffer, GetLeaderInfo()->level); - for (i = -1; i < 10; i++, y += 12, firstId++) { - if (firstId < 0) - continue; - if (firstId >= NUM_TACTICS) - continue; - - tactic = tacticsBuffer[firstId]; - if (i >= 0 && i < 9) { - tacticIds[i] = tactic; - } - if (tactic == TACTIC_UNUSED) - break; - - CopyTacticsNameToBuffer(gFormatBuffer_Monsters[0], tactic); - if (mon->tactic == tactic) { - PrintFormattedStringOnWindow(0x10, y, gUnknown_8106BEC, windowId, 0); - } - else { - PrintFormattedStringOnWindow(0x10, y, gUnknown_8106BF4, windowId, 0); - } - } - - sub_80073E0(windowId); -} - -EWRAM_INIT u8 gUnknown_203B43C[4] = {2, 0, 0xD, 0}; // TODO: Move to a better file and figure out the array count. Apparently it's only written to. diff --git a/src/code_8066D04.c b/src/code_8066D04.c index 1b653f171..1aef855c1 100644 --- a/src/code_8066D04.c +++ b/src/code_8066D04.c @@ -76,7 +76,7 @@ extern const u8 *const gMonCringing; extern const u8 *const gMonParalyzed; extern const u8 *const gUnknown_80FC690; -extern s32 gUnknown_202EE6C; +extern s32 gDungeonSubMenuItemsCount; extern u32 gUnknown_202F208; extern void sub_8071DA4(Entity *); @@ -91,9 +91,9 @@ extern bool8 sub_8045888(Entity *); extern Item *sub_8044D90(Entity *, s32, u32); void sub_8045BF8(u8 *, Item *); u8 sub_8048D50(); -void sub_8044FF0(u16 param_1); +void SetActionUnusableInDungeonSubMenu(u16 param_1); u8 * sub_80464AC(); -void sub_8044F5C(u16 param_1, u8 param_2); +void AddActionToDungeonSubMenu(u16 param_1, u8 param_2); void sub_8044DF0(); void sub_8042208(Entity *pokemon, u8 r1); void sub_803E708(); @@ -899,22 +899,22 @@ void sub_8067904(Entity *entity, u16 moveId) extern void sub_80684C4(void); void sub_8045064(void); -extern void sub_8083CE0(u8 param_1); +extern void PlayDungeonCursorSE(u8 param_1); extern void sub_8068344(void); -bool8 sub_8044F3C(s32 param_1); +bool8 CanSubMenuItemBeChosen(s32 param_1); void sub_8068310(s32 a0, PokemonStruct1 **a1); void sub_8067F00(u8 a0, PokemonStruct1 **a1, s32 a2, s32 a3, s32 a4); -extern void sub_803ECB4(Windows *a0, u8 a1); +extern void DungeonShowWindows(WindowTemplates *a0, u8 a1); u32 sub_8014140(s32 a0, const void *a1); void sub_8083D1C(void); -void sub_8083D08(void); -void sub_8083D30(void); +void PlayDungeonConfirmationSE(void); +void PlayDungeonCancelSE(void); void sub_806806C(PokemonStruct1 *a0); -void sub_805FC30(Windows *a0, s32 a1); +void CreateDungeonMenuSubWindow(WindowTemplates *a0, s32 a1); extern void sub_803EAF0(u32, u8 *); extern const s32 gUnknown_8106E80[]; -extern MenuInputStruct gUnknown_202EE10; +extern MenuInputStruct gDungeonMenu; static EWRAM_DATA WindowHeader gUnknown_202F308 = {0}; static EWRAM_DATA s32 gUnknown_202F30C = 0; @@ -925,7 +925,7 @@ static const u8 gUnknown_8106DA4[] = { 0x01, 0, 0x38, 0, 0, 0, 0x18, 0, 0x18, 0, 0, 0, 0x02, 0, 0x38, 0, 0x68, 0, 0x18, 0, 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const Windows gUnknown_8106DC8 = { +static const WindowTemplates gUnknown_8106DC8 = { .id = { [0] = { @@ -936,7 +936,7 @@ static const Windows gUnknown_8106DC8 = { .height = 0x0E, .unk10 = 0x12, .unk12 = 0x02, - .unk14 = &gUnknown_202F308 + .header = &gUnknown_202F308 }, [1] = { @@ -947,7 +947,7 @@ static const Windows gUnknown_8106DC8 = { .height = 0x04, .unk10 = 0x04, .unk12 = 0, - .unk14 = NULL + .header = NULL }, [2] = WINDOW_DUMMY, [3] = WINDOW_DUMMY, @@ -958,7 +958,7 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) { s32 i; s32 r10; - Windows spTxtStruct = gUnknown_8106DC8; + WindowTemplates spTxtStruct = gUnknown_8106DC8; gUnknown_202F30C = 0; r10 = 0; @@ -973,32 +973,32 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) while (1) { s32 r7 = 0, r5 = 0; - gUnknown_202F308.f0 = 1; - gUnknown_202F308.f1 = 0; - gUnknown_202F308.f2 = 0xE; + gUnknown_202F308.count = 1; + gUnknown_202F308.currId = 0; + gUnknown_202F308.width = 0xE; gUnknown_202F308.f3 = 0; ASM_MATCH_TRICK(r7); - sub_803ECB4(&spTxtStruct, 1); + DungeonShowWindows(&spTxtStruct, 1); sub_8067F00(a0, a3, gUnknown_202F30C, a2, a1); - gUnknown_202EE10.unk1A = min(a2, 8); - gUnknown_202EE10.menuIndex = r10; - gUnknown_202EE10.unk1C = 8; - gUnknown_202EE10.unk1E = 0; - gUnknown_202EE10.unk20 = 0; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.firstEntryY = 18; - gUnknown_202EE10.unkC = 0; - gUnknown_202EE10.unkE = 0; - gUnknown_202EE10.unk14.x = 0; - gUnknown_202EE10.unk0 = 0; - sub_801317C(&gUnknown_202EE10.unk28); - sub_80137B0(&gUnknown_202EE10, 0); + gDungeonMenu.unk1A = min(a2, 8); + gDungeonMenu.menuIndex = r10; + gDungeonMenu.unk1C = 8; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 18; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + sub_80137B0(&gDungeonMenu, 0); while (1) { s32 r4; - AddMenuCursorSprite(&gUnknown_202EE10); + AddMenuCursorSprite(&gDungeonMenu); r5 = 0; r7 = 0; if (a2 - gUnknown_202F30C > 8) { @@ -1011,13 +1011,13 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) } r4 = sub_8014140(0, gUnknown_8106DA4); - sub_803E46C(0x37); + DungeonRunFrameActions(0x37); if (r4 == 2 && r5) { if (a2 - gUnknown_202F30C > 8) { s32 i; for (i = 0; i < 6; i++) { - gIwramTextFunc1(0); - sub_803E46C(0x37); + ScrollDownWindowFunc(0); + DungeonRunFrameActions(0x37); } gUnknown_202F30C++; } @@ -1026,13 +1026,13 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) break; } if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - if (gUnknown_202EE10.menuIndex == 7) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 7) { if (a2 - gUnknown_202F30C > 8) { s32 i; for (i = 0; i < 6; i++) { - gIwramTextFunc1(0); - sub_803E46C(0x37); + ScrollDownWindowFunc(0); + DungeonRunFrameActions(0x37); } gUnknown_202F30C++; } @@ -1040,15 +1040,15 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) r10 = 7; break; } - sub_80136E0(&gUnknown_202EE10, 0); + MoveMenuCursorDownWrapAround(&gDungeonMenu, 0); } if (r4 == 1 && r7 != 0) { if (gUnknown_202F30C != 0) { s32 i; for (i = 0; i < 6; i++) { - gIwramTextFunc2(0); - sub_803E46C(0x37); + ScrollUpWindowFunc(0); + DungeonRunFrameActions(0x37); } gUnknown_202F30C--; } @@ -1057,13 +1057,13 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) break; } if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - if (gUnknown_202EE10.menuIndex == 0) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 0) { if (gUnknown_202F30C != 0) { s32 i; for (i = 0; i < 6; i++) { - gIwramTextFunc2(0); - sub_803E46C(0x37); + ScrollUpWindowFunc(0); + DungeonRunFrameActions(0x37); } gUnknown_202F30C--; } @@ -1071,7 +1071,7 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) r10 = 0; break; } - sub_8013744(&gUnknown_202EE10, 0); + MoveMenuCursorUpWrapAround(&gDungeonMenu, 0); } if (sub_80048C8()) { @@ -1083,25 +1083,25 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) r7 = 3; break; } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - sub_8083D08(); + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); r7 = 1; break; } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); r7 = 2; break; } } - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x37); + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x37); if (r7 == 0) { continue; } else if (r7 == 2) { - r10 = gUnknown_202EE10.menuIndex; + r10 = gDungeonMenu.menuIndex; if (gUnknown_202F310 < a1) { continue; } @@ -1114,7 +1114,7 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) } } else if (r7 == 3) { - r10 = gUnknown_202EE10.menuIndex; + r10 = gDungeonMenu.menuIndex; sub_806806C(a3[gUnknown_202F30C + r10]); continue; } @@ -1122,64 +1122,64 @@ void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) s32 arrId; u8 locIdIsPartner; - r10 = gUnknown_202EE10.menuIndex; + r10 = gDungeonMenu.menuIndex; arrId = gUnknown_202F30C + r10; - gUnknown_202EE6C = 0; - sub_8044F5C(0x29, 0); - sub_8044F5C(0x2A, 0); - sub_8044F5C(0x40, 0); + gDungeonSubMenuItemsCount = 0; + AddActionToDungeonSubMenu(0x29, 0); + AddActionToDungeonSubMenu(0x2A, 0); + AddActionToDungeonSubMenu(0x40, 0); if (a3[arrId]->unk0 & 0x8000) { - sub_8044FF0(0x29); + SetActionUnusableInDungeonSubMenu(0x29); } else { - sub_8044FF0(0x2A); + SetActionUnusableInDungeonSubMenu(0x2A); } // This unnecessary variable is required to match. locIdIsPartner = DUNGEON_JOIN_LOCATION_PARTNER; if (a3[arrId]->isTeamLeader || (a3[arrId]->dungeonLocation.id == DUNGEON_JOIN_LOCATION_LEADER || a3[arrId]->dungeonLocation.id == locIdIsPartner)) { - sub_8044FF0(0x29); + SetActionUnusableInDungeonSubMenu(0x29); } sub_8045064(); - sub_805FC30(&spTxtStruct, 0x15); + CreateDungeonMenuSubWindow(&spTxtStruct, 0x15); while (1) { - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x37); + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x37); if (gRealInputs.repeated & DPAD_DOWN) { - sub_8083CE0(1); - sub_80136E0(&gUnknown_202EE10, 1); + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, 1); } if (gRealInputs.repeated & DPAD_UP) { - sub_8083CE0(1); - sub_8013744(&gUnknown_202EE10, 1); + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, 1); } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - if (sub_8044F3C(gUnknown_202EE10.menuIndex)) { - sub_8083D08(); + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + PlayDungeonConfirmationSE(); r7 = 1; break; } - sub_8083D30(); + PlayDungeonCancelSE(); } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); r7 = 0; break; } } - AddMenuCursorSprite(&gUnknown_202EE10); - sub_803E46C(0x37); + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x37); if (r7 != 0) { - if (gUnknown_202EE10.menuIndex == 0) { + if (gDungeonMenu.menuIndex == 0) { a3[arrId]->unk0 |= 0x8000; sub_8068310(a2, a3); } - else if (gUnknown_202EE10.menuIndex == 1) { + else if (gDungeonMenu.menuIndex == 1) { a3[arrId]->unk0 &= ~(0x8000); sub_8068310(a2, a3); } @@ -1251,7 +1251,7 @@ void sub_806806C(PokemonStruct1 *a0) { struct unkStruct_808FF20 unkStruct; struct UnkInfoTabStruct var_C8; - Windows spTxtStruct = {0}; + WindowTemplates spTxtStruct = {0}; s32 r7; spTxtStruct.id[0].type = WINDOW_TYPE_WITH_HEADER; @@ -1261,7 +1261,7 @@ void sub_806806C(PokemonStruct1 *a0) spTxtStruct.id[0].height = 0xE; spTxtStruct.id[0].unk10 = 0x12; spTxtStruct.id[0].unk12 = 2; - spTxtStruct.id[0].unk14 = &gUnknown_202F308; + spTxtStruct.id[0].header = &gUnknown_202F308; spTxtStruct.id[1].type = WINDOW_TYPE_NORMAL; spTxtStruct.id[2].type = WINDOW_TYPE_NORMAL; spTxtStruct.id[3].type = WINDOW_TYPE_NORMAL; @@ -1269,39 +1269,39 @@ void sub_806806C(PokemonStruct1 *a0) r7 = 0; unkStruct.unk40 = 0; unkStruct.unk56 = 0; - gUnknown_202EE10.menuIndex = 0; + gDungeonMenu.menuIndex = 0; while (1) { bool32 loopBreak = FALSE; s32 spF8[4] = {2, 3, 4, 5}; - gUnknown_202F308.f0 = 4; - gUnknown_202F308.f1 = r7; - gUnknown_202F308.f2 = 10; + gUnknown_202F308.count = 4; + gUnknown_202F308.currId = r7; + gUnknown_202F308.width = 10; gUnknown_202F308.f3 = 0; - gUnknown_202EE10.unk1E = r7; - gUnknown_202EE10.unk20 = 4; - gUnknown_202EE10.unk1A = 0; - gUnknown_202EE10.menuIndex = 0; - gUnknown_202EE10.unk1C = 0; - gUnknown_202EE10.unk4 = 0; - gUnknown_202EE10.firstEntryY = 16; - gUnknown_202EE10.unk14.x = 0; - gUnknown_202EE10.unk0 = 0; + gDungeonMenu.unk1E = r7; + gDungeonMenu.unk20 = 4; + gDungeonMenu.unk1A = 0; + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1C = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; - sub_801317C(&gUnknown_202EE10.unk28); - sub_803ECB4(&spTxtStruct, 1); + sub_801317C(&gDungeonMenu.unk28); + DungeonShowWindows(&spTxtStruct, 1); sub_808FF20(&unkStruct, a0, gDungeon->unk644.unk16); CreatePokemonInfoTabScreen(spF8[r7], r7, &unkStruct, &var_C8, 0); - gUnknown_202EE10.unkC = (gUnknown_2027370[0].unk0 + 15) * 8; - gUnknown_202EE10.unkE = ((gUnknown_2027370[0].unk2 + 1) * 8) - 2; + gDungeonMenu.unkC = (gWindows[0].x + 15) * 8; + gDungeonMenu.unkE = ((gWindows[0].y + 1) * 8) - 2; while (1) { s32 r5; - AddMenuCursorSprite(&gUnknown_202EE10); + AddMenuCursorSprite(&gDungeonMenu); if (spF8[r7] == 4) { if (var_C8.unk0[8] != 0) { sub_80684C4(); @@ -1312,16 +1312,16 @@ void sub_806806C(PokemonStruct1 *a0) } r5 = sub_8014140(0, gUnknown_8106DA4); - sub_803E46C(0x1C); - if ((gRealInputs.pressed & DPAD_RIGHT) || gUnknown_202EE10.unk28.dpad_right) { - sub_8083CE0(0); + DungeonRunFrameActions(0x1C); + if ((gRealInputs.pressed & DPAD_RIGHT) || gDungeonMenu.unk28.dpad_right) { + PlayDungeonCursorSE(0); if (++r7 == 4) { r7 = 0; } break; } - if ((gRealInputs.pressed & DPAD_LEFT) || gUnknown_202EE10.unk28.dpad_left) { - sub_8083CE0(0); + if ((gRealInputs.pressed & DPAD_LEFT) || gDungeonMenu.unk28.dpad_left) { + PlayDungeonCursorSE(0); if (--r7 == -1) { r7 = 3; } @@ -1332,10 +1332,10 @@ void sub_806806C(PokemonStruct1 *a0) if (((gRealInputs.repeated & DPAD_DOWN) || r5 == 2) && var_C8.unk0[8] != 0) { s32 i; - sub_8083CE0(0); + PlayDungeonCursorSE(0); for (i = 0; i < 6; i++) { - gIwramTextFunc1(0); - sub_803E46C(0x1C); + ScrollDownWindowFunc(0); + DungeonRunFrameActions(0x1C); } unkStruct.unk40++; break; @@ -1343,10 +1343,10 @@ void sub_806806C(PokemonStruct1 *a0) if (((gRealInputs.repeated & DPAD_UP) || r5 == 1) && unkStruct.unk40 != 0) { s32 i; - sub_8083CE0(0); + PlayDungeonCursorSE(0); for (i = 0; i < 6; i++) { - gIwramTextFunc2(0); - sub_803E46C(0x1C); + ScrollUpWindowFunc(0); + DungeonRunFrameActions(0x1C); } unkStruct.unk40--; break; @@ -1357,19 +1357,19 @@ void sub_806806C(PokemonStruct1 *a0) continue; } - if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { - sub_8083D08(); + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); loopBreak = TRUE; break; } - if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { - sub_8083D30(); + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); loopBreak = TRUE; break; } } - sub_803E46C(0x37); + DungeonRunFrameActions(0x37); if (loopBreak) { break; } diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index 85a2a4245..d24ddd72a 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -71,7 +71,7 @@ extern void DeletePokemonDungeonSprite(s32 id); extern void sub_80429E8(Entity *r0); extern s32 sub_803DA20(s32 param_1); extern void sub_80694C0(Entity *, s32, s32, u32); -extern s32 gUnknown_202EDCC; +extern s32 gDungeonFramesCounter; extern void sub_800F958(s32 dungeonSpriteID, DungeonPos *pos, DungeonPos *statusOffsets, u32 a3); extern void sub_8005700(DungeonPos *a0, struct axObject *a1); u32 EntityGetStatusSprites(Entity *entity); @@ -310,7 +310,7 @@ void sub_806A2BC(Entity *pokemon, u8 param_2) if (param_2 != '\0') { sub_804178C(1); while (gDungeon->unk12 < 0x3c) { - sub_803E46C(0x34); + DungeonRunFrameActions(0x34); } } sub_803E708(4,0x44); @@ -2008,7 +2008,7 @@ void sub_806C51C(Entity *entity) } else { if (entInfo->unk15D != 0) { - if (gUnknown_202EDCC & 4) { + if (gDungeonFramesCounter & 4) { x++; } else { @@ -2080,7 +2080,7 @@ void sub_806C51C(Entity *entity) s32 overworldPal; if (entInfo->frozenClassStatus.status == STATUS_PETRIFIED || entInfo->burnClassStatus.status == STATUS_PARALYSIS || entInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) { - x += gUnknown_202EDCC & 2; + x += gDungeonFramesCounter & 2; } if (decoySprite) { @@ -2093,7 +2093,7 @@ void sub_806C51C(Entity *entity) if (entity->unk22 == 0) { DoAxFrame_800558C(&entity->axObj.axdata, x, y, y2, overworldPal, &spriteMasks); } - else if (entity->unk22 == 1 && (gUnknown_202EDCC & 1)) { + else if (entity->unk22 == 1 && (gDungeonFramesCounter & 1)) { DoAxFrame_800558C(&entity->axObj.axdata, x, y, y2, overworldPal, &spriteMasks); } } diff --git a/src/code_806CD90.c b/src/code_806CD90.c index b992b90b4..0810e0ac0 100644 --- a/src/code_806CD90.c +++ b/src/code_806CD90.c @@ -209,7 +209,7 @@ void sub_806CF18(Entity *entity) entityInfo = GetEntInfo(entity); for (i = 0; i < 100; i++) { - sub_803E46C(33); + DungeonRunFrameActions(33); if (!sub_808DA44(entityInfo->apparentID, entity->axObj.unk43_animId2)) break; diff --git a/src/code_806FDF4.c b/src/code_806FDF4.c index 1df01e6f7..7aa696d21 100644 --- a/src/code_806FDF4.c +++ b/src/code_806FDF4.c @@ -40,7 +40,7 @@ extern u8 *gUnknown_80FA090[]; void sub_8068FE0(Entity *, u32, Entity *); u8 sub_806B8CC(); -bool8 sub_805FBE8(u8 *a0); +bool8 DungeonGiveNameToRecruitedMon(u8 *a0); void sub_8083D88(); u8 sub_808529C(s32); void nullsub_96(Entity *pokemon,Entity *target); @@ -332,8 +332,13 @@ bool8 sub_806F9BC(s16 species) FriendAreaCapacity auStack_18; id = species; - if (((gDungeon->unk644.unk14 == 0) || (sub_808529C(id) == 0)) || - ((id == MONSTER_MEW && (gDungeon->unk644.unk34 == 1)))) { + if (!gDungeon->unk644.canRecruit) { + return FALSE; + } + else if (sub_808529C(id) == 0) { + return FALSE; + } + else if (id == MONSTER_MEW && gDungeon->unk644.unk34 == 1) { return FALSE; } else if (id == MONSTER_LATIAS) @@ -450,7 +455,7 @@ bool8 sub_806FA5C(Entity *entity1, Entity *entity2, struct unkStruct_8069D4C *pa sub_8083D88(); sub_803E708(0xa0,0x46); if (DisplayDungeonYesNoMessage(0,*gUnknown_80FA090,1) == 1) { - while (sub_805FBE8(pokeStruct2->name) == 0) { + while (DungeonGiveNameToRecruitedMon(pokeStruct2->name) == 0) { DisplayDungeonMessage(0,*gUnknown_80FA0C8,1); } } @@ -583,7 +588,7 @@ bool8 sub_806FDF4(Entity *entity1,Entity *entity2,Entity **entityPtr) } else { if (DisplayDungeonYesNoMessage(0,*gUnknown_80FA090,1) == 1) { - while (!sub_805FBE8(buffer)) { + while (!DungeonGiveNameToRecruitedMon(buffer)) { DisplayDungeonMessage(0,*gUnknown_80FA0C8,1); } } diff --git a/src/code_8072F3C.c b/src/code_8072F3C.c index 38c7c4101..17ff7d44d 100644 --- a/src/code_8072F3C.c +++ b/src/code_8072F3C.c @@ -29,7 +29,7 @@ struct unkStruct_203B314 EWRAM_INIT struct unkStruct_203B314 *gUnknown_203B314 = {NULL}; -const Window gUnknown_80E06FC = { +const WindowTemplate gUnknown_80E06FC = { 0x00, 0x03, 0x00, 0x00, @@ -38,7 +38,7 @@ const Window gUnknown_80E06FC = { NULL }; -const Window gUnknown_80E0714 = { +const WindowTemplate gUnknown_80E0714 = { 0x00, 0x06, 0x02, 0x02, @@ -46,7 +46,7 @@ const Window gUnknown_80E0714 = { 0x0E, 0x00, NULL }; -const Window gUnknown_80E072C = { +const WindowTemplate gUnknown_80E072C = { 0x00, 0x06, 0x02, 0x02, @@ -84,7 +84,7 @@ u32 sub_802F73C(u32 r0, DungeonPos *r1, u32 r2, u8 r3) else gUnknown_203B314->sBC.s0.windows.id[gUnknown_203B314->sBC.s0.unk34] = gUnknown_80E0714; - gUnknown_203B314->sBC.s0.unk38->unk14 = &gUnknown_203B314->sBC.unk9C; + gUnknown_203B314->sBC.s0.unk38->header = &gUnknown_203B314->sBC.unk9C; if (r1 != 0) gUnknown_203B314->sBC.s0.windows.id[gUnknown_203B314->sBC.s0.unk34].pos = *r1; @@ -179,9 +179,9 @@ void sub_802F974(void) void sub_802F9C0(void) { - gUnknown_203B314->sBC.unk9C.f0 = 1; - gUnknown_203B314->sBC.unk9C.f1 = 0; - gUnknown_203B314->sBC.unk9C.f2 = 8; + gUnknown_203B314->sBC.unk9C.count = 1; + gUnknown_203B314->sBC.unk9C.currId = 0; + gUnknown_203B314->sBC.unk9C.width = 8; gUnknown_203B314->sBC.unk9C.f3 = 0; SUB_80095E4_CALL(gUnknown_203B314->sBC.s0); @@ -199,7 +199,7 @@ void sub_802FA50(void) CallPrepareTextbox_8008C54(gUnknown_203B314->sBC.s0.unk34); sub_80073B8(gUnknown_203B314->sBC.s0.unk34); PrintStringOnWindow(10,0,gUnknown_80E0744,gUnknown_203B314->sBC.s0.unk34,0); - sub_8012BC4(gUnknown_203B314->sBC.unk9C.f2 * 8 + 4,0,gUnknown_203B314->sBC.s0.input.unk1E + 1,2,7,gUnknown_203B314->sBC.s0.unk34); + sub_8012BC4(gUnknown_203B314->sBC.unk9C.width * 8 + 4,0,gUnknown_203B314->sBC.s0.input.unk1E + 1,2,7,gUnknown_203B314->sBC.s0.unk34); if (gUnknown_203B314->unkB8 != 0) { for(counter = 0; counter < gUnknown_203B314->sBC.s0.input.unk1A; counter++) { diff --git a/src/code_8073CF0.c b/src/code_8073CF0.c index 6a06e5be5..fa2eb2d7d 100644 --- a/src/code_8073CF0.c +++ b/src/code_8073CF0.c @@ -912,7 +912,7 @@ bool8 UseAttack(Entity *a0) if (gDungeon->unk644.unk28 == 0 && r9) { sub_80526D0(0x35); for (loop = 0; loop < 24 / gUnknown_202F378; loop++) { - sub_803E46C(7); + DungeonRunFrameActions(7); for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { Entity *mon = gDungeon->activePokemon[i]; if (EntityIsValid(mon)) { diff --git a/src/code_8077274_1.c b/src/code_8077274_1.c index 25944ff33..c53c54c31 100644 --- a/src/code_8077274_1.c +++ b/src/code_8077274_1.c @@ -370,7 +370,7 @@ void BlindTarget(Entity *pokemon, Entity *target) entityInfo->blinkerClassStatus.turns = CalculateStatusTurns(target,gBlinkerTurnRange, TRUE) + 1; sub_8041E0C(target); TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FB7F4); - sub_803E46C(0x31); + DungeonRunFrameActions(0x31); sub_8049ED4(); ShowWholeRevealedDungeonMap(); } @@ -423,7 +423,7 @@ void RestoreVisionTarget(Entity *pokemon, Entity *target) entityInfo->blinkerClassStatus.turns = CalculateStatusTurns(target,gEyedropsTurnRange, FALSE) + 1; sub_8041E3C(target); TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FB880); - sub_803E46C(0x31); + DungeonRunFrameActions(0x31); sub_8049ED4(); ShowWholeRevealedDungeonMap(); } @@ -691,7 +691,7 @@ void SetChargeStatusTarget(Entity *pokemon, Entity *target, u8 newStatus, Move * if (bVar2) { break; } - sub_803E46C(0x53); + DungeonRunFrameActions(0x53); } } } @@ -1506,7 +1506,7 @@ void SendEyesightEndMessage(Entity * pokemon,Entity * target) entityInfo->blinkerClassStatus.status = STATUS_NONE; EntityUpdateStatusSprites(target); if (entityInfo->isTeamLeader) { - sub_803E46C(0x31); + DungeonRunFrameActions(0x31); sub_8049ED4(); ShowWholeRevealedDungeonMap(); } @@ -1734,7 +1734,7 @@ void sub_807AB38(Entity *entity, bool8 forcedMonsterHouse) if (newMonster->unk1C.raw < IntToF248_2(1).raw) { break; } - sub_803E46C(0x57); + DungeonRunFrameActions(0x57); } newMonster->unk1C = IntToF248_2(0); } diff --git a/src/code_807CD9C.c b/src/code_807CD9C.c index a8db22a03..ccad2b1b2 100644 --- a/src/code_807CD9C.c +++ b/src/code_807CD9C.c @@ -25,7 +25,7 @@ #include "weather.h" #include "dungeon_config.h" -extern u32 gUnknown_202EDCC; +extern u32 gDungeonFramesCounter; extern u8 *gUnknown_80FCA10[]; extern u8 *gUnknown_80F8A0C[]; @@ -129,7 +129,7 @@ void BlowAwayTarget(Entity *pokemon, Entity *target, u32 direction) { IncreaseEntityPixelPos(target,pos32.x,pos32.y); if (sub_8045888(target) != 0) { - sub_803E46C(0x19); + DungeonRunFrameActions(0x19); } } tile = GetTile(pos.x, pos.y); @@ -230,7 +230,7 @@ void sub_807D068(Entity *pokemon, DungeonPos *pos) pokemon->unk1C.raw = sin_4096(iVar8) * 0xc; sub_804535C(pokemon, &local_34); if (sub_8045888(pokemon)) { - sub_803E46C(0x1a); + DungeonRunFrameActions(0x1a); } iVar8 = iVar8 + 0xaa; } @@ -239,7 +239,7 @@ _0807D11E: local_34.y = posY; pokemon->unk1C = IntToF248(0); sub_804535C(pokemon,&local_34); - sub_803E46C(0x1a); + DungeonRunFrameActions(0x1a); } void WarpTarget(Entity *pokemon, Entity *target, u32 param_3, DungeonPos *pos) @@ -278,12 +278,12 @@ void WarpTarget(Entity *pokemon, Entity *target, u32 param_3, DungeonPos *pos) direction = (info->action).direction; target->unk1C.raw += + 0x800; while ( target->unk1C.raw < 0xa000) { - if ((gUnknown_202EDCC & 3) == 0) { + if ((gDungeonFramesCounter & 3) == 0) { direction = (direction + 1) & DIRECTION_MASK; info->action.direction = direction & DIRECTION_MASK; sub_806CE68(target,direction); } - sub_803E46C(0x22); + DungeonRunFrameActions(0x22); target->unk1C.raw += 0x800; } } @@ -324,17 +324,17 @@ void WarpTarget(Entity *pokemon, Entity *target, u32 param_3, DungeonPos *pos) direction = (info->action).direction; target->unk1C.raw = 0x9c00; do { - if ((gUnknown_202EDCC & 3) == 0) { + if ((gDungeonFramesCounter & 3) == 0) { direction = (direction + 1) & DIRECTION_MASK; info->action.direction = direction & DIRECTION_MASK; sub_806CE68(target,direction); } - sub_803E46C(0x22); + DungeonRunFrameActions(0x22); target->unk1C.raw -= 0x400; } while (0 < target->unk1C.raw); } target->unk1C = IntToF248_2(0); - sub_803E46C(0x22); + DungeonRunFrameActions(0x22); if (flag) { TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FCB14); // But it dropped back at the same spot! } @@ -523,7 +523,7 @@ void HandleTrawlOrbAction(Entity *user, Entity *target) } } - sub_803E46C(0x13); + DungeonRunFrameActions(0x13); unkAngle += 0x22; if (!(animFrame & 3)) { var++; @@ -587,7 +587,7 @@ void HandlePounceOrbAction(Entity *pokemon, Entity *target, u8 r2) { sub_804535C(target, 0); if(!sub_8045888(target)) continue; - sub_803E46C(0x3A); + DungeonRunFrameActions(0x3A); } sub_806A5B8(target); diff --git a/src/code_807E5AC.c b/src/code_807E5AC.c index b01375b4e..467fecef3 100644 --- a/src/code_807E5AC.c +++ b/src/code_807E5AC.c @@ -83,7 +83,7 @@ void sub_807E698(bool8 arg0) u8 savedByte; sub_8042818(GetApparentWeather(NULL), arg0); - sub_803E46C(0x25); + DungeonRunFrameActions(0x25); sub_804178C(1); savedByte = gUnknown_203B40D; gUnknown_203B40D = 1; @@ -91,7 +91,7 @@ void sub_807E698(bool8 arg0) for (i = 0; i < 64; i++) { bool8 r7 = FALSE; - sub_803E46C(0x25); + DungeonRunFrameActions(0x25); for (j = 0; j < COLOR_RAMP_COUNT; j++) { if (abs(gDungeon->colorRamp[j].r - fileData[weatherArrId + j].r) < 10) { gDungeon->colorRamp[j].r = fileData[weatherArrId + j].r; @@ -755,7 +755,7 @@ void sub_807F43C(Entity *target, Entity *attacker) sub_804535C(attacker, &var_54); if (sub_8045888(attacker)) { attacker->unk1C.raw = sin_4096(var_2C) << 5; - sub_803E46C(0x3B); + DungeonRunFrameActions(0x3B); if (!(i & 3)) { attackerDirection &= DIRECTION_MASK; sub_806CDD4(attacker, 6, attackerDirection); @@ -769,7 +769,7 @@ void sub_807F43C(Entity *target, Entity *attacker) var_54.y = pixelPosY; attacker->unk1C.raw = 0; sub_804535C(attacker, &var_54); - sub_803E46C(0x3B); + DungeonRunFrameActions(0x3B); GetEntInfo(attacker)->action.direction = attackerDirection & DIRECTION_MASK; tileEntity = GetTile(attackerPos.x, attackerPos.y)->monster; diff --git a/src/code_8085E98.c b/src/code_8085E98.c index 1a1d2db91..ec0886d27 100644 --- a/src/code_8085E98.c +++ b/src/code_8085E98.c @@ -46,7 +46,7 @@ u32 sub_8085EC8(s16 param_1,u32 param_2,u32 param_3,DungeonPos *param_4, sub_800EE5C(param_1_s32); sub_800EF64(); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); local_40.unk0 = param_1; local_40.unk4 = param_2; local_40.dir = param_3; @@ -69,7 +69,7 @@ void sub_8085F44(s32 param_1) { while (sub_800E9A8(param_1)) { sub_800E90C(&gDungeon->unk181e8.cameraPixelPos); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } diff --git a/src/code_80861A8.c b/src/code_80861A8.c index 69fc275d7..076532e8c 100644 --- a/src/code_80861A8.c +++ b/src/code_80861A8.c @@ -20,7 +20,7 @@ static void sub_80861EC(Entity *); void sub_800EE5C(s32); void sub_800EF64(); -void sub_803E46C(s32); +void DungeonRunFrameActions(s32); s32 sub_800E700(s32); void sub_800569C(DungeonPos *, axdata *, u8); void sub_8085F44(s32); @@ -90,7 +90,7 @@ s32 sub_80861F8(s32 param_1,Entity *param_2,bool32 param_3) sub_800EE5C(param_1Copy2); sub_800EF64(); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); info = GetEntInfo(param_2); pos.x = 0; pos.y = 0; diff --git a/src/code_80869E4.c b/src/code_80869E4.c index 80578f4d5..a64cc5c99 100644 --- a/src/code_80869E4.c +++ b/src/code_80869E4.c @@ -147,7 +147,7 @@ void sub_8086448(void) YPos += 0x100; sub_803F878(XPos, YPos); sub_80855E4(sub_8086410); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_80855E4(sub_80863F8); @@ -173,7 +173,7 @@ static void sub_8086494(void) for (i = 0; i < 144; i++) { sub_80855E4(sub_8086424); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_8086310); @@ -193,7 +193,7 @@ void sub_8086500(void) YPos = GetCameraYPos(); sub_803F878(XPos, YPos); sub_80855E4(sub_8086434); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_8086404); @@ -213,7 +213,7 @@ void sub_808654C(void) YPos = GetCameraYPos(); sub_803F878(XPos, YPos); sub_80855E4(sub_8086434); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_8086404); @@ -232,7 +232,7 @@ void sub_8086598(void) YPos = GetCameraYPos(); sub_803F878(XPos, YPos - 0x100); sub_80855E4(sub_8086410); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_80863F8); @@ -252,7 +252,7 @@ void sub_80865E8(void) sub_803F878(XPos, YPos + 0x200); sub_80855E4(sub_8086424); sub_80855E4(sub_8086424); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_80863F8); @@ -272,7 +272,7 @@ void sub_808663C(void) sub_803F878(XPos, YPos + 0x200); sub_80855E4(sub_8086424); sub_80855E4(sub_8086424); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_80863F8); @@ -286,7 +286,7 @@ void sub_8086690(void) for (i = 0; i < 48; i++) { sub_80855E4(sub_8086434); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_80855E4(sub_8086404); @@ -308,7 +308,7 @@ UNUSED static void sub_80866FC(void) for (i = 0; i >= -250; i -= 10) { SetDungeonBGColorRGB(i, i, i, 1, 0); - sub_803E46C(70); + DungeonRunFrameActions(70); } } @@ -323,7 +323,7 @@ void sub_8086738(void) for (i = 0; i < 250; i += 10) { SetDungeonBGColorRGB(i, i, i, 1, 0); - sub_803E46C(70); + DungeonRunFrameActions(70); } } @@ -333,7 +333,7 @@ void sub_8086764(void) for (i = 250; i >= 0; i -= 5) { SetDungeonBGColorRGB(i, i, i, 1, 0); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_8085EB0(); @@ -348,7 +348,7 @@ void sub_8086794(void) for (i = 0; i < 200; i++) { SetDungeonBGColorRGB(0, 0, 0, 1, 0); BgColorCallNullsub4(); - sub_803E46C(70); + DungeonRunFrameActions(70); if ((i & 3) == 0) { gDungeonBrightness++; @@ -357,7 +357,7 @@ void sub_8086794(void) } } - sub_803E46C(70); + DungeonRunFrameActions(70); gDungeon->unk7 = 0; } diff --git a/src/credits1.c b/src/credits1.c index 4b00e775c..1d66e0026 100644 --- a/src/credits1.c +++ b/src/credits1.c @@ -8,8 +8,8 @@ static EWRAM_INIT Credits1Work *sCredits1Work = {NULL}; -extern const Window gUnknown_80E4A10; -extern const Window gUnknown_80E4A28; +extern const WindowTemplate gUnknown_80E4A10; +extern const WindowTemplate gUnknown_80E4A28; extern const u32 gUnknown_80E4A40[]; extern const CreditsData* gCreditsTable[27]; diff --git a/src/data/adventure_log.h b/src/data/adventure_log.h index 37308cd0a..e57826d59 100644 --- a/src/data/adventure_log.h +++ b/src/data/adventure_log.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E1FF0 = +static const WindowTemplate sUnknown_80E1FF0 = { 0, 3, @@ -8,7 +8,7 @@ static const Window sUnknown_80E1FF0 = NULL }; -static const Window sUnknown_80E2008 = +static const WindowTemplate sUnknown_80E2008 = { 0, 6, diff --git a/src/data/code_801602C.h b/src/data/code_801602C.h index 5c29147dc..4cdb3b6ca 100644 --- a/src/data/code_801602C.h +++ b/src/data/code_801602C.h @@ -5,7 +5,7 @@ enum MENU_ACTION_NO, }; -UNUSED static const Window sUnknown_80DB670 = +UNUSED static const WindowTemplate sUnknown_80DB670 = { 0, 3, diff --git a/src/data/code_801B60C.h b/src/data/code_801B60C.h index 0bb10ae5d..01588c736 100644 --- a/src/data/code_801B60C.h +++ b/src/data/code_801B60C.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBA58 = { +static const WindowTemplate sUnknown_80DBA58 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DBA58 = { NULL }; -static const Window sUnknown_80DBA70 = { +static const WindowTemplate sUnknown_80DBA70 = { 0, 3, 20, 4, @@ -16,7 +16,7 @@ static const Window sUnknown_80DBA70 = { NULL }; -static const Window sUnknown_80DBA88 = { +static const WindowTemplate sUnknown_80DBA88 = { 0, 3, 20, 14, diff --git a/src/data/code_801C8C4.h b/src/data/code_801C8C4.h index ff666225a..eadec3e8c 100644 --- a/src/data/code_801C8C4.h +++ b/src/data/code_801C8C4.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBE3C = { +static const WindowTemplate sUnknown_80DBE3C = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DBE3C = { NULL }; -static const Window sUnknown_80DBE54 = { +static const WindowTemplate sUnknown_80DBE54 = { 0, 6, 2, 2, diff --git a/src/data/code_801D014.h b/src/data/code_801D014.h index 376c6f6f3..a2f79ca41 100644 --- a/src/data/code_801D014.h +++ b/src/data/code_801D014.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBE7C = { +static const WindowTemplate sUnknown_80DBE7C = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DBE7C = { }; static const WindowHeader sUnknown_80DBE94 = {1, 0, 7, 0}; -static const Window sUnknown_80DBE98 = { +static const WindowTemplate sUnknown_80DBE98 = { 0, 6, 2, 2, @@ -17,7 +17,7 @@ static const Window sUnknown_80DBE98 = { &sUnknown_80DBE94 }; -static const Window sUnknown_80DBEB0[MAX_WINDOWS] = +static const WindowTemplate sUnknown_80DBEB0[MAX_WINDOWS] = { { 0, diff --git a/src/data/code_801D9E4.h b/src/data/code_801D9E4.h index 33fc54c10..05aa19e53 100644 --- a/src/data/code_801D9E4.h +++ b/src/data/code_801D9E4.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBF70 = { +static const WindowTemplate sUnknown_80DBF70 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DBF70 = { NULL }; -static const Window sUnknown_80DBF88 = { +static const WindowTemplate sUnknown_80DBF88 = { 0, 6, 2, 2, diff --git a/src/data/code_80227B8.h b/src/data/code_80227B8.h index 3427469eb..25cc207d1 100644 --- a/src/data/code_80227B8.h +++ b/src/data/code_80227B8.h @@ -5,7 +5,7 @@ static const MenuItem sUnknown_80DC584[3] = {NULL, 1}, }; -static const Window sUnknown_80DC5A4 = +static const WindowTemplate sUnknown_80DC5A4 = { 0, 3, @@ -14,7 +14,7 @@ static const Window sUnknown_80DC5A4 = 0, 0, NULL }; -static const Window sUnknown_80DC5BC = +static const WindowTemplate sUnknown_80DC5BC = { 0, 3, @@ -23,7 +23,7 @@ static const Window sUnknown_80DC5BC = 3, 0, NULL }; -static const Window sUnknown_80DC5D4 = +static const WindowTemplate sUnknown_80DC5D4 = { 0, 3, diff --git a/src/data/code_8023144.h b/src/data/code_8023144.h index 286bf91b3..19ed68ad8 100644 --- a/src/data/code_8023144.h +++ b/src/data/code_8023144.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC904 = +static const WindowTemplate sUnknown_80DC904 = { 0, 3, @@ -8,7 +8,7 @@ static const Window sUnknown_80DC904 = NULL }; -static const Window sUnknown_80DC91C = +static const WindowTemplate sUnknown_80DC91C = { 0, 6, diff --git a/src/data/code_8023868.h b/src/data/code_8023868.h index 23a3f657e..2222d6cb9 100644 --- a/src/data/code_8023868.h +++ b/src/data/code_8023868.h @@ -1,5 +1,5 @@ //static // MAKE STATIC WHEN code_8023868.s IS DONE -const Window sUnknown_80DC950 = { +const WindowTemplate sUnknown_80DC950 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ const Window sUnknown_80DC950 = { NULL }; //static // MAKE STATIC WHEN code_8023868.s IS DONE -const Window sUnknown_80DC968 = { +const WindowTemplate sUnknown_80DC968 = { 0, 6, 2, 2, diff --git a/src/data/code_8024458.h b/src/data/code_8024458.h index 69ff03565..6f3437de5 100644 --- a/src/data/code_8024458.h +++ b/src/data/code_8024458.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC9B0 = { +static const WindowTemplate sUnknown_80DC9B0 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DC9B0 = { NULL }; -static const Window sUnknown_80DC9C8 = { +static const WindowTemplate sUnknown_80DC9C8 = { 0, 6, 2, 2, diff --git a/src/data/code_802DB28.h b/src/data/code_802DB28.h index b41239deb..74a9165cf 100644 --- a/src/data/code_802DB28.h +++ b/src/data/code_802DB28.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E016C = { +static const WindowTemplate sUnknown_80E016C = { 0, 3, 0, 0, diff --git a/src/data/code_802DE84.h b/src/data/code_802DE84.h index 2b93977e1..b228a2ede 100644 --- a/src/data/code_802DE84.h +++ b/src/data/code_802DE84.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E0248 = { +static const WindowTemplate sUnknown_80E0248 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80E0248 = { }; static const WindowHeader sUnknown_80E0260 = {1, 0, 18, 0}; -static const Window sUnknown_80E0264 = { +static const WindowTemplate sUnknown_80E0264 = { 0, 6, 2, 2, diff --git a/src/data/debug_menu1.h b/src/data/debug_menu1.h index bf0f7f226..ce9c362b3 100644 --- a/src/data/debug_menu1.h +++ b/src/data/debug_menu1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E7D40 = { +static const WindowTemplate sUnknown_80E7D40 = { 0, 3, 0, 0, @@ -6,7 +6,7 @@ static const Window sUnknown_80E7D40 = { 0, 0, NULL }; -static const Window sUnknown_80E7D58 = { +static const WindowTemplate sUnknown_80E7D58 = { 0, 3, 2, 2, diff --git a/src/data/debug_menu2.h b/src/data/debug_menu2.h index 4cc4d3f3f..a9a8aff24 100644 --- a/src/data/debug_menu2.h +++ b/src/data/debug_menu2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E7E34 = +static const WindowTemplate sUnknown_80E7E34 = { 0, 3, @@ -8,7 +8,7 @@ static const Window sUnknown_80E7E34 = NULL }; -static const Window sUnknown_80E7E4C = +static const WindowTemplate sUnknown_80E7E4C = { 0, 3, @@ -18,7 +18,7 @@ static const Window sUnknown_80E7E4C = NULL }; -static const Window sUnknown_80E7E64 = +static const WindowTemplate sUnknown_80E7E64 = { 0, 3, diff --git a/src/data/debug_menu3.h b/src/data/debug_menu3.h index 4155d7d84..b61916104 100644 --- a/src/data/debug_menu3.h +++ b/src/data/debug_menu3.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E7E8C = +static const WindowTemplate sUnknown_80E7E8C = { 0, 3, @@ -8,7 +8,7 @@ static const Window sUnknown_80E7E8C = NULL }; -static const Window sUnknown_80E7EA4 = +static const WindowTemplate sUnknown_80E7EA4 = { 0, 3, diff --git a/src/data/debug_menu4.h b/src/data/debug_menu4.h index 7a9a30388..b5cf883e2 100644 --- a/src/data/debug_menu4.h +++ b/src/data/debug_menu4.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E7ED4 = +static const WindowTemplate sUnknown_80E7ED4 = { 0, 3, @@ -8,7 +8,7 @@ static const Window sUnknown_80E7ED4 = NULL }; -static const Window sUnknown_80E7EEC = +static const WindowTemplate sUnknown_80E7EEC = { 0, 3, @@ -18,7 +18,7 @@ static const Window sUnknown_80E7EEC = NULL }; -static const Window sUnknown_80E7F04 = +static const WindowTemplate sUnknown_80E7F04 = { 0, 3, diff --git a/src/data/felicity_bank.h b/src/data/felicity_bank.h index 7077a7b41..b5f6f1fdc 100644 --- a/src/data/felicity_bank.h +++ b/src/data/felicity_bank.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB6DC = { +static const WindowTemplate sUnknown_80DB6DC = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB6DC = { NULL }; -static const Window sUnknown_80DB6F4 = { +static const WindowTemplate sUnknown_80DB6F4 = { 0, 3, 2, 3, @@ -16,7 +16,7 @@ static const Window sUnknown_80DB6F4 = { NULL }; -static const Window sUnknown_80DB70C = { +static const WindowTemplate sUnknown_80DB70C = { 0, 3, 17, 8, diff --git a/src/data/friend_area_action_menu.h b/src/data/friend_area_action_menu.h index e29774519..5af41ec09 100644 --- a/src/data/friend_area_action_menu.h +++ b/src/data/friend_area_action_menu.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DD6EC = +static const WindowTemplate sUnknown_80DD6EC = { 0, 0x03, @@ -8,7 +8,7 @@ static const Window sUnknown_80DD6EC = NULL }; -static const Window sUnknown_80DD704 = +static const WindowTemplate sUnknown_80DD704 = { 0, 0x03, @@ -18,7 +18,7 @@ static const Window sUnknown_80DD704 = NULL }; -static const Window sUnknown_80DD71C = +static const WindowTemplate sUnknown_80DD71C = { 0, 0x03, @@ -28,7 +28,7 @@ static const Window sUnknown_80DD71C = NULL }; -static const Window sUnknown_80DD734 = +static const WindowTemplate sUnknown_80DD734 = { 0, 0x03, @@ -38,7 +38,7 @@ static const Window sUnknown_80DD734 = NULL }; -static const Window sUnknown_80DD74C = +static const WindowTemplate sUnknown_80DD74C = { 0, 0x03, diff --git a/src/data/friend_list_menu.h b/src/data/friend_list_menu.h index 19dfd7359..2652a9448 100644 --- a/src/data/friend_list_menu.h +++ b/src/data/friend_list_menu.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DD148 = { +static const WindowTemplate sUnknown_80DD148 = { 0, 0x03, 0x00, 0x00, @@ -7,7 +7,7 @@ static const Window sUnknown_80DD148 = { NULL }; -static const Window sUnknown_80DD160 = { +static const WindowTemplate sUnknown_80DD160 = { 0, 0x03, 0x13, 0x04, @@ -16,7 +16,7 @@ static const Window sUnknown_80DD160 = { NULL }; -static const Window sUnknown_80DD178 = { +static const WindowTemplate sUnknown_80DD178 = { 0, 0x03, 0x14, 0x04, @@ -25,7 +25,7 @@ static const Window sUnknown_80DD178 = { NULL }; -static const Window sUnknown_80DD190 = { +static const WindowTemplate sUnknown_80DD190 = { 0, 0x03, 0x02, 0x11, diff --git a/src/data/friend_rescue_menus.h b/src/data/friend_rescue_menus.h index 8c16570ac..3647c6f61 100644 --- a/src/data/friend_rescue_menus.h +++ b/src/data/friend_rescue_menus.h @@ -102,7 +102,7 @@ const MenuItem gUnknown_80E22F0[] = { {NULL, 8}, }; -const Window gUnknown_80E231C = +const WindowTemplate gUnknown_80E231C = { 0, 0x03, @@ -112,7 +112,7 @@ const Window gUnknown_80E231C = NULL }; -const Window gUnknown_80E2334 = +const WindowTemplate gUnknown_80E2334 = { 0, 0x03, @@ -142,7 +142,7 @@ const MenuItem gUnknown_80E23A8[] = { {NULL, 8}, }; -const Window gUnknown_80E23F0 = +const WindowTemplate gUnknown_80E23F0 = { 0, 0x03, @@ -159,7 +159,7 @@ const MenuItem gUnknown_80E2408[] = { {NULL, 8}, }; -UNUSED static const Window sUnused = +UNUSED static const WindowTemplate sUnused = { 0, 0x03, diff --git a/src/data/gulpin_shop.h b/src/data/gulpin_shop.h index 4c2daef02..0d52850df 100644 --- a/src/data/gulpin_shop.h +++ b/src/data/gulpin_shop.h @@ -1,4 +1,4 @@ -static const Window gUnknown_80DC11C = { +static const WindowTemplate gUnknown_80DC11C = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window gUnknown_80DC11C = { NULL }; -static const Window gUnknown_80DC134 = { +static const WindowTemplate gUnknown_80DC134 = { 0, 3, 22, 4, @@ -16,7 +16,7 @@ static const Window gUnknown_80DC134 = { NULL }; -UNUSED static const Window gUnknown_80DC14C = { +UNUSED static const WindowTemplate gUnknown_80DC14C = { 0, 3, 22, 14, diff --git a/src/data/gulpin_shop_801FB50.h b/src/data/gulpin_shop_801FB50.h index b9455ce27..340388da4 100644 --- a/src/data/gulpin_shop_801FB50.h +++ b/src/data/gulpin_shop_801FB50.h @@ -1,4 +1,4 @@ -static const Window gUnknown_80DC31C = { +static const WindowTemplate gUnknown_80DC31C = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window gUnknown_80DC31C = { NULL }; -static const Window gUnknown_80DC334 = { +static const WindowTemplate gUnknown_80DC334 = { 0, 3, 19, 4, @@ -16,7 +16,7 @@ static const Window gUnknown_80DC334 = { NULL }; -static const Window gUnknown_80DC34C = { +static const WindowTemplate gUnknown_80DC34C = { 0, 3, 22, 4, @@ -25,7 +25,7 @@ static const Window gUnknown_80DC34C = { NULL }; -UNUSED static const Window gUnknown_80DC364 = { +UNUSED static const WindowTemplate gUnknown_80DC364 = { 0, 3, 22, 14, @@ -34,7 +34,7 @@ UNUSED static const Window gUnknown_80DC364 = { NULL }; -static const Window gUnknown_80DC37C = { +static const WindowTemplate gUnknown_80DC37C = { 0, 3, 22, 3, diff --git a/src/data/hints_menu1.h b/src/data/hints_menu1.h index bab8d705a..1f45f1c8d 100644 --- a/src/data/hints_menu1.h +++ b/src/data/hints_menu1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC0A0 = { +static const WindowTemplate sUnknown_80DC0A0 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DC0A0 = { }; static const WindowHeader sUnknown_80DC0B8 = {1, 0, 8, 0}; -static const Window sUnknown_80DC0BC = { +static const WindowTemplate sUnknown_80DC0BC = { 0, 6, 2, 2, diff --git a/src/data/hints_menu2.h b/src/data/hints_menu2.h index bc545320f..05d2103c8 100644 --- a/src/data/hints_menu2.h +++ b/src/data/hints_menu2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC0E4 = { +static const WindowTemplate sUnknown_80DC0E4 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DC0E4 = { NULL }; -static const Window sUnknown_80DC0FC = { +static const WindowTemplate sUnknown_80DC0FC = { 0, 6, 2, 2, diff --git a/src/data/iq_skill_list_menu.h b/src/data/iq_skill_list_menu.h index 61a0dbe50..a440b396d 100644 --- a/src/data/iq_skill_list_menu.h +++ b/src/data/iq_skill_list_menu.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBDD8 = { +static const WindowTemplate sUnknown_80DBDD8 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DBDD8 = { NULL }; -static const Window sUnknown_80DBDF0 = { +static const WindowTemplate sUnknown_80DBDF0 = { 0, 6, 2, 2, diff --git a/src/data/iq_skill_menu.h b/src/data/iq_skill_menu.h index 75a4c0ea4..6aa346928 100644 --- a/src/data/iq_skill_menu.h +++ b/src/data/iq_skill_menu.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBD98 = { +static const WindowTemplate sUnknown_80DBD98 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DBD98 = { NULL }; -static const Window sUnknown_80DBDB0 = { +static const WindowTemplate sUnknown_80DBDB0 = { 0, 3, 20, 4, diff --git a/src/data/kangaskhan_storage1.h b/src/data/kangaskhan_storage1.h index ba09975f2..f65384233 100644 --- a/src/data/kangaskhan_storage1.h +++ b/src/data/kangaskhan_storage1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB748 = { +static const WindowTemplate sUnknown_80DB748 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB748 = { NULL }; -static const Window sUnknown_80DB760 = { +static const WindowTemplate sUnknown_80DB760 = { 0, 3, 20, 4, @@ -16,7 +16,7 @@ static const Window sUnknown_80DB760 = { NULL }; -static const Window sUnknown_80DB778 = { +static const WindowTemplate sUnknown_80DB778 = { 0, 3, 20, 9, @@ -25,7 +25,7 @@ static const Window sUnknown_80DB778 = { NULL }; -static const Window sUnknown_80DB790 = { +static const WindowTemplate sUnknown_80DB790 = { 0, 3, 20, 14, diff --git a/src/data/kangaskhan_storage2.h b/src/data/kangaskhan_storage2.h index fdbc9976f..aca2c1eb1 100644 --- a/src/data/kangaskhan_storage2.h +++ b/src/data/kangaskhan_storage2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB7B8 = { +static const WindowTemplate sUnknown_80DB7B8 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB7B8 = { NULL }; -static const Window sUnknown_80DB7D0 = { +static const WindowTemplate sUnknown_80DB7D0 = { 0, 3, 3, 3, @@ -16,7 +16,7 @@ static const Window sUnknown_80DB7D0 = { NULL }; -static const Window sUnknown_80DB7E8 = { +static const WindowTemplate sUnknown_80DB7E8 = { 0, 3, 20, 4, @@ -25,7 +25,7 @@ static const Window sUnknown_80DB7E8 = { NULL }; -static const Window sUnknown_80DB800 = { +static const WindowTemplate sUnknown_80DB800 = { 0, 3, 20, 9, @@ -34,7 +34,7 @@ static const Window sUnknown_80DB800 = { NULL }; -static const Window sUnknown_80DB818 = { +static const WindowTemplate sUnknown_80DB818 = { 0, 3, 20, 14, diff --git a/src/data/kecleon_bros1.h b/src/data/kecleon_bros1.h index e0bbf1366..a4f3fba9c 100644 --- a/src/data/kecleon_bros1.h +++ b/src/data/kecleon_bros1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB840 = { +static const WindowTemplate sUnknown_80DB840 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB840 = { NULL }; -static const Window sUnknown_80DB858 = { +static const WindowTemplate sUnknown_80DB858 = { 0, 3, 20, 4, @@ -16,7 +16,7 @@ static const Window sUnknown_80DB858 = { NULL }; -static const Window sUnknown_80DB870 = { +static const WindowTemplate sUnknown_80DB870 = { 0, 3, 20, 9, @@ -25,7 +25,7 @@ static const Window sUnknown_80DB870 = { NULL }; -static const Window sUnknown_80DB888 = { +static const WindowTemplate sUnknown_80DB888 = { 0, 3, 20, 14, diff --git a/src/data/kecleon_bros2.h b/src/data/kecleon_bros2.h index cd27baf16..5329bd0d3 100644 --- a/src/data/kecleon_bros2.h +++ b/src/data/kecleon_bros2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB8B4 = { +static const WindowTemplate sUnknown_80DB8B4 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB8B4 = { NULL }; -static const Window sUnknown_80DB8CC = { +static const WindowTemplate sUnknown_80DB8CC = { 0, 6, 2, 2, diff --git a/src/data/kecleon_bros3.h b/src/data/kecleon_bros3.h index 986a1542e..7518164cf 100644 --- a/src/data/kecleon_bros3.h +++ b/src/data/kecleon_bros3.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB8FC = { +static const WindowTemplate sUnknown_80DB8FC = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB8FC = { NULL }; -static const Window sUnknown_80DB914 = { +static const WindowTemplate sUnknown_80DB914 = { 0, 6, 2, 2, diff --git a/src/data/kecleon_bros4.h b/src/data/kecleon_bros4.h index 7b9d49c08..1b6b164cf 100644 --- a/src/data/kecleon_bros4.h +++ b/src/data/kecleon_bros4.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DB944 = { +static const WindowTemplate sUnknown_80DB944 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DB944 = { NULL }; -static const Window sUnknown_80DB95C = { +static const WindowTemplate sUnknown_80DB95C = { 0, 6, 2, 2, diff --git a/src/data/luminous_cave.h b/src/data/luminous_cave.h index 066ee4ae8..f6421bcf9 100644 --- a/src/data/luminous_cave.h +++ b/src/data/luminous_cave.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC9E8 = { +static const WindowTemplate sUnknown_80DC9E8 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DC9E8 = { NULL }; -static const Window sUnknown_80DCA00 = { +static const WindowTemplate sUnknown_80DCA00 = { 0, 3, 20, 4, diff --git a/src/data/main_menu1.h b/src/data/main_menu1.h index 8f03055ab..3d100f536 100644 --- a/src/data/main_menu1.h +++ b/src/data/main_menu1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E59A8 = { +static const WindowTemplate sUnknown_80E59A8 = { 0, 3, 0, 0, diff --git a/src/data/main_menu2.h b/src/data/main_menu2.h index c8e88f1c9..7b8024001 100644 --- a/src/data/main_menu2.h +++ b/src/data/main_menu2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E59C8 = { +static const WindowTemplate sUnknown_80E59C8 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80E59C8 = { NULL }; -static const Window sUnknown_80E59E0 = { +static const WindowTemplate sUnknown_80E59E0 = { 0, 3, 2, 2, @@ -22,7 +22,7 @@ static const MenuItem sUnknown_80E59F8[] = { {NULL, 0xFFDD}, }; -UNUSED static const Window sUnknown_80E5A29 = { +UNUSED static const WindowTemplate sUnknown_80E5A29 = { 0, 3, 2, 2, @@ -36,7 +36,7 @@ UNUSED static const MenuItem sUnknown_80E5A44[] = { {NULL, 0xFFDD}, }; -static const Window sUnknown_80E5A60 = { +static const WindowTemplate sUnknown_80E5A60 = { 0, 3, 2, 2, @@ -45,7 +45,7 @@ static const Window sUnknown_80E5A60 = { NULL }; -static const Window sUnknown_80E5A78 = { +static const WindowTemplate sUnknown_80E5A78 = { 0, 3, 2, 2, @@ -73,7 +73,7 @@ static const MenuItem sUnknown_80E5AFC[] = { {NULL, 0xFFDD}, }; -static const Window sUnknown_80E5B34 = { +static const WindowTemplate sUnknown_80E5B34 = { 0, 3, 2, 2, @@ -101,7 +101,7 @@ static const MenuItem sUnknown_80E5B8C[] = { {NULL, 0xFFDD}, }; -static const Window sUnknown_80E5BC4 = { +static const WindowTemplate sUnknown_80E5BC4 = { 0, 3, 2, 2, @@ -129,7 +129,7 @@ static const MenuItem sUnknown_80E5C18[] = { {NULL, 0xFFDD}, }; -UNUSED static const Window sUnknown_80E5C50 = { +UNUSED static const WindowTemplate sUnknown_80E5C50 = { 0, 3, 2, 2, @@ -150,7 +150,7 @@ UNUSED static const MenuItem sUnknown_80E5C9C[] = { {NULL, 0xFFDD}, }; -static const Window sUnknown_80E5CB4 = { +static const WindowTemplate sUnknown_80E5CB4 = { 0, 3, 2, 15, diff --git a/src/data/makuhita_dojo1.h b/src/data/makuhita_dojo1.h index 6f49398e4..a5a72b2a0 100644 --- a/src/data/makuhita_dojo1.h +++ b/src/data/makuhita_dojo1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E0760 = { +static const WindowTemplate sUnknown_80E0760 = { 0, 3, 0, 0, diff --git a/src/data/makuhita_dojo2.h b/src/data/makuhita_dojo2.h index bd23d5d29..c2a77bb33 100644 --- a/src/data/makuhita_dojo2.h +++ b/src/data/makuhita_dojo2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E07EC = { +static const WindowTemplate sUnknown_80E07EC = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80E07EC = { NULL }; -static const Window sUnknown_80E0804 = { +static const WindowTemplate sUnknown_80E0804 = { 0, 6, 2, 2, diff --git a/src/data/options_menu1.h b/src/data/options_menu1.h index fbe669c26..d7099dca9 100644 --- a/src/data/options_menu1.h +++ b/src/data/options_menu1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DBFB0 = { +static const WindowTemplate sUnknown_80DBFB0 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DBFB0 = { }; static const WindowHeader sUnknown_80DBFC8 = {1, 0, 7, 0}; -static const Window sUnknown_80DBFCC = { +static const WindowTemplate sUnknown_80DBFCC = { 0, 6, 2, 2, diff --git a/src/data/options_menu2.h b/src/data/options_menu2.h index 4fa347641..34b8deeed 100644 --- a/src/data/options_menu2.h +++ b/src/data/options_menu2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC020 = { +static const WindowTemplate sUnknown_80DC020 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DC020 = { }; static const WindowHeader sUnknown_80DC038 = {1, 0, 10, 0}; -static const Window sUnknown_80DC03C = { +static const WindowTemplate sUnknown_80DC03C = { 0, 6, 2, 2, diff --git a/src/data/other_menus1.h b/src/data/other_menus1.h index 28137b35f..d81733ebe 100644 --- a/src/data/other_menus1.h +++ b/src/data/other_menus1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E653C = { +static const WindowTemplate sUnknown_80E653C = { 0, 3, 0, 0, @@ -6,7 +6,7 @@ static const Window sUnknown_80E653C = { 0, 0, NULL }; -static const Window sUnknown_80E6554 = { +static const WindowTemplate sUnknown_80E6554 = { 0, 3, 3, 8, @@ -50,7 +50,7 @@ static const MenuItem sUnknown_80E667C[] = { {NULL, 3}, }; -static const Window sUnknown_80E66BC = { +static const WindowTemplate sUnknown_80E66BC = { 0, 3, 3, 8, @@ -66,7 +66,7 @@ static const MenuItem sUnknown_80E66D4[] = { {NULL, 3}, }; -static const Window sUnknown_80E6748 = { +static const WindowTemplate sUnknown_80E6748 = { 0, 3, 3, 8, @@ -82,7 +82,7 @@ static const MenuItem sUnknown_80E6760[] = { {NULL, 3}, }; -static const Window sUnknown_80E67D4 = { +static const WindowTemplate sUnknown_80E67D4 = { 0, 3, 3, 8, @@ -98,7 +98,7 @@ static const MenuItem sUnknown_80E67EC[] = { {NULL, 3}, }; -static const Window sUnknown_80E6830 = { +static const WindowTemplate sUnknown_80E6830 = { 0, 3, 3, 8, @@ -114,7 +114,7 @@ static const MenuItem sUnknown_80E6848[] = { {NULL, 3}, }; -static const Window sUnknown_80E689C = { +static const WindowTemplate sUnknown_80E689C = { 0, 3, 3, 8, @@ -130,7 +130,7 @@ static const MenuItem sUnknown_80E68B4[] = { {NULL, 3}, }; -static const Window sUnknown_80E6938 = { +static const WindowTemplate sUnknown_80E6938 = { 0, 3, 3, 8, @@ -146,7 +146,7 @@ static const MenuItem sUnknown_80E6950[] = { {NULL, 3}, }; -static const Window sUnknown_80E69B0 = { +static const WindowTemplate sUnknown_80E69B0 = { 0, 3, 3, 8, @@ -162,7 +162,7 @@ static const MenuItem sUnknown_80E69C8[] = { {NULL, 3}, }; -static const Window sUnknown_80E6A10 = { +static const WindowTemplate sUnknown_80E6A10 = { 0, 3, 3, 8, @@ -178,7 +178,7 @@ static const MenuItem sUnknown_80E6A28[] = { {NULL, 3}, }; -static const Window sUnknown_80E6A74 = { +static const WindowTemplate sUnknown_80E6A74 = { 0, 3, 3, 8, @@ -194,7 +194,7 @@ static const MenuItem sUnknown_80E6A8C[] = { {NULL, 3}, }; -UNUSED static const Window sUnknown_80E6AEC = { +UNUSED static const WindowTemplate sUnknown_80E6AEC = { 0, 3, 3, 8, @@ -210,7 +210,7 @@ UNUSED static const MenuItem sUnknown_80E6B04[] = { {NULL, 3}, }; -static const Window sUnknown_80E6B78 = { +static const WindowTemplate sUnknown_80E6B78 = { 0, 3, 3, 8, @@ -226,7 +226,7 @@ static const MenuItem sUnknown_80E6B90[] = { {NULL, 3}, }; -static const Window sUnknown_80E6BF4 = { +static const WindowTemplate sUnknown_80E6BF4 = { 0, 3, 3, 8, @@ -242,7 +242,7 @@ static const MenuItem sUnknown_80E6C0C[] = { {NULL, 3}, }; -static const Window sUnknown_80E6C50 = { +static const WindowTemplate sUnknown_80E6C50 = { 0, 3, 3, 8, @@ -258,7 +258,7 @@ static const MenuItem sUnknown_80E6C68[] = { {NULL, 3}, }; -static const Window sUnknown_80E6CD0 = { +static const WindowTemplate sUnknown_80E6CD0 = { 0, 3, 3, 8, @@ -274,7 +274,7 @@ static const MenuItem sUnknown_80E6CE8[] = { {NULL, 3}, }; -static const Window sUnknown_80E6D54 = { +static const WindowTemplate sUnknown_80E6D54 = { 0, 3, 3, 8, @@ -290,7 +290,7 @@ static const MenuItem sUnknown_80E6D6C[] = { {NULL, 3}, }; -static const Window sUnknown_80E6DDC = { +static const WindowTemplate sUnknown_80E6DDC = { 0, 3, 3, 8, diff --git a/src/data/party_list_menu.h b/src/data/party_list_menu.h index ef5bba45b..e20505631 100644 --- a/src/data/party_list_menu.h +++ b/src/data/party_list_menu.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DD310 = { +static const WindowTemplate sUnknown_80DD310 = { 0, 0x03, 0x00, 0x00, @@ -7,7 +7,7 @@ static const Window sUnknown_80DD310 = { NULL }; -static const Window sUnknown_80DD328 = { +static const WindowTemplate sUnknown_80DD328 = { 0, 0x03, 0x13, 0x03, @@ -16,7 +16,7 @@ static const Window sUnknown_80DD328 = { NULL }; -static const Window sUnknown_80DD340 = { +static const WindowTemplate sUnknown_80DD340 = { 0, 0x03, 0x14, 0x04, @@ -25,7 +25,7 @@ static const Window sUnknown_80DD340 = { NULL }; -static const Window sUnknown_80DD358 = { +static const WindowTemplate sUnknown_80DD358 = { 0, 0x03, 0x02, 0x11, @@ -34,7 +34,7 @@ static const Window sUnknown_80DD358 = { NULL }; -static const Window sUnknown_80DD370 = { +static const WindowTemplate sUnknown_80DD370 = { 0, 0x03, 0x02, 0x03, diff --git a/src/data/personality_test1.h b/src/data/personality_test1.h index 3bd46e7a4..83c818aaa 100644 --- a/src/data/personality_test1.h +++ b/src/data/personality_test1.h @@ -819,7 +819,7 @@ static const u8* const sPersonalityTypeDescriptionTable[NUM_PERSONALITIES] = { [QUIRKY] = DESC_QUIRKY }; -static const Window sUnknown_80F4244 = { +static const WindowTemplate sUnknown_80F4244 = { 0, 5, 12, 6, diff --git a/src/data/personality_test2.h b/src/data/personality_test2.h index 4bf932a2c..c6a519cc5 100644 --- a/src/data/personality_test2.h +++ b/src/data/personality_test2.h @@ -12,7 +12,7 @@ const s16 gPartners[NUM_PARTNERS] = MONSTER_MUDKIP }; -const Window gUnknown_80F4278 = +const WindowTemplate gUnknown_80F4278 = { 0, 0x03, @@ -22,7 +22,7 @@ const Window gUnknown_80F4278 = NULL }; -const Window gUnknown_80F4290 = +const WindowTemplate gUnknown_80F4290 = { 0, 0x06, @@ -32,7 +32,7 @@ const Window gUnknown_80F4290 = NULL }; -const Window gUnknown_80F42A8 = +const WindowTemplate gUnknown_80F42A8 = { 0, 0x05, diff --git a/src/data/pokemon_news1.h b/src/data/pokemon_news1.h index 263418f51..a500570d3 100644 --- a/src/data/pokemon_news1.h +++ b/src/data/pokemon_news1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFBD0 = { +static const WindowTemplate sUnknown_80DFBD0 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DFBD0 = { }; static const WindowHeader sUnknown_80DFBE8 = {1, 0, 12, 0}; -static const Window sUnknown_80DFBEC = { +static const WindowTemplate sUnknown_80DFBEC = { 0, 6, 2, 2, diff --git a/src/data/pokemon_news2.h b/src/data/pokemon_news2.h index 4421b92d1..22678591d 100644 --- a/src/data/pokemon_news2.h +++ b/src/data/pokemon_news2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFC18 = { +static const WindowTemplate sUnknown_80DFC18 = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DFC18 = { }; static const WindowHeader sUnknown_80DFC30 = {1, 0, 22, 0}; -static const Window sUnknown_80DFC34 = { +static const WindowTemplate sUnknown_80DFC34 = { 0, 6, 2, 2, diff --git a/src/data/pokemon_news3.h b/src/data/pokemon_news3.h index a3219ea5b..f8e6096f6 100644 --- a/src/data/pokemon_news3.h +++ b/src/data/pokemon_news3.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFC5C = { +static const WindowTemplate sUnknown_80DFC5C = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DFC5C = { NULL }; -static const Window sUnknown_80DFC74 = { +static const WindowTemplate sUnknown_80DFC74 = { 0, 6, 2, 2, diff --git a/src/data/post_office_guide2.h b/src/data/post_office_guide2.h index 879a6f9be..5fdf0f6c8 100644 --- a/src/data/post_office_guide2.h +++ b/src/data/post_office_guide2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80E1EFC = +static const WindowTemplate sUnknown_80E1EFC = { 0, 3, @@ -10,7 +10,7 @@ static const Window sUnknown_80E1EFC = static const WindowHeader sUnknown_80E1F14 = {1, 0, 8, 0}; -static const Window sUnknown_80E1F18 = +static const WindowTemplate sUnknown_80E1F18 = { 0, 6, diff --git a/src/data/trade_items_menu.h b/src/data/trade_items_menu.h index fc0fe5349..430c45caa 100644 --- a/src/data/trade_items_menu.h +++ b/src/data/trade_items_menu.h @@ -10,7 +10,7 @@ static const MenuItem sUnknown_80E60D4[] = { {NULL, 0}, }; -static const Window sUnknown_80E60EC = +static const WindowTemplate sUnknown_80E60EC = { 0, 3, @@ -27,7 +27,7 @@ static const MenuItem sUnknown_80E6104[] = { {NULL, 0}, }; -static const Window unused = +static const WindowTemplate unused = { 0, 3, @@ -43,7 +43,7 @@ static const MenuItem sUnknown_80E6154[] = { {NULL, 0}, }; -static const Window sUnknown_80E6174 = +static const WindowTemplate sUnknown_80E6174 = { 0, 3, diff --git a/src/data/wigglytuff_shop1.h b/src/data/wigglytuff_shop1.h index 4857a05a2..04b147a41 100644 --- a/src/data/wigglytuff_shop1.h +++ b/src/data/wigglytuff_shop1.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC464 = { +static const WindowTemplate sUnknown_80DC464 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DC464 = { NULL }; -static const Window sUnknown_80DC47C = { +static const WindowTemplate sUnknown_80DC47C = { 0, 6, 2, 2, diff --git a/src/data/wigglytuff_shop2.h b/src/data/wigglytuff_shop2.h index 755dc97f3..866ba4d70 100644 --- a/src/data/wigglytuff_shop2.h +++ b/src/data/wigglytuff_shop2.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC4BC = { +static const WindowTemplate sUnknown_80DC4BC = { 0, 3, 0, 0, @@ -8,7 +8,7 @@ static const Window sUnknown_80DC4BC = { }; static const WindowHeader sUnknown_80DC4D4 = {1, 0, 18, 0}; -static const Window sUnknown_80DC4D8 = { +static const WindowTemplate sUnknown_80DC4D8 = { 0, 6, 2, 2, diff --git a/src/data/wigglytuff_shop3.h b/src/data/wigglytuff_shop3.h index 664450bdd..c530f9abb 100644 --- a/src/data/wigglytuff_shop3.h +++ b/src/data/wigglytuff_shop3.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DC534 = { +static const WindowTemplate sUnknown_80DC534 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DC534 = { NULL }; -static const Window sUnknown_80DC54C = { +static const WindowTemplate sUnknown_80DC54C = { 0, 3, 21, 4, @@ -16,7 +16,7 @@ static const Window sUnknown_80DC54C = { NULL }; -static const Window sUnknown_80DC564 = { +static const WindowTemplate sUnknown_80DC564 = { 0, 3, 21, 14, diff --git a/src/data/wonder_mail_1.h b/src/data/wonder_mail_1.h index dc01b51b1..a1a5004f4 100644 --- a/src/data/wonder_mail_1.h +++ b/src/data/wonder_mail_1.h @@ -40,7 +40,7 @@ const MenuItem gUnknown_80DDAA0[] = { {NULL, 10}, }; -const Window gUnknown_80DDACC = +const WindowTemplate gUnknown_80DDACC = { 0, 0x03, @@ -50,7 +50,7 @@ const Window gUnknown_80DDACC = NULL }; -const Window gUnknown_80DDAE4 = +const WindowTemplate gUnknown_80DDAE4 = { 0, 0x03, diff --git a/src/data/wonder_mail_802C10C.h b/src/data/wonder_mail_802C10C.h index 29c1dd42d..8f3e6db46 100644 --- a/src/data/wonder_mail_802C10C.h +++ b/src/data/wonder_mail_802C10C.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFC9C = { +static const WindowTemplate sUnknown_80DFC9C = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DFC9C = { NULL }; -static const Window sUnknown_80DFCB4 = { +static const WindowTemplate sUnknown_80DFCB4 = { 0, 6, 2, 2, diff --git a/src/data/wonder_mail_802C4C8.h b/src/data/wonder_mail_802C4C8.h index ab724e7c8..a18bb1199 100644 --- a/src/data/wonder_mail_802C4C8.h +++ b/src/data/wonder_mail_802C4C8.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFCE4 = { +static const WindowTemplate sUnknown_80DFCE4 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DFCE4 = { NULL }; -static const Window sUnknown_80DFCFC = { +static const WindowTemplate sUnknown_80DFCFC = { 0, 6, 2, 2, diff --git a/src/data/wonder_mail_802C860.h b/src/data/wonder_mail_802C860.h index fbc98490e..41ac16dc9 100644 --- a/src/data/wonder_mail_802C860.h +++ b/src/data/wonder_mail_802C860.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFD28 = { +static const WindowTemplate sUnknown_80DFD28 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DFD28 = { NULL }; -static const Window sUnknown_80DFD40 = { +static const WindowTemplate sUnknown_80DFD40 = { 0, 4, 21, 6, @@ -16,7 +16,7 @@ static const Window sUnknown_80DFD40 = { NULL }; -static const Window sUnknown_80DFD58 = { +static const WindowTemplate sUnknown_80DFD58 = { 0, 4, 21, 15, diff --git a/src/data/wonder_mail_802CDD4.h b/src/data/wonder_mail_802CDD4.h index ee7620403..2d672cc57 100644 --- a/src/data/wonder_mail_802CDD4.h +++ b/src/data/wonder_mail_802CDD4.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFD8C = { +static const WindowTemplate sUnknown_80DFD8C = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DFD8C = { NULL }; -static const Window sUnknown_80DFDA4 = { +static const WindowTemplate sUnknown_80DFDA4 = { 0, 6, 2, 2, diff --git a/src/data/wonder_mail_802D098.h b/src/data/wonder_mail_802D098.h index b0c43817a..8da5defd3 100644 --- a/src/data/wonder_mail_802D098.h +++ b/src/data/wonder_mail_802D098.h @@ -1,4 +1,4 @@ -static const Window sUnknown_80DFDD4 = { +static const WindowTemplate sUnknown_80DFDD4 = { 0, 3, 0, 0, @@ -7,7 +7,7 @@ static const Window sUnknown_80DFDD4 = { NULL }; -UNUSED static const Window sUnknown_80DFDEC = { +UNUSED static const WindowTemplate sUnknown_80DFDEC = { 0, 3, 3, 3, @@ -16,7 +16,7 @@ UNUSED static const Window sUnknown_80DFDEC = { NULL }; -static const Window sUnknown_80DFE04 = { +static const WindowTemplate sUnknown_80DFE04 = { 0, 3, 21, 6, @@ -25,7 +25,7 @@ static const Window sUnknown_80DFE04 = { NULL }; -static const Window sUnknown_80DFE1C = { +static const WindowTemplate sUnknown_80DFE1C = { 0, 3, 21, 15, @@ -34,7 +34,7 @@ static const Window sUnknown_80DFE1C = { NULL }; -UNUSED static const Window sUnknown_80DFE34 = { +UNUSED static const WindowTemplate sUnknown_80DFE34 = { 0, 3, 21, 15, diff --git a/src/dungeon_action.c b/src/dungeon_action.c index 840fa7caf..54655c2fa 100644 --- a/src/dungeon_action.c +++ b/src/dungeon_action.c @@ -8,6 +8,7 @@ #include "structs/str_dungeon.h" #include "dungeon_leader.h" #include "dungeon_movement.h" +#include "dungeon_generation.h" #include "dungeon_util.h" #include "dungeon_pokemon_attributes.h" #include "pokemon.h" @@ -194,37 +195,28 @@ bool8 sub_8044B84(void) } } -u8 *sub_8044BA8(u16 param_1, u8 id) +u8 *sub_8044BA8(u16 actionId, u8 id) { - u32 uVar3; - u32 uVar4; - - if ((param_1 == 0x26) && (GetFloorType() == 2)) { - return *gUnknown_80F91EC; - } - else { - uVar3 = uVar4 = strcmp(gUnknown_80F7C50[param_1 << 1], gUnknown_80F697C); - if (uVar3 != 0) { - uVar4 = 1; + if (actionId == ACTION_STAIRS && GetFloorType() == FLOOR_TYPE_RESCUE) { + return *gUnknown_80F91EC; } - if ((u8)(uVar4) == 0) { - return gActions[GetItemActionType(id)].useText; + else { + if (!AreStringsDifferent(gUnknown_80F7C50[actionId << 1], gUnknown_80F697C)) { + return gActions[GetItemActionType(id)].useText; + } + else { + return gUnknown_80F7C50[actionId << 1]; + } } - else - { - return gUnknown_80F7C50[param_1 << 1]; - } - } } -void sub_8044C10(u8 param_1) +void SetLeaderActionToNothing(bool8 clearActionFields) { EntityInfo * entityInfo = GetLeaderInfo(); entityInfo->action.action = ACTION_NOTHING; - if(param_1) - { + if (clearActionFields) { entityInfo->action.actionParameters[0].actionUseIndex = 0; entityInfo->action.actionParameters[1].actionUseIndex = 0; entityInfo->action.itemTargetPosition.x = -1; diff --git a/src/dungeon_ai_leader.c b/src/dungeon_ai_leader.c index ab9b35d93..9dd5ea6b2 100644 --- a/src/dungeon_ai_leader.c +++ b/src/dungeon_ai_leader.c @@ -169,7 +169,7 @@ bool8 sub_8072CF4(Entity *entity) sub_8052740(10); } sub_806A1E8(entity); - sub_803E46C(10); + DungeonRunFrameActions(10); } if (((ACTION_PASS_TURN < info->action.action) && (info->action.action != 4)) && (info->action.action != ACTION_WALK)) { info->attacking = TRUE; diff --git a/src/dungeon_cutscenes.c b/src/dungeon_cutscenes.c index 45cb831d1..6b41e2580 100644 --- a/src/dungeon_cutscenes.c +++ b/src/dungeon_cutscenes.c @@ -806,7 +806,7 @@ void sub_8087144(void) GetEntInfo(iVar4)->unk15F = 1; while( TRUE ) { if (!sub_8085B80(auStack_4c)) break; - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } GetEntInfo(iVar2)->unk15F = 0; GetEntInfo(iVar3)->unk15F = 0; @@ -909,7 +909,7 @@ void ZapdosPreFightDialogue(void) sub_8085B4C(&auStack_78,puStack_34,pEStack_34,1); GetEntInfo(partnerEntity)->unk15F = 1; while(sub_8085B80(&auStack_78)) { - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } GetEntInfo(partnerEntity)->unk15F = 0; @@ -927,7 +927,7 @@ void ZapdosPreFightDialogue(void) pEStack_2c[0] = partnerEntity; sub_8085B4C(&auStack_48,puStack_4c,pEStack_2c,1); while (sub_8085B80(&auStack_48)) { - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_80869E4(partnerEntity,2,1,DIRECTION_NORTHEAST); @@ -1012,7 +1012,7 @@ void ZapdosDropInEffect(Entity *zapdosEntity) for(iVar1 = 200; iVar1 >= 0; iVar1 -= 5) { GetEntInfo(zapdosEntity)->unk174 = IntToF248_2(iVar1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(0x1e,0x46); } @@ -1026,20 +1026,20 @@ void ZapdosScreenFlash(s32 numFlashes) for(index = 250; index > 199; index -= 10) { SetDungeonBGColorRGB(index,index,index / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } if (1 < numFlashes) { for(index = 250; index > 199; index -= 10) { SetDungeonBGColorRGB(index,index,index / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } for(index = 250; index >= 0; index -= 10) { SetDungeonBGColorRGB(index,index,index / 4,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_8085EB0(); } @@ -1261,7 +1261,7 @@ void MoltresDropInEffect(Entity * moltresEntity) for(iVar1 = 200; iVar1 >= 0; iVar1 -= 5) { GetEntInfo(moltresEntity)->unk174 = IntToF248_2(iVar1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } @@ -1296,13 +1296,13 @@ void MoltresScreenFlash2(s32 xArg, s32 yArg) for (i = 250; i >= 20; i -= 10) { SetDungeonBGColorRGB(i, 0, 0, 1, 1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(0xA, 0x46); for (i = 250; i >= 0; i -= 10) { SetDungeonBGColorRGB(i, 0, 0, 1, 1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(0xA, 0x46); @@ -1319,14 +1319,14 @@ void MoltresScreenFlash3(void) for(iVar1 = 250; iVar1 > 9; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1 / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(0x1e,0x46); PlaySoundEffect(0x1ed); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1 / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(0x1e,0x46); sub_8085EB0(); @@ -1339,7 +1339,7 @@ void MoltresScreenDarken(void) for(iVar1 = 0; iVar1 >= -80; iVar1 -= 8) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,0,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } @@ -1555,7 +1555,7 @@ void sub_8088484(Entity *param_1) { GetEntInfo(param_1)->unk174 = IntToF248_2(iVar1); SetDungeonBGColorRGB(iVar1,iVar1,iVar1 / 2,1,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } @@ -1567,19 +1567,19 @@ void ArticunoScreenFlash(void) for(iVar1 = 250; iVar1 > 0x95; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1 / 2,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(4,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(0,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(4,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1 / 2,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(4,0x46); sub_8085EB0(); @@ -1592,7 +1592,7 @@ void sub_8088574(void) for(iVar1 = 0; iVar1 <= 80; iVar1 += 8) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,0,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } } @@ -1884,7 +1884,7 @@ void SceneGroudonMovement(Entity * groudonEntity) if ((iVar1 - 10U < 0xc) || (iVar1 > 0x1f)) { IncreaseEntityPixelPos(groudonEntity,0,0x100); } - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_80856C8(groudonEntity,groudonEntity->pos.x,groudonEntity->pos.y + 1); sub_80861D4(groudonEntity,0xf,DIRECTION_SOUTH); @@ -1901,21 +1901,21 @@ void GroudonScreenFlash(void) for(iVar1 = 250; iVar1 > 0x95; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1 / 2,iVar1 / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1 / 2,0,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1 / 2,iVar1 / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -1928,21 +1928,21 @@ void GroudonScreenFlash2(void) for(iVar1 = 250; iVar1 > 0x95; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1 / 2,iVar1 / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1 / 2,0,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1 / 2,iVar1 / 2,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -2160,7 +2160,7 @@ void sub_80891F0(void) for(iVar1 = 0; iVar1 < 0x30; iVar1++) { sub_80855E4(sub_808919C); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_80855E4(sub_80891D0); } @@ -2215,7 +2215,7 @@ void sub_8089294(void) for(iVar1 = 0; iVar1 <= 0x77; iVar1++) { sub_80855E4(sub_8089224); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_80855E4(sub_80891D0); } @@ -2377,7 +2377,7 @@ void RayquazaDropInEffect(Entity *rayquazaEntity) } if (F248LessThanInt(iVar2, 0)) break; GetEntInfo(rayquazaEntity)->unk174 = iVar2; - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } GetEntInfo(rayquazaEntity)->unk174 = IntToF248_2(0); } @@ -2390,19 +2390,19 @@ void RayquazaScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1 / 2, iVar1, iVar1 / 2, 1, 1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1 / 2, iVar1, 0, 1, 1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1 / 2, iVar1, iVar1 / 2, 1, 1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); sub_8085EB0(); @@ -2650,7 +2650,7 @@ void MewtwoDropInEffect(Entity *mewtwoEntity) } if (F248LessThanInt(iVar2, 0)) break; GetEntInfo(mewtwoEntity)->unk174 = iVar2; - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } GetEntInfo(mewtwoEntity)->unk174 = IntToF248_2(0); } @@ -2663,19 +2663,19 @@ void MewtwoScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,0,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -2792,19 +2792,19 @@ void EnteiScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1, iVar1 / 2, iVar1 / 2, 1, 1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1, 0, 0, 1, 1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1, iVar1 / 2, iVar1 / 2, 1, 1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); sub_8085EB0(); @@ -2947,19 +2947,19 @@ void RaikouScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); sub_8085EB0(); @@ -3109,7 +3109,7 @@ void sub_808A528(Entity * param_1) } if (F248LessThanInt(iVar2, 0)) break; GetEntInfo(param_1)->unk174 = iVar2; - sub_803E46C(70); + DungeonRunFrameActions(70); } GetEntInfo(param_1)->unk174 = IntToF248_2(0); } @@ -3122,19 +3122,19 @@ void SuicuneScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); sub_8085EB0(); @@ -3287,7 +3287,7 @@ void HoOhDropInEffect(Entity * param_1) } if (F248LessThanInt(iVar2, 0)) break; GetEntInfo(param_1)->unk174 = iVar2; - sub_803E46C(70); + DungeonRunFrameActions(70); } GetEntInfo(param_1)->unk174 = IntToF248_2(0); } @@ -3300,19 +3300,19 @@ void HoOhScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); sub_8085EB0(); @@ -3442,13 +3442,13 @@ void LatiosScreenFlash(void) for(iVar1 = 250; iVar1 > 149; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(70); + DungeonRunFrameActions(70); } sub_803E708(10,70); sub_8085EB0(); @@ -4073,21 +4073,21 @@ void JirachiWishGrantFlash(void) for(iVar1 = 0xFA; iVar1 > 0x95; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 0xFA; iVar1 > 0xC7; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 0xFA; iVar1 >= 0; iVar1 -= 10) { SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -4130,7 +4130,7 @@ void JirachiDropInEffect(Entity *jirachiEntity) } if (F248LessThanInt(iVar1, 0)) break; GetEntInfo(jirachiEntity)->unk174 = iVar1; - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } GetEntInfo(jirachiEntity)->unk174 = IntToF248_2(0); } @@ -4312,17 +4312,17 @@ void LugiaScreenFlash(void) PlaySoundEffect(0x1f6); for(iVar1 = 250; iVar1 > 149; iVar1 -= 10){ SetDungeonBGColorRGB(0,0,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10){ SetDungeonBGColorRGB(0,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10){ SetDungeonBGColorRGB(0,0,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -4336,24 +4336,24 @@ void LugiaScreenFlash2(void) for(iVar1 = 0; iVar1 < 200; iVar1 += 100){ SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } for(iVar1 = 200; iVar1 >= 0; iVar1 -= 100){ SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(4,0x46); for(iVar1 = 0; iVar1 < 200; iVar1 += 100){ SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } for(iVar1 = 200; iVar1 >= 0; iVar1 -= 100){ SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,0); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); @@ -4365,7 +4365,7 @@ void sub_808C0CC(void) gDungeonBrightness = 0x1f; SetDungeonBGColorRGB(0,0,0,1,1); BgColorCallNullsub4(); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); gDungeon->unk7 = 0; LugiaScreenFlash(); } @@ -4465,17 +4465,17 @@ void KyogreScreenFlash(void) PlaySoundEffect(0x1f8); for(iVar1 = 250; iVar1 > 149; iVar1 -= 10){ SetDungeonBGColorRGB(0,0,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10){ SetDungeonBGColorRGB(0,iVar1,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10){ SetDungeonBGColorRGB(0,0,iVar1,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -4486,7 +4486,7 @@ void sub_808C360(void) gDungeonBrightness = 0x1f; SetDungeonBGColorRGB(0,0,0,1,1); BgColorCallNullsub4(); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); gDungeon->unk7 = 0; KyogreScreenFlash(); } @@ -4552,17 +4552,17 @@ void DeoxysScreenFlash(void) PlaySoundEffect(0x2c1); for(iVar1 = 250; iVar1 > 149; iVar1 -= 10){ SetDungeonBGColorRGB(iVar1,0,0,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 > 199; iVar1 -= 10){ SetDungeonBGColorRGB(iVar1,iVar1,0,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); for(iVar1 = 250; iVar1 >= 0; iVar1 -= 10){ SetDungeonBGColorRGB(iVar1,0,0,1,1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_803E708(10,0x46); sub_8085EB0(); @@ -4573,7 +4573,7 @@ void sub_808C550(void) gDungeonBrightness = 0x1f; SetDungeonBGColorRGB(0,0,0,1,1); BgColorCallNullsub4(); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); gDungeon->unk7 = 0; DeoxysScreenFlash(); } @@ -4678,7 +4678,7 @@ void CelebiJoinDialogue(void) DungeonStopBGM(); PlaySoundEffect(0xcc); while (IsFanfareSEPlaying_2(0xcc) != 0) { - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } DungeonStartNewBGM(MUS_FRIEND_AREA_HEALING_FOREST); PlaySoundEffect(0x1c7); @@ -4751,11 +4751,11 @@ void sub_808C8E0(Entity *entity) sub_806CDD4(entity, 0, DIRECTION_SOUTH); for(iVar1 = 0; iVar1 < 16; iVar1++){ GetEntInfo(entity)->unk174 = IntToF248_2(iVar1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } for(iVar1 = 16; iVar1 < 200; iVar1 += 4){ GetEntInfo(entity)->unk174 = IntToF248_2(iVar1); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_8086A3C(entity); } @@ -4858,7 +4858,7 @@ void MedichamRescueDialogue(void) for(counter = 0x17; counter >= 0; counter--) { IncreaseEntityPixelPos(medichamEntity, 0, 0x100); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_806CE68(medichamEntity, DIRECTION_SOUTH); sub_803E708(0x20, 0x46); @@ -4947,7 +4947,7 @@ void SmeargleRescueDialogue(void) for(counter = 0x17; counter >= 0; counter--) { IncreaseEntityPixelPos(smeargleEntity, 0, 0x100); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } sub_806CE68(smeargleEntity, DIRECTION_SOUTH); sub_803E708(0x20, 0x46); diff --git a/src/dungeon_engine.c b/src/dungeon_engine.c index 686853216..8ab386c0f 100644 --- a/src/dungeon_engine.c +++ b/src/dungeon_engine.c @@ -125,7 +125,7 @@ static bool8 xxx_dungeon_80442D0(bool8 param_1) if ((UseAttack(0) == 0) && ((gDungeon->unk644.unk28 != 0 || (gDungeon->unk644.unk2F != 0)))) { - sub_803E46C(0xc); + DungeonRunFrameActions(0xc); } GetEntInfo(entity)->speedStageChanged = FALSE; if (sub_8044B28()) return FALSE; diff --git a/src/dungeon_main.c b/src/dungeon_main.c new file mode 100644 index 000000000..10afb73a9 --- /dev/null +++ b/src/dungeon_main.c @@ -0,0 +1,1659 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_main.h" +#include "structs/str_dungeon.h" +#include "number_util.h" +#include "input.h" +#include "structs/map.h" +#include "dungeon_message.h" +#include "dungeon_action.h" +#include "dungeon_ai_targeting.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_random.h" +#include "dungeon_util.h" +#include "dungeon_map.h" +#include "pokemon.h" +#include "moves.h" +#include "items.h" +#include "dungeon_music.h" +#include "dungeon_ai_movement.h" +#include "code_8045A00.h" +#include "string_format.h" +#include "code_803E46C.h" +#include "code_801602C.h" +#include "code_800D090.h" +#include "trap.h" +#include "charge_move.h" +#include "dungeon_map_access.h" +#include "status_checks_1.h" +#include "game_options.h" +#include "weather.h" +#include "dungeon_items.h" +#include "dungeon_leader.h" +#include "tile_types.h" +#include "dungeon_visibility.h" +#include "dungeon_movement.h" +#include "bg_control.h" +#include "menu_input.h" +#include "music.h" +#include "items.h" +#include "play_time.h" +#include "pokemon_3.h" +#include "text.h" +#include "code_806CD90.h" +#include "code_8044CC8.h" +#include "code_801B3C0.h" +#include "dungeon_capabilities.h" +#include "dungeon_menu_items.h" +#include "dungeon_menu_team.h" +#include "dungeon_menu_moves.h" +#include "dungeon_menu_tile.h" +#include "dungeon_menu_stairs.h" +#include "dungeon_menu_others.h" +#include "constants/dungeon.h" +#include "constants/status.h" +#include "constants/tactic.h" +#include "constants/iq_skill.h" +#include "constants/dungeon_action.h" +#include "structs/struct_sub80095e4.h" +#include "structs/str_text.h" + +extern void HandleSetItemAction(Entity *,bool8); +extern void HandleUnsetItemAction(Entity *,bool8); +extern bool8 sub_8048A68(Entity *param_1,Item *item); +extern bool8 sub_8048950(Entity *param_1,Item *item); +extern bool8 sub_8048B9C(Entity *param_1,Item *item); +extern Item *sub_8044D90(Entity *, s32, u32); +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void sub_806A6E8(Entity *); +extern bool8 sub_8047084(s32 itemFlag); +extern void HandleTrap(Entity *pokemon, DungeonPos *pos, int param_3, char param_4); +extern void sub_8045DB4(DungeonPos *, u32); +bool8 sub_807EF48(void); +void sub_806A2BC(Entity *a0, u8 a1); +bool8 sub_80701A4(Entity *a0); +void sub_803E708(s32 a0, s32 a1); +void sub_8075680(u32); +void sub_8094C88(void); +void sub_8047158(void); +void sub_806A914(u8 a0, u8 a1, u8 a2); +void SetLeaderActionToNothing(u8 a0); +u16 GetLeaderActionId(void); +void sub_80978C8(s16 a0); +static void TryCreateModeArrows(Entity *leader); +bool8 sub_8094C48(void); +void sub_803E724(s32 a0); +void HandleTalkFieldAction(Entity *); +bool8 sub_8044B28(void); +bool8 IsNotAttacking(Entity *param_1, bool8 param_2); +s32 GetTeamMemberEntityIndex(Entity *pokemon); +bool8 sub_8070F80(Entity * pokemon, s32 direction); +void sub_806752C(ActionContainer *a0); +void sub_8067768(ActionContainer *a0); +void ChangeDungeonCameraPos(DungeonPos *pos, s32 a1, u8 a2, u8 a3); +extern bool8 sub_8071A8C(Entity *pokemon); +extern void GetWeatherName(u8 *dst, u8 weatherId); +extern bool8 sub_8070F14(Entity * pokemon, s32 direction); +extern Entity *sub_80696A8(Entity *a0); +extern u8 sub_806A538(s32); +extern void sub_803EAF0(u32, u8 *); +extern void sub_803F508(Entity *); +extern void sub_8041AD0(Entity *pokemon); +extern void sub_8041AE0(Entity *pokemon); +extern void sub_807EC28(bool8); +extern void PlayDungeonCursorSE(u8 param_1); +extern const u8 *GetCurrentDungeonName(void); + +extern Entity *gLeaderPointer; + +extern const u8 *gUnknown_80F8A84; +extern const u8 *gUnknown_80F8A6C; +extern const u8 *gUnknown_80F8ADC; +extern const u8 *gUnknown_80F8AB0; +extern const u8 *gUnknown_80F8B0C; +extern const u8 *gUnknown_80FD4B0; +extern const u8 *gUnknown_80F8A4C; +extern const u8 *gUnknown_80F8A28; +extern const u8 *gUnknown_8100208; +extern const u8 *gUnknown_80F9BD8; +extern const u8 *gUnknown_80F9C08; +extern const u8 *gUnknown_80F9C2C; +extern const u8 *gUnknown_80F9BB0; +extern const u8 *gUnknown_80FDE18; +extern const u8 *gUnknown_80F8B24; +extern const u8 *gTeamToolboxAPtr; +extern const u8 *gTeamToolboxBPtr; +extern const u8 *gFieldItemMenuGroundTextPtr; +extern const u8 *gUnknown_80FE940; +extern const u8 *gWhichTextPtr1; +extern const u8 *const gFieldMenuMovesPtr; +extern const u8 *const gFieldMenuItemsPtr; +extern const u8 *const gFieldMenuTeamPtr; +extern const u8 *const gFieldMenuOthersPtr; +extern const u8 *const gFieldMenuGroundPtr; +extern const u8 *const gUnknown_80F9174; +extern const u8 *const gUnknown_80F9190; +extern const u8 *const gUnknown_80F91C8; +extern const u8 *const gUnknown_80F91E0; +extern const u8 *const gUnknown_80F91A8; +extern const u8 *const gUnknown_80FE954; + +extern MenuInputStruct gDungeonMenu; +extern s32 gTeamMenuChosenId; + +static EWRAM_DATA bool8 sInDiagonalMode = 0; +static EWRAM_DATA bool8 sInRotateMode = 0; +// Frames counter for arrows in diagonal/rotate mode. +static EWRAM_DATA s16 sArrowsFrames = 0; +// If both of these are set to TRUE, there are 3 arrows visible instead of 1 in rotate mode +static EWRAM_DATA bool8 sShowThreeArrows1 = 0; +static EWRAM_DATA bool8 sShowThreeArrows2 = 0; + +static void sub_805E738(Entity *a0); +static bool8 sub_805E874(void); +static bool8 sub_805EC2C(Entity *a0, s32 x, s32 y); +static bool8 sub_805EC4C(Entity *a0, u8 a1); +static bool8 sub_805EF60(Entity *a0, EntityInfo *a1); +static void ShowMainMenu(bool8 fromBPress, bool8 a1); +static void PrintOnMainMenu(bool8 printAll); + +void DungeonHandlePlayerInput(void) +{ + struct UnkMenuBitsStruct r6; + bool8 triggers[5]; // Always FALSE, if one of these is TRUE - they can open various menus or cause an item throw. Used in Blue's touch screen. + s32 frames; + s32 var_38; + UnkDungeonGlobal_unk181E8_sub *unkPtr; + + unkPtr = &gDungeon->unk181e8; + var_38 = 3; + gDungeon->unk12 = 0; + sub_806A2BC(GetLeader(), 1); + if (sub_80701A4(GetLeader())) { + sub_803E708(60, 16); + return; + } + + gDungeon->unk644.unk2F = 0; + ResetMapPlayerDotFrames(); + if (gDungeon->unk1 != 0) { + gDungeon->unk1 = 0; + if (!ShouldMonsterRunAwayAndShowEffect(GetLeader(), TRUE)) { + SetLeaderActionToNothing(TRUE); + sub_805E804(); + ShowDungeonStairsMenu(GetLeader()); + ResetRepeatTimers(); + ResetUnusedInputStruct(); + if (GetLeaderActionId() != 0) { + return; + } + } + } + + sub_806A914(1, 1, 1); + while (1) { + Entity *leader = GetLeader(); + EntityInfo *leaderInfo = GetEntInfo(leader); + + sub_80978C8(leaderInfo->id); + if (gDungeon->unk644.unk28 != 0) { + if (sub_805E874()) { + leaderInfo->action.action = 2; + leaderInfo->action.actionParameters[0].actionUseIndex = 0; + break; + } + sub_805E804(); + } + sInRotateMode = FALSE; + sInDiagonalMode = FALSE; + if (gDungeon->unk5C0 >= 0) { + r6.a0_8 = 1; + r6.a0_16 = 0; + r6.a0_24 = 0; + } + else { + r6.a0_8 = 0; + r6.a0_16 = 0; + r6.a0_24 = 0; + } + + frames = 0; + sub_8044C50(ACTION_NOTHING); + sShowThreeArrows1 = FALSE; + sShowThreeArrows2 = FALSE; + + while (r6.a0_8 == 0) { + u32 dpadDiagonal, dpadSimple; + bool32 highlightTiles, tryItemThrow; + bool32 bPress, rPress, unkBool; // Always FALSE, might've been used in Blue. + s32 directionNew; + + sArrowsFrames++; + if (unkPtr->unk1821A != 0) { + frames = 0; + } + else { + frames++; + } + + if (var_38 != 0 && --var_38 == 0) { + sub_8075680(0); + } + + TryCreateModeArrows(leader); + unkBool = FALSE; + { + s32 i; + for (i = 0; i < 5; i++) { + triggers[i] = FALSE; + } + } + + if (gRealInputs.held & A_BUTTON && gRealInputs.held & B_BUTTON && FixedPointToInt(leaderInfo->belly) != 0) { + sub_8044C50(ACTION_PASS_TURN); + gDungeon->unk644.unk2F = 1; + break; + } + + bPress = FALSE; + rPress = FALSE; + + if (gRealInputs.pressed & A_BUTTON) { + if (gRealInputs.held & B_BUTTON) { + if (FixedPointToInt(leaderInfo->belly) != 0) { + sub_8044C50(ACTION_PASS_TURN); + gDungeon->unk644.unk2F = 1; + break; + } + } + else if (ShouldMonsterRunAwayAndShowEffect(leader, TRUE)) { + LogMessageByIdWithPopupCheckUser(leader, gUnknown_80FD4B0); + sub_8044C50(ACTION_PASS_TURN); + gDungeon->unk644.unk2F = 1; + break; + } + else if (gRealInputs.held & L_BUTTON) { + bool32 canUseMove; + s32 i, j; + + for (i = 0; i < MAX_MON_MOVES; i++) { + if (MoveFlagExists(&leaderInfo->moves.moves[i]) && MoveFlagSet(&leaderInfo->moves.moves[i])) { + break; + } + } + if (i == MAX_MON_MOVES) { + LogMessageByIdWithPopupCheckUser(leader, gUnknown_80F8A28); + break; + } + + for (j = 0; j < MAX_MON_MOVES; j++) { + if (MoveFlagExists(&leaderInfo->moves.moves[j])) { + if (leaderInfo->moves.moves[j].PP != 0) + break; + } + } + if (j == MAX_MON_MOVES) { + SetMonsterActionFields(&leaderInfo->action, ACTION_STRUGGLE); + break; + } + + canUseMove = FALSE; + for (j = i; j < MAX_MON_MOVES; j++) { + if (j != i && !(leaderInfo->moves.moves[j].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) { + break; + } + if (leaderInfo->moves.moves[j].PP != 0) { + canUseMove = TRUE; + break; + } + } + if (!canUseMove) { + LogMessageByIdWithPopupCheckUser(leader, gUnknown_80F8A4C); + } + else { + SetMonsterActionFields(&leaderInfo->action, ACTION_USE_MOVE_PLAYER); + leaderInfo->action.actionParameters[0].actionUseIndex = GetTeamMemberEntityIndex(leader); + leaderInfo->action.actionParameters[1].actionUseIndex = i; + } + break; + } + else { + if (!sub_805EF60(leader, leaderInfo)) { + SetMonsterActionFields(&leaderInfo->action, ACTION_REGULAR_ATTACK); + } + break; + } + } + + if (gRealInputs.shortPress & B_BUTTON) { + r6.a0_8 = 1; + r6.a0_16 = 0; + r6.a0_24 = 0; + break; + } + else if (triggers[1]) { // Opens moves menu + gDungeon->unk5C0 = 0; + r6.a0_8 = 1; + r6.a0_16 = 0; + r6.a0_24 = 1; + break; + } + else if (triggers[2]) { // Opens item menu + gDungeon->unk5C0 = 1; + r6.a0_8 = 1; + r6.a0_16 = 0; + r6.a0_24 = 1; + break; + } + else if (triggers[3]) { // Opens pokemon menu + gDungeon->unk5C0 = 2; + r6.a0_8 = 1; + r6.a0_16 = 0; + r6.a0_24 = 1; + break; + } + else if (triggers[4]) { // Opens regular menu + r6.a0_8 = 1; + r6.a0_16 = 0; + r6.a0_24 = 1; + break; + } + else if (frames > 0x707) { // Opens simple menu when idling + r6.a0_8 = 1; + r6.a0_16 = 1; + r6.a0_24 = 0; + break; + } + + if (gGameOptionsRef->unk9 == 0 + && (gRealInputs.pressed & B_BUTTON || (!unkBool && bPress)) + && unkPtr->unk1821A != 0) + { + sub_804AA60(); + sInRotateMode = FALSE; + ResetRepeatTimers(); + ResetUnusedInputStruct(); + } + + if (gRealInputs.held & L_BUTTON) { + if (gRealInputs.pressed & B_BUTTON) { + DisplayMessageLog(); + ResetRepeatTimers(); + ResetUnusedInputStruct(); + } + } + + tryItemThrow = FALSE; + if (gRealInputs.held & R_BUTTON) { + if (!sInDiagonalMode) { + sArrowsFrames = 0; + } + sInDiagonalMode = TRUE; + } + else { + sInDiagonalMode = FALSE; + } + + highlightTiles = FALSE; + if (gGameOptionsRef->unk9 == 0) { + if (gRealInputs.shortPress & R_BUTTON || rPress || gRealInputs.pressed & START_BUTTON) { + highlightTiles = TRUE; + } + } + if (highlightTiles) { + sub_805E738(leader); + sInRotateMode = TRUE; + unkPtr->rotateModeDirection = leaderInfo->action.direction; + unkPtr->prevRotateModeDirection = 0xFF; + ResetRepeatTimers(); + } + + if ((gRealInputs.held & L_BUTTON) == L_BUTTON && (gRealInputs.pressed & R_BUTTON) == R_BUTTON) { + tryItemThrow = TRUE; + } + if (triggers[0]) { + tryItemThrow = TRUE; + } + if (tryItemThrow) { + s32 i; + for (i = 0; i < INVENTORY_SIZE; i++) { + if (ItemExists(&gTeamInventoryRef->teamItems[i]) && ItemSet(&gTeamInventoryRef->teamItems[i])) { + sub_8044C50(ACTION_THROW_ITEM_PLAYER); + leaderInfo->action.actionParameters[0].actionUseIndex = i +1; + leaderInfo->action.actionParameters[0].itemPos.x = 0; + leaderInfo->action.actionParameters[0].itemPos.y = 0; + break; + } + } + if (leaderInfo->action.action != 0) { + break; + } + } + + // SELECT button + if (!gDungeon->unk181e8.blinded && gGameOptionsRef->mapOption != 6 && gRealInputs.pressed & SELECT_BUTTON) { + s32 prevMapOption = gGameOptionsRef->mapOption; + gShowMonsterDotsInDungeonMap = TRUE; + gDungeon->unk181e8.inFloorMapMode = TRUE; + if (!sub_8094C48()) { + sub_8094C88(); + } + sub_8052210(1); + ShowWholeRevealedDungeonMap(); + SetBGOBJEnableFlags(0x1E); + sub_803E708(0xA, 0x2F); + while (1) { + DungeonRunFrameActions(0x2F); + if (gRealInputs.pressed & SELECT_BUTTON) + break; + if (gRealInputs.pressed & B_BUTTON) + break; + + if (gRealInputs.pressed & A_BUTTON) { + gShowMonsterDotsInDungeonMap = (gShowMonsterDotsInDungeonMap == FALSE) ? TRUE : FALSE; // Flip + ShowWholeRevealedDungeonMap(); + } + } + gDungeon->unk181e8.inFloorMapMode = FALSE; + gGameOptionsRef->mapOption = prevMapOption; + gShowMonsterDotsInDungeonMap = TRUE; + ShowWholeRevealedDungeonMap(); + SetBGOBJEnableFlags(0); + DungeonRunFrameActions(0x2F); + DungeonRunFrameActions(0x2F); + } + + if (gDungeon->unk644.unk29 != 0 && !sInDiagonalMode) { + dpadDiagonal = dpadSimple = gRealInputs.pressed; + } + else { + dpadDiagonal = gRealInputs.held; + dpadSimple = (unkPtr->unk1821A == 0) ? gRealInputs.held : gRealInputs.pressed; + } + + dpadDiagonal &= DPAD_ANY; + dpadSimple &= DPAD_ANY; + directionNew = -1; + if (dpadDiagonal == (DPAD_UP | DPAD_RIGHT)) + directionNew = DIRECTION_NORTHEAST; + if (dpadDiagonal == (DPAD_UP | DPAD_LEFT)) + directionNew = DIRECTION_NORTHWEST; + if (dpadDiagonal == (DPAD_DOWN | DPAD_RIGHT)) + directionNew = DIRECTION_SOUTHEAST; + if (dpadDiagonal == (DPAD_DOWN | DPAD_LEFT)) + directionNew = DIRECTION_SOUTHWEST; + + if (dpadSimple == DPAD_UP) + directionNew = DIRECTION_NORTH; + if (dpadSimple == DPAD_DOWN) + directionNew = DIRECTION_SOUTH; + if (dpadSimple == DPAD_RIGHT) + directionNew = DIRECTION_EAST; + if (dpadSimple == DPAD_LEFT) + directionNew = DIRECTION_WEST; + + if (directionNew >= 0 && (!sInDiagonalMode || (directionNew & 1))) { + bool32 directionChanged = (leaderInfo->action.direction != directionNew); + leaderInfo->action.direction = directionNew & DIRECTION_MASK; + if (sInRotateMode) { + unkPtr->rotateModeDirection = directionNew; + sub_806CDD4(leader, sub_806CEBC(leader), directionNew); + } + else { + u8 canMoveFlags = 0; + const u8 *immobilizedMsg = NULL; + + if (sub_805EC4C(leader, 1)) + break; + + if (leaderInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) { + immobilizedMsg = gUnknown_80F8A84, canMoveFlags |= 1; + } + else if (leaderInfo->frozenClassStatus.status == STATUS_CONSTRICTION) { + immobilizedMsg = gUnknown_80F8A6C, canMoveFlags |= 1; + } + else if (leaderInfo->frozenClassStatus.status == STATUS_INGRAIN) { + immobilizedMsg = gUnknown_80F8AB0, canMoveFlags |= 1; + } + else if (leaderInfo->frozenClassStatus.status == STATUS_WRAP) { + immobilizedMsg = gUnknown_80F8ADC, canMoveFlags |= 1; + } + else if (leaderInfo->frozenClassStatus.status == STATUS_WRAPPED) { + immobilizedMsg = gUnknown_80F8B0C, canMoveFlags |= 1; + } + + if (!CanMoveInDirection(leader, directionNew)) + canMoveFlags |= 2; + + if (directionChanged) { + sub_806CDD4(leader, sub_806CEBC(leader), directionNew); + } + + if (!(canMoveFlags & 2)) { + if (canMoveFlags & 1) { + if (immobilizedMsg != NULL) { + LogMessageByIdWithPopupCheckUser(leader, immobilizedMsg); + } + sub_8044C50(ACTION_PASS_TURN); + gDungeon->unk644.unk2F = 1; + } + else { + sub_8044C50(ACTION_WALK); + if ((gRealInputs.held & B_BUTTON || bPress) && FixedPointToInt(leaderInfo->belly) != 0) { + if (GetEntInfo(leader)->cringeClassStatus.status != STATUS_CONFUSED) { + gDungeon->unk644.unk28 = 1; + } + leaderInfo->action.actionParameters[0].actionUseIndex = 0; + } + else { + leaderInfo->action.actionParameters[0].actionUseIndex = 1; + } + } + break; + } + else if (canMoveFlags & 1) { + sub_803E724(0x23); + } + + } + } + DungeonRunFrameActions(0xF); + } + + if (unkPtr->unk1821A != 0) { + sub_804AA60(); + } + + if (leaderInfo->action.action == 0x2D || leaderInfo->action.action == 0x13) { + HandleTalkFieldAction(leader); + if (sub_8044B28()) + break; + sub_8044C50(ACTION_NOTHING); + } + else if ((r6.a0_8) == 0) { + gDungeon->unk644.unk29 = 0; + if (leaderInfo->action.action != 0) { + if (!IsNotAttacking(leader, FALSE)) { + DungeonRunFrameActions(0xF); + } + break; + } + DungeonRunFrameActions(0xF); + } + else { + DungeonRunFrameActions(0xF); + sub_8047158(); + ShowMainMenu((r6.a0_16 == 0), r6.a0_24); + ResetRepeatTimers(); + ResetUnusedInputStruct(); + sInRotateMode = FALSE; + unkPtr->unk1821A = 0; + sub_804AA60(); + if (sub_8044B28()) + break; + if (leaderInfo->action.action != 0) { + if (leaderInfo->action.action == 0x2B) { + gDungeon->unk4 = 1; + gDungeon->unk3 = 1; + } + if (leaderInfo->action.action == 0x2E) { + gDungeon->unk4 = 1; + gDungeon->unk3 = 0; + } + break; + } + DungeonRunFrameActions(0xF); + if (gDungeon->unk4 != 0) + break; + } + } +} + +struct DiagonalArrowInfo +{ + s16 x; + s16 y; + bool8 unk4; + bool8 unk5; +}; + +static const struct DiagonalArrowInfo sDiagonalArrowsInfo[] = +{ + {-1, -1, TRUE, FALSE}, + {-1, 1, TRUE, TRUE}, + {1, 1, FALSE, TRUE}, + {1, -1, FALSE, FALSE}, +}; + +struct RotateArrowInfo +{ + s16 x; + s16 y; + u32 tilemapNum; + bool8 unk8; + bool8 unk9; +}; + +static const struct RotateArrowInfo sRotateArrowsInfo[] = +{ + {0, 1, 0x212, FALSE, TRUE}, + {1, 1, 0x213, FALSE, TRUE}, + {1, 0, 0x214, FALSE, FALSE}, + {1, -1, 0x213, FALSE, FALSE}, + {0, -1, 0x212, TRUE, FALSE}, + {-1, -1, 0x213, TRUE, FALSE}, + {-1, 0, 0x214, TRUE, TRUE}, + {-1, 1, 0x213, TRUE, TRUE}, +}; + +// Creates arrow sprites which are used when in rotate or diagonal modes. +static void TryCreateModeArrows(Entity *leader) +{ + UnkDungeonGlobal_unk181E8_sub *unkPtr = &gDungeon->unk181e8; + + if (sInDiagonalMode) { + s32 i; + SpriteOAM sprite; + + for (i = 0; i < 4; i++) { + u32 matrixNum; + s32 x, xMul, x2; + s32 y, yMul, y2; + + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 1); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 0); + + matrixNum = (sDiagonalArrowsInfo[i].unk4) ? 8 : 0; + + if (sDiagonalArrowsInfo[i].unk5) + matrixNum += 16; + + SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); + SpriteSetSize(&sprite, 0); + + SpriteSetTileNum(&sprite, 0x213); + SpriteSetPriority(&sprite, 2); + SpriteSetPalNum(&sprite, 0); + + SpriteSetUnk6_0(&sprite, 0); + SpriteSetUnk6_1(&sprite, 0); + + xMul = sDiagonalArrowsInfo[i].x * 10; + x2 = (sArrowsFrames / 2) & 7; + x = (x2 * sDiagonalArrowsInfo[i].x) + xMul + 116; + SpriteSetX(&sprite, x); + + yMul = sDiagonalArrowsInfo[i].y * 10; + y2 = (sArrowsFrames / 2) & 7; + y = (y2 * sDiagonalArrowsInfo[i].y) + yMul + 82; + SpriteSetY(&sprite, y); + + AddSprite(&sprite, 0x100, NULL, NULL); + } + } + + else if (unkPtr->unk1821A) { + s32 i; + SpriteOAM sprite; + s32 direction = unkPtr->rotateModeDirection; + + if (unkPtr->rotateModeDirection < NUM_DIRECTIONS) { + s32 x, xMul, x2; + s32 y, yMul, y2; + s32 to = (sShowThreeArrows2 != FALSE && sShowThreeArrows1 != FALSE) ? 3 : 1; + + xMul = sRotateArrowsInfo[direction].x * 10; + x2 = (sArrowsFrames / 2) & 7; + x = (sRotateArrowsInfo[direction].x * x2) + xMul + 116; + + yMul = sRotateArrowsInfo[direction].y * 10; + y2 = (sArrowsFrames / 2) & 7; + y = (y2 * sRotateArrowsInfo[direction].y) + yMul + 82; + for (i = 0; i < to; i++) { + u32 matrixNum; + + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 1); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 0); + + matrixNum = (sRotateArrowsInfo[direction].unk8 != 0) ? 8 : 0; + + if (sRotateArrowsInfo[direction].unk9) + matrixNum += 16; + + SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); + SpriteSetSize(&sprite, 0); + + SpriteSetTileNum(&sprite, sRotateArrowsInfo[direction].tilemapNum); + SpriteSetPriority(&sprite, 2); + SpriteSetPalNum(&sprite, 0); + + SpriteSetUnk6_0(&sprite, 0); + SpriteSetUnk6_1(&sprite, 0); + + SpriteSetX(&sprite, x); + SpriteSetY(&sprite, y); + + AddSprite(&sprite, 0x100, NULL, NULL); + x += sRotateArrowsInfo[direction].x * 4; + y += sRotateArrowsInfo[direction].y * 4; + } + } + } + + if (sInRotateMode && unkPtr->prevRotateModeDirection != unkPtr->rotateModeDirection) { + unkPtr->prevRotateModeDirection = unkPtr->rotateModeDirection; + ChangeDungeonCameraPos(&leader->pos, unkPtr->rotateModeDirection, 0, sInRotateMode); + } +} + +static void sub_805E738(Entity *a0) +{ + const Tile *tile; + s32 i, j; + EntityInfo *entityInfo = GetEntInfo(a0); + if (entityInfo->blinkerClassStatus.status != 1 && entityInfo->blinkerClassStatus.status != 2) { + // What??? + for (i = 0; i < 1; i++) { + bool8 r9 = FALSE; + u32 direction = entityInfo->action.direction; + direction++; + for (j = 1; j < 8; j++, direction++) { + direction &= DIRECTION_MASK; + tile = GetTile(a0->pos.x + gAdjacentTileOffsets[direction].x, a0->pos.y + gAdjacentTileOffsets[direction].y); + if (tile->monster != NULL && GetEntityType(tile->monster) == ENTITY_MONSTER) { + EntityInfo *tileMonsterInfo = GetEntInfo(tile->monster); + if (CanSeeTarget(a0, tile->monster)) { + if (i != 0 || tileMonsterInfo->isNotTeamMember) { + r9 = TRUE; + break; + } + } + } + } + if (r9) { + GetEntInfo(a0)->action.direction = direction & DIRECTION_MASK; + sub_806CDD4(a0, sub_806CEBC(a0), direction); + break; + } + } + } +} + +void sub_805E804(void) +{ + gDungeon->unk644.unk29 |= gDungeon->unk644.unk28; + gDungeon->unk644.unk28 = 0; + while (gDungeon->unk644.unk29 != 0 && gRealInputs.held & R_BUTTON) { + DungeonRunFrameActions(0x54); + } +} + +static bool8 sub_805E874(void) +{ + u8 r7, r8, r0; + s32 i, j, k; + s32 xArray[3]; + s32 yArray[3]; + Dungeon *dungeon = gDungeon; + Entity *leader = GetLeader(); + s32 direction = GetEntInfo(leader)->action.direction; + s32 x = leader->pos.x; + s32 y = leader->pos.y; + const Tile *leaderTile = GetTile(x, y); + s32 xAdjacent = x + gAdjacentTileOffsets[direction].x; + s32 yAdjacent = y + gAdjacentTileOffsets[direction].y; + s32 room; + + if (dungeon->unk644.unk28 == 0) + return FALSE; + if (leaderTile->object != NULL) + return FALSE; + if (sub_805EC2C(leader, x, y)) + return FALSE; + if (!sub_8070F14(leader, direction)) + return FALSE; + + room = leaderTile->room; + if (room == 0xFF) { + if (GetTile(xAdjacent, yAdjacent)->room != 0xFF) + return FALSE; + } + else { + if (leaderTile->terrainType & TERRAIN_TYPE_NATURAL_JUNCTION) + return FALSE; + } + + for (j = -1; j < 2; j++) { + const Tile *tile = GetTile(x + gAdjacentTileOffsets[(direction + j) & 7].x, y + gAdjacentTileOffsets[(direction + j) & 7].y); + if (tile->monster != NULL) + return FALSE; + if (tile->terrainType & TERRAIN_TYPE_STAIRS) + return FALSE; + } + + xArray[0] = x + gAdjacentTileOffsets[(direction + 3) & 7].x; + xArray[1] = x + gAdjacentTileOffsets[(direction + 4) & 7].x; + xArray[2] = x + gAdjacentTileOffsets[(direction + 5) & 7].x; + + yArray[0] = y + gAdjacentTileOffsets[(direction + 3) & 7].y; + yArray[1] = y + gAdjacentTileOffsets[(direction + 4) & 7].y; + yArray[2] = y + gAdjacentTileOffsets[(direction + 5) & 7].y; + + for (i = -1; i < 2; i++) { + for (j = -1; j < 2; j++) { + const Tile *tile = GetTile(x + i, y + j); + if (tile->object != NULL) { + for (k = 0; k < 3; k++) { + if (x + i == xArray[k] && y + j == yArray[k]) + break; + } + if (k == 3 && GetEntityType(tile->object) == ENTITY_ITEM) + return FALSE; + } + + if (direction & 1) { + // This doesn't really have to be called two times... + if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP && GetEntityType(tile->object) == ENTITY_TRAP) { + if (tile->object->isVisible) + return FALSE; + if (gDungeon->unk181e8.showInvisibleTrapsMonsters) + return FALSE; + } + } + else if (i == 0 || j == 0) { + if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP) { + if (tile->object->isVisible) + return FALSE; + if (gDungeon->unk181e8.showInvisibleTrapsMonsters) + return FALSE; + } + } + + if (i != 0 && j != 0) continue; + if (i == 0 && j == 0) continue; + + if ((xArray[1] != x + i || yArray[1] != y + j) && !sub_805EC2C(leader, x + i, y + j) && room != 0xFF && room != tile->room) + return FALSE; + } + } + + if (!(direction & 1)) { + if (direction == 0 || direction == 4) { + r8 = sub_805EC2C(leader, x - 1, y - 1); + r7 = sub_805EC2C(leader, x - 1, y); + r0 = sub_805EC2C(leader, x - 1, y + 1); + if (r7 == 0) { + if (r8 != 0 || r7 != r0) + return FALSE; + } + + r8 = sub_805EC2C(leader, x + 1, y - 1); + r7 = sub_805EC2C(leader, x + 1, y); + r0 = sub_805EC2C(leader, x + 1, y + 1); + if (r7 == 0) { + if (r8 != 0 || r7 != r0) + return FALSE; + } + } + else { + r8 = sub_805EC2C(leader, x - 1, y - 1); + r7 = sub_805EC2C(leader, x, y - 1); + r0 = sub_805EC2C(leader, x + 1, y - 1); + if (r7 == 0) { + if (r8 != 0 || r7 != r0) + return FALSE; + } + + r8 = sub_805EC2C(leader, x - 1, y + 1); + r7 = sub_805EC2C(leader, x, y + 1); + r0 = sub_805EC2C(leader, x + 1, y + 1); + if (r7 == 0) { + if (r8 != 0 || r7 != r0) + return FALSE; + } + } + } + + return TRUE; +} + +static bool8 sub_805EC2C(Entity *a0, s32 x, s32 y) +{ + DungeonPos pos = {.x = x, .y = y}; + return sub_8070564(a0, &pos); +} + +static bool8 sub_805EC4C(Entity *a0, u8 a1) +{ + DungeonPos pos; + const Tile *tile; + EntityInfo *tileMonsterInfo; + Entity *tileMonster; + EntityInfo *entityInfo = GetEntInfo(a0); + + pos.x = a0->pos.x + gAdjacentTileOffsets[entityInfo->action.direction].x; + pos.y = a0->pos.y + gAdjacentTileOffsets[entityInfo->action.direction].y; + tile = GetTile(pos.x, pos.y); + tileMonster = tile->monster; + + if (tileMonster == NULL) return FALSE; + if (GetEntityType(tileMonster) != ENTITY_MONSTER) return FALSE; + + tileMonsterInfo = GetEntInfo(tileMonster); + if (tileMonsterInfo->isNotTeamMember + && (tileMonsterInfo->shopkeeper != 1 && tileMonsterInfo->shopkeeper != 2) + && !IsExperienceLocked(tileMonsterInfo->joinedAt.id) + && tileMonsterInfo->monsterBehavior != BEHAVIOR_RESCUE_TARGET) { + return FALSE; + } + + if (entityInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) return FALSE; + if (entityInfo->frozenClassStatus.status == STATUS_FROZEN) return FALSE; + if (entityInfo->frozenClassStatus.status == STATUS_CONSTRICTION) return FALSE; + if (entityInfo->frozenClassStatus.status == STATUS_INGRAIN) return FALSE; + if (entityInfo->frozenClassStatus.status == STATUS_WRAP) return FALSE; + if (entityInfo->frozenClassStatus.status == STATUS_WRAPPED) return FALSE; + + if (tileMonsterInfo->frozenClassStatus.status == STATUS_SHADOW_HOLD) return FALSE; + if (tileMonsterInfo->frozenClassStatus.status == STATUS_FROZEN) return FALSE; + if (tileMonsterInfo->frozenClassStatus.status == STATUS_CONSTRICTION) return FALSE; + if (tileMonsterInfo->frozenClassStatus.status == STATUS_INGRAIN) return FALSE; + if (tileMonsterInfo->frozenClassStatus.status == STATUS_WRAP) return FALSE; + if (tileMonsterInfo->frozenClassStatus.status == STATUS_WRAPPED) return FALSE; + + if (entityInfo->cringeClassStatus.status == STATUS_CONFUSED) return FALSE; + if (tileMonsterInfo->cringeClassStatus.status == STATUS_CONFUSED) return FALSE; + + if (tileMonsterInfo->sleepClassStatus.status != STATUS_NONE && tileMonsterInfo->sleepClassStatus.status != STATUS_SLEEPLESS && tileMonsterInfo->sleepClassStatus.status != STATUS_YAWNING) return FALSE; + if (entityInfo->sleepClassStatus.status != STATUS_NONE && entityInfo->sleepClassStatus.status != STATUS_SLEEPLESS && entityInfo->sleepClassStatus.status != STATUS_YAWNING) return FALSE; + + if (IsChargingAnyTwoTurnMove(tileMonster, FALSE)) return FALSE; + if (!sub_8070F80(a0, entityInfo->action.direction)) return FALSE; + + if (a1 != 0 && sub_807049C(tileMonster, &a0->pos) && !DisplayDungeonYesNoMessage(0, gUnknown_8100208, 0)) return FALSE; + + SetMonsterActionFields(&entityInfo->action, ACTION_WALK); + if (gRealInputs.held & B_BUTTON) { + entityInfo->action.actionParameters[0].actionUseIndex = 0; + } + else { + entityInfo->action.actionParameters[0].actionUseIndex = 1; + } + entityInfo->flags |= 0x8000; + + SetMonsterActionFields(&tileMonsterInfo->action, ACTION_WALK); + tileMonsterInfo->action.actionParameters[0].actionUseIndex = 0; + tileMonsterInfo->action.direction = (entityInfo->action.direction + 4) & 7; + tileMonsterInfo->flags |= 0x8000; + tileMonsterInfo->targetPos.x = tileMonster->pos.x; + tileMonsterInfo->targetPos.y = tileMonster->pos.y; + gDungeon->unkE = 1; + return TRUE; +} + +void sub_805EE30(void) +{ + Entity *tileObject; + Tile *tile; + Entity *leader = GetLeader(); + if (leader == NULL) + return; + if (sub_8044B28()) + return; + + tile = GetTileAtEntitySafe(leader); + if (IQSkillIsEnabled(leader, IQ_SUPER_MOBILE) && GetEntInfo(leader)->invisibleClassStatus.status != STATUS_MOBILE && !HasHeldItem(leader, ITEM_MOBILE_SCARF)) + sub_804AE84(&leader->pos); + if (tile->terrainType & TERRAIN_TYPE_STAIRS) + gDungeon->unk1 = 1; + + tileObject = tile->object; + if (tileObject == NULL) + return; + switch (GetEntityType(tileObject)) + { + case ENTITY_TRAP: { + Trap *trap = GetTrapData(tileObject); + bool32 r8 = FALSE; + bool32 r7 = FALSE; + if (IQSkillIsEnabled(leader, IQ_TRAP_SEER) && !tileObject->isVisible) { + tileObject->isVisible = TRUE; + sub_8049ED4(); + r7 = TRUE; + } + if (trap->unk1 != 0) { + if (trap->unk1 == 1) + break; + if (trap->unk1 == 2) + r8 = TRUE; + if (r8 == FALSE) + break; + } + if (!r7) { + HandleTrap(leader, &leader->pos, 0, 1); + } + } + break; + case ENTITY_ITEM: { + Item *item = GetItemData(tileObject); + if (!(item->flags & ITEM_FLAG_IN_SHOP)) { + sub_8045DB4(&leader->pos, 1); + } + else { + gDungeon->unk5C0 = 4; + } + } + break; + case ENTITY_NOTHING: + case ENTITY_MONSTER: + case ENTITY_UNK_4: + case ENTITY_UNK_5: + default: + break; + } +} + +static bool8 sub_805EF60(Entity *a0, EntityInfo *a1) +{ + Entity *r4 = sub_80696A8(a0); + + if (r4 == NULL) + return FALSE; + if (GetEntityType(r4) != ENTITY_MONSTER) + return FALSE; + if (!sub_8070BC0(a0)) + return FALSE; + if (GetEntInfo(r4)->isNotTeamMember && GetEntInfo(r4)->monsterBehavior != BEHAVIOR_RESCUE_TARGET && GetEntInfo(r4)->shopkeeper != 1) + return FALSE; + + SetMonsterActionFields(&a1->action, ACTION_TALK_FIELD); + return TRUE; +} + +void sub_805EFB4(Entity *a0, bool8 a1) +{ + s32 i; + EntityInfo *leaderInfo = GetLeaderInfo(); + if (a1 && leaderInfo->cringeClassStatus.status == STATUS_COWERING) { + leaderInfo->action.direction += 4; + leaderInfo->action.direction &= 7; + } + else if (leaderInfo->cringeClassStatus.status == STATUS_CONFUSED) { + s32 rnd = DungeonRandInt(8); + for (i = 0; i < 8; i++) { + if (a1 || CanMoveInDirection(a0, rnd)) { + leaderInfo->action.direction = rnd & 7; + return; + } + rnd = (rnd + 1) & 7; + } + } +} + +void sub_805F02C(void) +{ + s32 i; + Entity *r7 = gDungeon->unkBC; + Entity *leader = GetLeader(); + EntityInfo *r8 = GetEntInfo(r7); + EntityInfo *leaderInfo = GetEntInfo(leader); + + if (r8->isTeamLeader) { + DisplayDungeonLoggableMessageTrue(r7, gUnknown_80F9BD8); + } + else if (sub_8047084(ITEM_FLAG_IN_SHOP) || sub_807EF48()) { + DisplayDungeonLoggableMessageTrue(r7, gUnknown_80F9C08); + } + else if (gDungeon->unk644.unk2A) { + DisplayDungeonLoggableMessageTrue(r7, gUnknown_80F9C2C); + } + else { + gDungeon->unk644.unk35 = 0; + r8->isTeamLeader = TRUE; + leaderInfo->isTeamLeader = FALSE; + for (i = 0; i < 4; i++) { + PokemonStruct2 *mon = &gRecruitedPokemonRef->pokemon2[i]; + PokemonStruct1 *r5 = NULL; + + if ((u8)mon->unk0 & 1) { + if (!sub_806A538(mon->unkA)) { + r5 = &gRecruitedPokemonRef->pokemon[mon->unkA]; + } + if (i == r8->teamIndex) { + mon->isTeamLeader = TRUE; + if (r5 != NULL) { + r5->isTeamLeader = TRUE; + } + } + else { + mon->isTeamLeader = FALSE; + if (r5 != NULL) { + r5->isTeamLeader = FALSE; + } + } + } + } + gLeaderPointer = NULL; + r8->action = leaderInfo->action; + sub_803F508(r7); + sub_8041AD0(leader); + sub_8041AE0(GetLeader()); + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], r7, 0); + LogMessageByIdWithPopupCheckUser(r7, gUnknown_80F9BB0); + sub_807EC28(FALSE); + r8->unk64 = 0; + leaderInfo->unk64 = 0; + sub_806A6E8(leader); + sub_806A6E8(r7); + } +} + +ActionContainer *GetLeaderActionContainer(void) +{ + return &GetLeaderInfo()->action; +} + +u16 GetLeaderActionId(void) +{ + return GetLeaderInfo()->action.action; +} + +enum +{ + MAIN_MENU_MOVES, + MAIN_MENU_ITEMS, + MAIN_MENU_TEAM, + MAIN_MENU_OTHERS, + MAIN_MENU_GROUND, +}; + +static void ShowMainMenu(bool8 fromBPress, bool8 a1) +{ + Item *item; + s32 r10; + bool8 printAll = fromBPress; + s32 chosenOption; + s32 var_24; + struct UnkMenuBitsStruct var_30; + struct UnkMenuBitsStruct var_34; + + r10 = gDungeon->unk5C0; + chosenOption = 0; + var_24 = (gDungeon->unk5C0 > - 1); + gDungeon->unk5C0 = -1; + if (r10 >= 0) { + chosenOption = r10; + } + + if (a1) { + PlayFanfareSE(0x137, 0x100); + } + else { + PlayDungeonStartButtonSE(); + } + + while (1) { + if (r10 < 0) { + SetLeaderActionToNothing(1); + gTeamMenuChosenId = -1; + PrintOnMainMenu(printAll); + sub_806A2BC(GetLeader(), 0); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1D); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + if ((gRealInputs.pressed & A_BUTTON || gDungeonMenu.unk28.a_button)) { + if (gUnknown_202749A[gDungeonMenu.menuIndex + 1] == 7) { + PlayDungeonConfirmationSE(); + chosenOption = gDungeonMenu.menuIndex; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + chosenOption = -1; + break; + } + } + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1D); + printAll = TRUE; + } + + r10 = chosenOption; + if (chosenOption == MAIN_MENU_ITEMS) { + u16 action; + + SetLeaderActionToNothing(1); + var_34.a0_8 = 0; + var_34.a0_16 = 1; + var_34.a0_24 = 0; + var_34.a0_32 = 0; + if (ShowDungeonItemsMenu(GetLeader(), &var_34)) { + r10 = -1; + } + if (sub_805FD3C(&var_34) && ShowDungeonItemsMenu(GetLeader(), &var_34)) { + SetLeaderActionToNothing(1); + } + action = GetLeaderActionId(); + if (action == 12) { + sub_8044D90(GetLeader(), 0, 12)->flags |= ITEM_FLAG_UNPAID; + sub_8060D24(GetLeaderActionContainer()); + SetLeaderActionToNothing(1); + } + else if (action == 53) { + item = sub_8044D90(GetLeader(), 0, 13); + if (!sub_8048A68(GetLeader(), item)) { + SetLeaderActionToNothing(1); + } + } + else if (action == 16) { + item = sub_8044D90(GetLeader(), 0, 14); + if (!sub_8048950(GetLeader(), item)) { + SetLeaderActionToNothing(1); + } + } + else if (action == 44) { + item = sub_8044D90(GetLeader(), 0, 15); + if (!sub_8048B9C(GetLeader(), item)) { + SetLeaderActionToNothing(1); + } + } + else if (action == 60) { + HandleSetItemAction(GetLeader(), TRUE); + SetLeaderActionToNothing(1); + sub_803E708(0x50, 0x4D); + sub_8052210(0); + break; + } + else if (action == 61) { + HandleUnsetItemAction(GetLeader(), TRUE); + SetLeaderActionToNothing(1); + sub_803E708(0x50, 0x4D); + sub_8052210(0); + break; + } + + if (GetLeaderActionId() != 0) + break; + } + else if (chosenOption == MAIN_MENU_TEAM) { + SetLeaderActionToNothing(1); + if (ShowDungeonTeamMenu(GetLeader())) { + r10 = -1; + } + + if (GetLeaderActionId() == ACTION_CHECK_SUMMARY) { + ShowDungeonSummaryOrIQMenu(GetLeaderActionContainer(), FALSE); + SetLeaderActionToNothing(1); + } + else if (GetLeaderActionId() == ACTION_TALK_MENU) { + sub_806752C(GetLeaderActionContainer()); + SetLeaderActionToNothing(1); + } + else if (GetLeaderActionId() == 0x34) { + sub_8067768(GetLeaderActionContainer()); + SetLeaderActionToNothing(1); + } + else if (GetLeaderActionId() == ACTION_CHANGE_TACTICS) { + ShowDungeonTacticsMenu(GetLeaderActionContainer()); + SetLeaderActionToNothing(1); + } + else if (GetLeaderActionId() == ACTION_VIEW_IQ) { + ShowDungeonSummaryOrIQMenu(GetLeaderActionContainer(), TRUE); + SetLeaderActionToNothing(1); + } + else if (GetLeaderActionId() == ACTION_CHECK_MOVES) { + s32 i, count; + + ShowMovesFromTeamMenu(GetLeaderActionContainer()); + count = 0; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + if (i == GetLeaderActionContainer()->actionParameters[0].actionUseIndex) { + gTeamMenuChosenId = count; + if (GetLeaderActionId() != 0) { + sub_806A2BC(teamMon, 0); + } + break; + } + count++; + } + } + } + + if (GetLeaderActionId() != 0) + break; + } + else if (chosenOption == MAIN_MENU_MOVES) { + s32 i, currMonId, teamMonsCount, r9; + Entity *currEntity; + + currMonId = 0; + SetLeaderActionToNothing(1); + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + if (GetEntInfo(teamMon)->isTeamLeader) { + currMonId = i; + break; + } + } + } + + while (1) { + SetLeaderActionToNothing(0); + LOOP_START_NO_CALL: // Actions 6 and 7 don't call SetLeaderActionToNothing + currEntity = NULL; + r9 = 0; + teamMonsCount = 0; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (sub_8071A8C(teamMon)) { + if (i == currMonId) { + r9 = teamMonsCount; + currEntity = teamMon; + } + teamMonsCount++; + } + } + if (currEntity == NULL) { + currEntity = GetLeader(); + } + + sub_806A2BC(currEntity, 0); + ChangeDungeonCameraPos(&currEntity->pos, 0, 1, 1); + GetLeaderInfo()->action.actionParameters[0].actionUseIndex = currMonId; + SetLeaderActionToNothing(FALSE); + if (ShowDungeonMovesMenu(currEntity, 0, 1, r9, teamMonsCount)) { + r10 = -1; + } + + if (GetLeaderActionId() == ACTION_MOVES_MENU_NEXT_MON) { + s32 prevMonId = currMonId; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + if (++currMonId >= MAX_TEAM_MEMBERS) { + currMonId = 0; + } + currEntity = gDungeon->teamPokemon[currMonId]; + if (sub_8071A8C(currEntity)) + break; + } + GetLeaderInfo()->action.actionParameters[0].actionUseIndex = currMonId; + if (prevMonId != currMonId) { + PlayDungeonCursorSE(0); + } + goto LOOP_START_NO_CALL; + } + else if (GetLeaderActionId() == ACTION_MOVES_MENU_PREV_MON) { + s32 prevMonId = currMonId; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + if (--currMonId < 0) { + currMonId = MAX_TEAM_MEMBERS - 1; + } + currEntity = gDungeon->teamPokemon[currMonId]; + if (sub_8071A8C(currEntity)) + break; + } + GetLeaderInfo()->action.actionParameters[0].actionUseIndex = currMonId; + if (prevMonId != currMonId) { + PlayDungeonCursorSE(0); + } + goto LOOP_START_NO_CALL; + } + else if (GetLeaderActionId() == ACTION_MOVE_INFO) { + ActionShowMoveInfo(GetLeaderActionContainer()); + } + else if (GetLeaderActionId() == ACTION_SET_MOVE || GetLeaderActionId() == ACTION_UNSET_MOVE) { + ActionSetOrUnsetMove(GetLeaderActionContainer(), FALSE); + } + else if (GetLeaderActionId() == ACTION_SWITCH_AI_MOVE) { + ActionToggleMoveUsableForAi(GetLeaderActionContainer()); + } + else if (GetLeaderActionId() == ACTION_LINK_MOVES) { + ActionLinkMoves(GetLeaderActionContainer()); + } + else if (GetLeaderActionId() == ACTION_DELINK_MOVES) { + ActionDelinkMoves(GetLeaderActionContainer(), FALSE); + } + else { + break; + } + } + sub_806A2BC(GetLeader(), 0); + ChangeDungeonCameraPos(&GetLeader()->pos, 0, 1, 1); + if (GetLeaderActionId() != 0) + break; + } + else if (chosenOption == MAIN_MENU_GROUND) { + Entity *leader = GetLeader(); + const Tile *tile = GetTile(leader->pos.x, leader->pos.y); + Entity *tileObject = tile->object; + if (tileObject != NULL) { + if (GetEntityType(tileObject) == ENTITY_ITEM) { + u16 action; + + SetLeaderActionToNothing(1); + var_30.a0_8 = 0; + var_30.a0_16 = 1; + var_30.a0_24 = 1; + var_30.a0_32 = 1; + if (ShowDungeonItemsMenu(GetLeader(), &var_30)) { + // This actually doesn't do anything, it's just there to make the code match as the compiler does a `lsl r0, r0, #0x10, mov r0, r4` + ASM_MATCH_TRICK(leader); + } + if (sub_805FD3C(&var_30) && ShowDungeonItemsMenu(GetLeader(), &var_30)) { + SetLeaderActionToNothing(1); + } + + action = GetLeaderActionId(); + if (action == 0xC) { + sub_8044D90(GetLeader(), 0, 0x10)->flags |= ITEM_FLAG_UNPAID; + sub_8060D24(GetLeaderActionContainer()); + SetLeaderActionToNothing(1); + } + else if (action == 0x35) { + item = sub_8044D90(GetLeader(), 0, 0x11); + if (!sub_8048A68(GetLeader(), item)) { + SetLeaderActionToNothing(1); + } + } + else if (action == 0x10) { + item = sub_8044D90(GetLeader(), 0, 0x12); + if (!sub_8048950(GetLeader(), item)) { + SetLeaderActionToNothing(1); + } + } + else if (action == 0x2C) { + item = sub_8044D90(GetLeader(), 0, 0x13); + if (!sub_8048B9C(GetLeader(), item)) { + SetLeaderActionToNothing(1); + } + } + if (GetLeaderActionId() != 0) + break; + } + else if (GetEntityType(tileObject) == ENTITY_TRAP) { + SetLeaderActionToNothing(1); + ShowDungeonTileMenu(GetLeader()); + if (GetLeaderActionId() != 0) + break; + } + } + else if (tile->terrainType & TERRAIN_TYPE_STAIRS) { + SetLeaderActionToNothing(1); + ShowDungeonStairsMenu(GetLeader()); + if (GetLeaderActionId() != 0) + break; + } + else { + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], GetLeader(), 0); + DisplayDungeonMessage(0, gUnknown_80FDE18, 1); + } + + r10 = -1; + } + else if (chosenOption == MAIN_MENU_OTHERS) { + ShowDungeonOthersMenu(); + if (gDungeon->unk4) + break; + if (GetLeaderActionId() != 0) + break; + r10 = -1; + } + + // B button + if (chosenOption < 0) + break; + + if (var_24 == 0) { + ResetRepeatTimers(); + ResetUnusedInputStruct(); + } + else { + sub_806A2BC(GetLeader(), 0); + break; + } + } + + sub_803EAF0(0, NULL); + ResetRepeatTimers(); + ResetUnusedInputStruct(); +} + +static void PrintOnMainMenu(bool8 printAll) +{ + s32 i, x, y, yLoop; + + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1A = 5; + gDungeonMenu.unk1C = 5; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 2; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk0 = 0; + gDungeonMenu.unk14.x = 0; + sub_801317C(&gDungeonMenu.unk28); + sub_80137B0(&gDungeonMenu, 0x38); + if (printAll) { + sub_803EAF0(7, NULL); + } + else { + sub_803EAF0(6, NULL); + } + + sub_80073B8(0); + if (ShouldMonsterRunAwayAndShowEffect(GetLeader(), TRUE)) { + gUnknown_202749A[1] = 2; + gUnknown_202749A[2] = 2; + gUnknown_202749A[3] = 2; + gUnknown_202749A[4] = 7; + gUnknown_202749A[5] = 2; + } + else + { + gUnknown_202749A[1] = 7; + gUnknown_202749A[2] = 7; + gUnknown_202749A[3] = 7; + gUnknown_202749A[4] = 7; + gUnknown_202749A[5] = 7; + } + + y = GetMenuEntryYCoord(&gDungeonMenu, 0); + PrintStringOnWindow(8, y, gFieldMenuMovesPtr, 0, 0); + + y = GetMenuEntryYCoord(&gDungeonMenu, 1); + PrintStringOnWindow(8, y, gFieldMenuItemsPtr, 0, 0); + + y = GetMenuEntryYCoord(&gDungeonMenu, 2); + PrintStringOnWindow(8, y, gFieldMenuTeamPtr, 0, 0); + + y = GetMenuEntryYCoord(&gDungeonMenu, 3); + PrintStringOnWindow(8, y, gFieldMenuOthersPtr, 0, 0); + + y = GetMenuEntryYCoord(&gDungeonMenu, 4); + PrintStringOnWindow(8, y, gFieldMenuGroundPtr, 0, 0); + + sub_80073E0(0); + if (printAll) { + u32 hours, minutes, seconds; + EntityInfo *leaderInfo = GetEntInfo(GetLeader()); + const u8 *dungeonName = GetCurrentDungeonName(); + + x = (136 - sub_8008ED0(dungeonName)) / 2; + sub_80073B8(1); + PrintStringOnWindow(x, 2, dungeonName, 1, 0); + sub_80073E0(1); + sub_80073B8(2); + DeconstructPlayTime(gPlayTimeRef, &hours, &minutes, &seconds); + + gFormatArgs[0] = FixedPointToInt(leaderInfo->belly); + gFormatArgs[1] = FixedPointToInt(leaderInfo->maxBelly); + PrintFormattedStringOnWindow(0x73, 0, gUnknown_80F9174, 2, 0); + + gFormatArgs[0] = gTeamInventoryRef->teamMoney; + PrintFormattedStringOnWindow(0x73, 12, gUnknown_80F9190, 2, 0); + + GetWeatherName(gFormatBuffer_Monsters[0], GetApparentWeather(NULL)); + PrintFormattedStringOnWindow(0x73, 24, gUnknown_80F91A8, 2, 0); + + gFormatArgs[0] = hours; + gFormatArgs[1] = minutes; + gFormatArgs[2] = seconds; + PrintFormattedStringOnWindow(0x73, 36, gUnknown_80F91C8, 2, 0); + for (yLoop = 0, i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + EntityInfo *monInfo = GetEntInfo(teamMon); + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], teamMon, 0); + gFormatArgs[0] = monInfo->HP; + gFormatArgs[1] = monInfo->maxHPStat; + PrintFormattedStringOnWindow(4, yLoop, gUnknown_80F91E0, 2, 0); + yLoop += 12; + if (yLoop >= 12 * MAX_TEAM_MEMBERS) + break; + } + } + sub_80073E0(2); + } +} + +bool8 DungeonGiveNameToRecruitedMon(u8 *a0) +{ + s32 r4; + sub_803EAF0(8, a0); + do + { + DungeonRunFrameActions(0xE); + DrawDialogueBoxString(); + r4 = sub_8016080(); + } while (r4 == 0); + CleanConfirmNameMenu(); + DungeonRunFrameActions(0xE); + sub_803EAF0(0, NULL); + if (r4 == 3 && *a0 != 0) + return TRUE; + + return FALSE; +} diff --git a/src/dungeon_map_access.c b/src/dungeon_map_access.c index fd1ebe87e..67afcaa58 100644 --- a/src/dungeon_map_access.c +++ b/src/dungeon_map_access.c @@ -761,7 +761,7 @@ void sub_804A49C(s32 a0, s32 a1) sub_80098F8(3); } -void sub_804A728(DungeonPos *pos, s32 a1, u8 a2, u8 a3) +void ChangeDungeonCameraPos(DungeonPos *pos, s32 a1, u8 a2, u8 a3) { DungeonPos spArray[6]; u16 *src; diff --git a/src/dungeon_menu_items.c b/src/dungeon_menu_items.c new file mode 100644 index 000000000..2ee3ce904 --- /dev/null +++ b/src/dungeon_menu_items.c @@ -0,0 +1,840 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_items.h" +#include "dungeon_menu_team.h" +#include "dungeon_submenu.h" +#include "structs/str_dungeon.h" +#include "input.h" +#include "structs/map.h" +#include "dungeon_main.h" +#include "dungeon_message.h" +#include "dungeon_action.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_util.h" +#include "pokemon.h" +#include "items.h" +#include "dungeon_music.h" +#include "dungeon_ai_movement.h" +#include "code_8045A00.h" +#include "string_format.h" +#include "code_803E46C.h" +#include "trap.h" +#include "dungeon_map_access.h" +#include "status_checks_1.h" +#include "dungeon_items.h" +#include "dungeon_leader.h" +#include "tile_types.h" +#include "menu_input.h" +#include "text.h" +#include "code_8044CC8.h" +#include "code_801B3C0.h" +#include "dungeon_capabilities.h" + +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void sub_806A2BC(Entity *a0, u8 a1); +extern void SetLeaderActionToNothing(u8 a0); +extern void sub_803E708(s32 a0, s32 a1); +extern void sub_8047158(void); +extern Item *sub_8044D90(Entity *, s32, u32); +extern bool8 sub_8070F14(Entity * pokemon, s32 direction); +bool8 sub_805EC2C(Entity *a0, s32 x, s32 y); +extern Entity *sub_80696A8(Entity *a0); +extern u8 sub_806A538(s32); +extern void sub_803EAF0(u32, u8 *); +extern void sub_803F508(Entity *); +extern void sub_8041AD0(Entity *pokemon); +extern void sub_8041AE0(Entity *pokemon); +extern void sub_807EC28(bool8); +extern void PlayDungeonCursorSE(u8 param_1); +extern u8 *GetDungeonSubMenuItemString(s32 param_1); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern s32 gDungeonSubMenuItemsCount; +extern const u8 gUnknown_8106B50[]; +extern void DungeonShowWindows(WindowTemplates *a0, u8 a1); +extern Item * sub_8044CC8(Entity *param_1, ActionParameter *param_2, UNUSED s32 a3); +extern void AddActionToDungeonSubMenu(u16 param_1, u8 param_2); +extern void SetActionUnusableInDungeonSubMenu(u16 param_1); +extern u16 sub_8044DC8(Item *param_1); +extern bool8 sub_8046F00(Item *item); +extern void sub_8045064(void); +extern bool8 PosHasItem(DungeonPos *pos); + +extern u8 gUnknown_202EE00; +extern Entity *gLeaderPointer; + +extern MenuInputStruct gDungeonMenu; + +extern const u8 *gUnknown_80F8B24; +extern const u8 *gTeamToolboxAPtr; +extern const u8 *gTeamToolboxBPtr; +extern const u8 *gFieldItemMenuGroundTextPtr; +extern const u8 *gUnknown_80FE940; +extern const u8 *gWhichTextPtr1; + +static EWRAM_DATA ActionParameter sUnknownActionUnk4 = {0}; +static EWRAM_DATA s32 sUnknown_202F240 = 0; +static UNUSED EWRAM_DATA u8 sUnused[4] = {0}; +static EWRAM_DATA s16 sUnknown_202F248[8] = {0}; +static EWRAM_DATA s32 sUnknown_202F258 = 0; + +static void PrintOnDungeonItemsMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, WindowTemplates *a4, WindowHeader *a5); +static s32 sub_8060800(WindowHeader *a0, s32 a1); +static bool8 sub_8060860(s32 a0); +static void sub_8060890(DungeonPos *a0); +static void sub_8060900(Entity *a0); +static void ChosenSubMenuToAction(ActionContainer *a0); +static s32 sub_8060D64(s16 *a0, bool8 a1, bool8 a2, bool8 a3, Entity *a4); + +bool8 sub_805FD3C(struct UnkMenuBitsStruct *a0) +{ + u16 action = GetLeaderActionId(); + + a0->a0_8 = 0; + a0->a0_16 = 0; + a0->a0_24 = 0; + a0->a0_32 = 0; + if (action == 0xA) { + a0->a0_8 = 1; + a0->a0_32 = 1; + } + if (action == 0x3E) { + a0->a0_8 = 1; + a0->a0_16 = 0; + a0->a0_32 = 1; + } + return a0->a0_8; +} + +bool8 ShowDungeonItemsMenu(Entity * a0, struct UnkMenuBitsStruct *a1) +{ + s32 i, i_r6; + s32 r8; + s32 r9 = 0; + + u8 var_34 = 1; + u8 var_30 = 0; + u8 var_2C = 0; + u8 var_28 = 0; + EntityInfo *a0Info = GetEntInfo(a0); + WindowHeader header; + + WindowTemplates windows = + { + .id = + { + [0] = + { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 0x12, + .height = 0x10, + .unk10 = 0x10, + .header = &header, + }, + WINDOW_DUMMY, WINDOW_DUMMY, WINDOW_DUMMY + }, + }; + + sUnknownActionUnk4.actionUseIndex = 0; + sUnknownActionUnk4.itemPos.x = 0; + sUnknownActionUnk4.itemPos.y = 0; + if (a1 != NULL) { + var_2C = (a1->a0_8 != 0); + var_34 = (a1->a0_16 != 0); + var_30 = (a1->a0_24 != 0); + var_28 = (a1->a0_32 != 0); + } + + sUnknown_202F258 = sub_8060D64(sUnknown_202F248, var_30, var_34, var_28, a0); + if (sUnknown_202F258 == 0) { + DisplayDungeonMessage(0, gUnknown_80F8B24, 1); + return TRUE; + } + + r8 = 0; + sUnknown_202F240 = 0; + while (1) + { + s32 id; + Entity *r4; + + r9 = 0; + for (i = 0; i < INVENTORY_SIZE; i++) { + Item *item = &gTeamInventoryRef->teamItems[i]; + if (item->flags & ITEM_FLAG_EXISTS && item->flags & ITEM_FLAG_UNPAID) { + item->flags &= ~(ITEM_FLAG_UNPAID); + r8 = i / 10; + sUnknown_202F240 = i % 10; + } + } + for (i_r6 = 0; i_r6 < MAX_TEAM_MEMBERS; i_r6++) { + Entity *teamMon = gDungeon->teamPokemon[i_r6]; + if (EntityIsValid(teamMon)) { + EntityInfo *monInfo = GetEntInfo(teamMon); + if (monInfo->heldItem.flags & ITEM_FLAG_EXISTS && monInfo->heldItem.flags & ITEM_FLAG_UNPAID) { + monInfo->heldItem.flags &= ~(ITEM_FLAG_UNPAID); + for (i = 0; i < sUnknown_202F258; i++) { + if (sUnknown_202F248[i] == i_r6 + 4) { + r8 = i; + break; + } + } + sUnknown_202F240 = 0; + } + } + } + PrintOnDungeonItemsMenu(r8, a0, var_2C, var_30, &windows, &header); + + id = sUnknown_202F248[gDungeonMenu.unk1E]; + if (id >= MAX_TEAM_MEMBERS) { + r4 = gDungeon->teamPokemon[id - MAX_TEAM_MEMBERS]; + } + else { + r4 = a0; + } + sub_806A2BC(r4, 0); + ChangeDungeonCameraPos(&r4->pos, 0, 1, 1); + + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x14); + if (!var_30) { + if (sUnknown_202F258 > 1) { + if ((gRealInputs.pressed & DPAD_LEFT) || gDungeonMenu.unk28.dpad_left) { + PlayDungeonCursorSE(0); + if (--r8 < 0) { + r8 = sUnknown_202F258 - 1; + } + sUnknown_202F240 = var_30; + break; + } + if ((gRealInputs.pressed & DPAD_RIGHT) || gDungeonMenu.unk28.dpad_right) { + PlayDungeonCursorSE(0); + if (++r8 == sUnknown_202F258) { + r8 = 0; + } + sUnknown_202F240 = var_30; + break; + } + } + if (gRealInputs.repeated & DPAD_DOWN && sub_8060860(r8)) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP && sub_8060860(r8)) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.pressed & SELECT_BUTTON && sUnknown_202F248[r8] <= 1) { + s32 r3; + bool32 r7 = TRUE; + s16 arr[10]; + + PlaySoundEffect(0x132); + sub_8047158(); + ConvertMoneyItemToMoney(); + sUnknown_202F240 = 0; + r3 = sub_8060D64(arr, var_30, var_34, var_28, a0); + if (sUnknown_202F258 == r3) { + for (i_r6 = 0; i_r6 < r3; i_r6++) { + if (arr[i_r6] != sUnknown_202F248[i_r6]) { + break; + } + } + if (i_r6 == r3) { + r7 = FALSE; + } + } + if (r7) { + r8 = 0; + sUnknown_202F240 = 0; + sUnknown_202F258 = r3; + for (i_r6 = 0; i_r6 < sUnknown_202F258; i_r6++) { + sUnknown_202F248[i_r6] = arr[i_r6]; + } + } + break; + } + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + sub_8060890(&a0->pos); + r9 = 1; + break; + } + if (gRealInputs.pressed & START_BUTTON) { + PlayDungeonStartButtonSE(); + sub_8060890(&a0->pos); + r9 = 3; + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + r9 = 2; + break; + } + } + else { + sub_8060890(&a0->pos); + r9 = 1; + break; + } + } + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x14); + if (sUnknown_202F248[gDungeonMenu.unk1E] <= 1 && !(gTeamInventoryRef->teamItems[0].flags & ITEM_FLAG_EXISTS)) { + r9 = 2; + } + + if (r9 == 2) { + sub_803EAF0(0, NULL); + r9 = 1; + break; + } + else if (r9 == 0) { + continue; + } + else if (r9 == 3) { + SetMonsterActionFields(&a0Info->action, 0xC); + a0Info->action.actionParameters[0] = sUnknownActionUnk4; + sub_803EAF0(0, NULL); + r9 = 0; + break; + } + else { + sUnknown_202F240 = gDungeonMenu.menuIndex; + if (var_2C != 0) { + a0Info->action.actionParameters[1] = sUnknownActionUnk4; + sub_803EAF0(0, NULL); + r9 = 0; + break; + } + + sub_8060900(a0); + sub_8060800(&header, gDungeonMenu.unk1E); + CreateDungeonMenuSubWindow(&windows.id[0], 0x16); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x14); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + PlayDungeonConfirmationSE(); + ChosenSubMenuToAction(&a0Info->action); + r9 = 0; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + r9 = 1; + break; + } + } + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x14); + gDungeon->unk181e8.unk18212 = 0; + if (r9 != 1 || var_30 != 0) { + if (a0Info->action.action == 0x37 || a0Info->action.action == 0x38 || a0Info->action.action == 0x3E) { + // Hm... + int newAction = sUnknownActionUnk4.actionUseIndex - 0x90; + a0Info->action.actionParameters[0].actionUseIndex = newAction; + sub_803EAF0(0, 0); + r9 = 0; + break; + } + else if (a0Info->action.action == ACTION_GIVE_ITEM) { + s32 teamId; + if (ShowDungeonToWhichMonMenu(&teamId, WHICH_MENU_ITEMS) != NULL) { + a0Info->action.actionParameters[1].actionUseIndex = teamId; + sub_803EAF0(0, 0); + r9 = 0; + break; + } + sub_803EAF0(0, NULL); + SetLeaderActionToNothing(1); + } + else { + sub_803EAF0(0, 0); + r9 = 0; + break; + } + } + } + } + + gDungeon->unk181e8.unk18212 = 0; + sub_803E708(2, 0x61); + sub_804AA60(); + sub_803E708(2, 0x61); + return r9; +} + +static const struct unkStruct_8090F58 gUnknown_8106B60 = {1, 1, 0, 80, 1}; + +static void PrintOnDungeonItemsMenu(s32 a0, Entity *a1, bool8 showWhichWindow, bool8 a3, WindowTemplates *windows, WindowHeader *a5) +{ + s32 i, x, y; + s32 r10; + Window *txtStrPtr; + WindowTemplate whichWindow = { + .type = WINDOW_TYPE_NORMAL, + .pos = {2, 4}, + .width = 6, + .height = 2, + .unk10 = 2, + .unk12 = 0, + .header = NULL, + }; + u8 txtBuff[80]; + EntityInfo *a1Info; + + a1Info = GetEntInfo(a1); + r10 = sub_8060800(a5, a0); + gDungeonMenu.menuIndex = sUnknown_202F240; + gDungeonMenu.unk1A = 0; + gDungeonMenu.unk1E = a0; + gDungeonMenu.unk20 = sUnknown_202F258; + gDungeonMenu.unk4 = 0; + gDungeonMenu.unk0 = 0; + gDungeonMenu.unk14.x = 0; + sub_801317C(&gDungeonMenu.unk28); + gDungeon->unk181e8.unk18212 = 0; + switch (sUnknown_202F248[a0]) { + case 0: + case 1: + windows->id[0].unk10 = 0x10; + windows->id[0].height = 0x10; + a5->width = 0xC; + gDungeonMenu.firstEntryY = 0x10; + gDungeonMenu.unk1C = 0xA; + gDungeon->unk181e8.unk18212 = 1; + break; + case 2: + windows->id[0].unk10 = 4; + windows->id[0].height = 4; + a5->width = 6; + gDungeonMenu.firstEntryY = 0x12; + gDungeonMenu.unk1C = 1; + break; + case 3: + default: + windows->id[0].unk10 = 4; + windows->id[0].height = 4; + a5->width = 0xC; + gDungeonMenu.firstEntryY = 0x12; + gDungeonMenu.unk1C = 1; + break; + } + + if (showWhichWindow) { + gDungeonMenu.unkC += 0x40; + windows->id[0].pos.x = 0xA; + windows->id[1] = whichWindow; + } + else { + windows->id[0].pos.x = 2; + windows->id[1] = windows->id[3]; + } + + DungeonShowWindows(windows, 1); + txtStrPtr = &gWindows[0]; + gDungeonMenu.unkC = (txtStrPtr->x + 0x10) * 8; + gDungeonMenu.unkE = ((txtStrPtr->y + 1) * 8) - 2; + sub_80137B0(&gDungeonMenu, 0x70); + sub_80073B8(0); + x = ((a0 - r10) * 8) + 0xC; + switch (sUnknown_202F248[a0]) + { + case 0: + PrintFormattedStringOnWindow(x, 0, gTeamToolboxAPtr, 0, 0); + for (i = 0; i < 10; i++) { + if (ItemExists(&gTeamInventoryRef->teamItems[i])) { + gDungeonMenu.unk1A++; + sub_8090E14(txtBuff, &gTeamInventoryRef->teamItems[i], &gUnknown_8106B60); + y = GetMenuEntryYCoord(&gDungeonMenu, i); + PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); + } + else { + break; + } + } + break; + case 1: + PrintFormattedStringOnWindow(x, 0, gTeamToolboxBPtr, 0, 0); + for (i = 0; i < 10; i++) { + if (ItemExists(&gTeamInventoryRef->teamItems[i + 10])) { + gDungeonMenu.unk1A++; + sub_8090E14(txtBuff, &gTeamInventoryRef->teamItems[i + 10], &gUnknown_8106B60); + y = GetMenuEntryYCoord(&gDungeonMenu, i); + PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); + } + else { + break; + } + } + break; + case 2: { + const Tile *tile = GetTile(a1->pos.x, a1->pos.y); + Item *item = GetItemData(tile->object); + PrintFormattedStringOnWindow(x, 0, gFieldItemMenuGroundTextPtr, 0, 0); + if (item->flags & ITEM_FLAG_EXISTS) { + gDungeonMenu.unk1A++; + sub_8090E14(txtBuff, item, &gUnknown_8106B60); + y = GetMenuEntryYCoord(&gDungeonMenu, 0); + PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); + } + if (a3) { + gDungeonMenu.unk8.x = gDungeonMenu.unk8.y = 0; + } + } + break; + case 3: { + Item *item = &GetEntInfo(a1)->heldItem; + SetMessageArgument_2(gFormatBuffer_Monsters[0], a1Info, 0); + PrintFormattedStringOnWindow(x, 0, gUnknown_80FE940, 0, 0); + if (item->flags & ITEM_FLAG_EXISTS) { + gDungeonMenu.unk1A++; + sub_8090E14(txtBuff, item, &gUnknown_8106B60); + y = GetMenuEntryYCoord(&gDungeonMenu, 0); + PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); + } + } + break; + default: { + Entity *chosenTeamMember = gDungeon->teamPokemon[sUnknown_202F248[a0] - MAX_TEAM_MEMBERS]; + if (EntityIsValid(chosenTeamMember)) { + EntityInfo *monInfo = GetEntInfo(chosenTeamMember); + Item *item = &monInfo->heldItem; + SetMessageArgument_2(gFormatBuffer_Monsters[0], monInfo, 0); + PrintFormattedStringOnWindow(x, 0, gUnknown_80FE940, 0, 0); + if (item->flags & ITEM_FLAG_EXISTS) { + gDungeonMenu.unk1A++; + sub_8090E14(txtBuff, item, &gUnknown_8106B60); + y = GetMenuEntryYCoord(&gDungeonMenu, 0); + PrintFormattedStringOnWindow(8, y, txtBuff, 0, 0); + } + } + } + break; + } + + if (gDungeonMenu.menuIndex >= gDungeonMenu.unk1A) { + gDungeonMenu.menuIndex = 0; + } + sub_80073E0(0); + if (showWhichWindow) { + sub_80073B8(1); + PrintFormattedStringOnWindow(4, 2, gWhichTextPtr1, 1, 0); + sub_80073E0(1); + } +} + +static s32 sub_8060800(WindowHeader *a0, s32 a1) +{ + s32 i, r1, r2, r3; + + r1 = 0; + for (i = 0; i < sUnknown_202F258; i++) { + if (sUnknown_202F248[i] <= 1) { + r1++; + } + } + + if (sUnknown_202F248[a1] <= 1) { + r3 = a1; + r2 = r1; + r1 = 0; + } + else { + r3 = a1 - r1; + r2 = sUnknown_202F258 - r1; + } + + if (a0 != NULL) { + a0->count = r2; + a0->currId = r3; + a0->f3 = 0; + } + + return r1; +} + +static bool8 sub_8060860(s32 a0) +{ + if (gDungeonMenu.unk1A <= 1 || sUnknown_202F248[a0] > 1) + return FALSE; + else + return TRUE; +} + +static void sub_8060890(DungeonPos *a0) +{ + s32 var = sUnknown_202F248[gDungeonMenu.unk1E]; + switch (var) + { + case 0: + sUnknownActionUnk4.actionUseIndex = gDungeonMenu.menuIndex + 1; + break; + case 1: + sUnknownActionUnk4.actionUseIndex = gDungeonMenu.menuIndex + 11; + break; + case 2: + sUnknownActionUnk4.actionUseIndex = 128; + break; + default: + sUnknownActionUnk4.actionUseIndex = var - 116; + break; + } + + sUnknownActionUnk4.itemPos.x = a0->x; + sUnknownActionUnk4.itemPos.y = a0->y; +} + +static void sub_8060900(Entity *a0) +{ + u16 val_sub8044DC8; + Item *item = sub_8044CC8(a0, &sUnknownActionUnk4, 0xA); + EntityInfo *a0Info = GetEntInfo(a0); + + gDungeonSubMenuItemsCount = 0; + if (sUnknownActionUnk4.actionUseIndex < 144) { + if (sUnknownActionUnk4.actionUseIndex == 128) { + AddActionToDungeonSubMenu(9, item->id); + if (GetItemCategory(item->id) != CATEGORY_POKE) { + bool32 r2 = 0; + if (gDungeon->unk644.unk17 != 0) { + if (gTeamInventoryRef->teamItems[INVENTORY_SIZE - 1].flags & ITEM_FLAG_EXISTS) { + r2 = TRUE; + } + } + else if (a0Info->heldItem.flags & ITEM_FLAG_EXISTS) { + r2 = TRUE; + } + + if (r2) { + SetActionUnusableInDungeonSubMenu(9); + } + } + } + if (sUnknownActionUnk4.actionUseIndex == 128 && gDungeon->unk644.unk17 != 0) { + AddActionToDungeonSubMenu(10, item->id); + } + val_sub8044DC8 = sub_8044DC8(item); + if (val_sub8044DC8 != 0) { + AddActionToDungeonSubMenu(val_sub8044DC8, item->id); + if (item->flags & ITEM_FLAG_STICKY) { + SetActionUnusableInDungeonSubMenu(val_sub8044DC8); + } + if (!sub_8046F00(item)) { + SetActionUnusableInDungeonSubMenu(val_sub8044DC8); + } + } + + if (sUnknownActionUnk4.actionUseIndex <= 20 + && (GetItemCategory(item->id) == CATEGORY_THROWN_LINE || GetItemCategory(item->id) == CATEGORY_THROWN_ARC)) + { + s32 i; + + if (ItemSet(item)) { + AddActionToDungeonSubMenu(0x3D, item->id); + } + else { + AddActionToDungeonSubMenu(0x3C, item->id); + } + + for (i = 0; i < INVENTORY_SIZE; i++) { + if (ItemExists(&gTeamInventoryRef->teamItems[i]) + && ItemSet(&gTeamInventoryRef->teamItems[i]) + && ItemSticky(&gTeamInventoryRef->teamItems[i])) + { + SetActionUnusableInDungeonSubMenu(0x3C); + SetActionUnusableInDungeonSubMenu(0x3D); + break; + } + } + } + + if (sUnknownActionUnk4.actionUseIndex != 129) { + if (sUnknownActionUnk4.actionUseIndex != 128) { + s32 i; + bool32 r8 = FALSE; + + AddActionToDungeonSubMenu(0x36, item->id); + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + EntityInfo *teamMonInfo = GetEntInfo(teamMon); + teamMonInfo->unk157 = FALSE; + if (!CheckVariousConditions(teamMon)) { + r8 = TRUE; + teamMonInfo->unk157 = TRUE; + } + } + } + if (!r8) { + SetActionUnusableInDungeonSubMenu(0x36); + } + } + } + else if (gDungeon->unk644.unk17) { + if (gTeamInventoryRef->teamItems[INVENTORY_SIZE - 1].flags & ITEM_FLAG_EXISTS) { + AddActionToDungeonSubMenu(0x3E, item->id); + } + else { + AddActionToDungeonSubMenu(0x37, item->id); + } + + if (CheckVariousConditions(a0)) { + SetActionUnusableInDungeonSubMenu(0x37); + SetActionUnusableInDungeonSubMenu(0x3E); + } + } + + if (sUnknownActionUnk4.actionUseIndex <= 20) { + Entity *tileEntity = GetTile(a0->pos.x, a0->pos.y)->object; + if (tileEntity == NULL) { + AddActionToDungeonSubMenu(8, item->id); + } + else if (GetEntityType(tileEntity) == ENTITY_ITEM) { + AddActionToDungeonSubMenu(0x3A, item->id); + } + } + + if (GetItemCategory(item->id) == CATEGORY_THROWN_LINE) { + AddActionToDungeonSubMenu(0x27, item->id); + } + else if (GetItemCategory(item->id) == CATEGORY_THROWN_ARC) { + AddActionToDungeonSubMenu(0x41, item->id); + } + else { + AddActionToDungeonSubMenu(0xB, item->id); + } + + if (!MonsterCanThrowItems(a0Info)) { + SetActionUnusableInDungeonSubMenu(0x27); + SetActionUnusableInDungeonSubMenu(0x41); + SetActionUnusableInDungeonSubMenu(0xB); + } + } + else { + s32 index = sUnknownActionUnk4.actionUseIndex - 144; + Entity *teamMon = gDungeon->teamPokemon[index]; + if (EntityIsValid(teamMon)) { + bool32 r5, r6, r4; + EntityInfo *teamMonInfo = GetEntInfo(teamMon); + + r5 = FALSE; + if (CheckVariousConditions(teamMon)) + r6 = TRUE; + else + r6 = FALSE; + + if (gTeamInventoryRef->teamItems[INVENTORY_SIZE - 1].flags & ITEM_FLAG_EXISTS) + r4 = TRUE; + else + r4 = FALSE; + + if (GetItemCategory(item->id) == CATEGORY_TMS_HMS) r5 = TRUE; + if (GetItemCategory(item->id) == CATEGORY_ORBS) r5 = TRUE; + + if (gDungeon->unk644.unk17) { + if (r4) { + AddActionToDungeonSubMenu(0x3E, item->id); + } + else { + AddActionToDungeonSubMenu(0x37, item->id); + } + + if (r6) { + SetActionUnusableInDungeonSubMenu(0x37); + SetActionUnusableInDungeonSubMenu(0x3E); + } + } + + if (teamMonInfo->isTeamLeader) { + val_sub8044DC8 = sub_8044DC8(item); + if (val_sub8044DC8 != 0) { + AddActionToDungeonSubMenu(val_sub8044DC8, item->id); + if (item->flags & ITEM_FLAG_STICKY) { + SetActionUnusableInDungeonSubMenu(val_sub8044DC8); + } + if (!sub_8046F00(item)) { + SetActionUnusableInDungeonSubMenu(val_sub8044DC8); + } + } + } + else { + AddActionToDungeonSubMenu(0x38, item->id); + if (r5) { + SetActionUnusableInDungeonSubMenu(0x38); + } + } + } + } + + AddActionToDungeonSubMenu(0xC, item->id); + sub_8045064(); +} + +static void ChosenSubMenuToAction(ActionContainer *a0) +{ + SetMonsterActionFields(a0, gDungeonSubMenu[gDungeonMenu.menuIndex].actionId); + a0->actionParameters[0] = sUnknownActionUnk4; + a0->actionParameters[1].actionUseIndex = 0; + a0->actionParameters[1].itemPos.x = 0; + a0->actionParameters[1].itemPos.y = 0; +} + +void sub_8060D24(UNUSED ActionContainer *a0) +{ + Item *item = sub_8044D90(GetLeader(), 0, 0xB); + DungeonShowWindows(NULL, 0); + sub_801B3C0(item); + + do { + DungeonRunFrameActions(0x16); + } while (sub_801B410() == 0); + + sub_801B450(); + sub_803EAF0(0, NULL); +} + +static s32 sub_8060D64(s16 *a0, bool8 a1, bool8 a2, bool8 a3, Entity *a4) +{ + s32 i; + s32 count = 0; + + if (gDungeon->unk644.unk17 && !a1) { + if (gTeamInventoryRef->teamItems[0].flags & ITEM_FLAG_EXISTS) { + a0[count++] = 0; + } + if (gTeamInventoryRef->teamItems[INVENTORY_SIZE / 2].flags & ITEM_FLAG_EXISTS) { + a0[count++] = 1; + } + } + + if (a2 && PosHasItem(&a4->pos)) { + a0[count++] = 2; + } + + if (!a1 && !a3) { + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon) && GetEntInfo(teamMon)->heldItem.flags & ITEM_FLAG_EXISTS) { + a0[count++] = i + MAX_TEAM_MEMBERS; + } + } + } + + return count; +} diff --git a/src/dungeon_menu_moves.c b/src/dungeon_menu_moves.c new file mode 100644 index 000000000..7fadce616 --- /dev/null +++ b/src/dungeon_menu_moves.c @@ -0,0 +1,1192 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_moves.h" +#include "dungeon_menu_team.h" +#include "dungeon_submenu.h" +#include "structs/str_dungeon.h" +#include "input.h" +#include "structs/map.h" +#include "dungeon_main.h" +#include "dungeon_message.h" +#include "dungeon_action.h" +#include "dungeon_random.h" +#include "dungeon_util.h" +#include "pokemon.h" +#include "moves.h" +#include "dungeon_music.h" +#include "code_8045A00.h" +#include "string_format.h" +#include "code_803E46C.h" +#include "status_checks_1.h" +#include "dungeon_leader.h" +#include "tile_types.h" +#include "dungeon_visibility.h" +#include "dungeon_movement.h" +#include "menu_input.h" +#include "music.h" +#include "text.h" +#include "code_8044CC8.h" +#include "move_util.h" + +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void PlayDungeonCursorSE(u8 param_1); +extern u8 *GetDungeonSubMenuItemString(s32 param_1); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern void sub_8045064(void); +extern void sub_803EAF0(u32, u8 *); +extern void sub_803E708(s32 a0, s32 a1); +extern void AddActionToDungeonSubMenu(u16 param_1, u8 param_2); +extern void SetActionUnusableInDungeonSubMenu(u16 param_1); +extern void DungeonShowWindows(WindowTemplates *a0, u8 a1); +extern s32 GetTeamMemberEntityIndex(Entity *pokemon); +extern void ChangeDungeonCameraPos(DungeonPos *pos, s32 a1, u8 a2, u8 a3); +extern void SetLeaderActionToNothing(u8 a0); +extern void sub_806752C(ActionContainer *a0); +extern void ShowDungeonSummaryOrIQMenu(ActionContainer *a0, bool8 a1); +extern void sub_8067768(ActionContainer *a0); +extern void sub_806A2BC(Entity *a0, u8 a1); +extern bool8 sub_8071A8C(Entity *pokemon); +extern void sub_8083D1C(void); +extern s32 ActionToDungeonSubMenuId(u16 param_1); + +extern s32 gDungeonSubMenuItemsCount; +extern MenuInputStruct gDungeonMenu; + +extern const u8 *const gUnknown_80FE978; +extern const u8 *const gUnknown_80FDFE8; +extern const u8 *const gUnknown_80F8B40; +extern const u8 *const gUnknown_80F8B64; +extern const u8 *const gUnknown_80F8BB4; +extern const u8 *const gUnknown_80F8B88; +extern const u8 *const gUnknown_80FDF70; +extern const u8 *const gUnknown_80FDF00; + +static void ShowMovesMenuWindows(Entity *entity, EntityInfo *entInfo, u8 a2, WindowTemplates *windows, WindowHeader *header, u8 *arg5, s32 arg6, s32 arg7); +static void AddMovesSubMenuOptions(Entity *entity, bool8 addLinkOptions, bool8 addUseMove); +static void SetSubMenuOptionAction(ActionContainer *a0, s32 a1, s32 a2); +static void MenuChosenOptionToAction(ActionContainer *a0, s32 a1); +static void PrintMoveNamesOnWindow(s32 count, Entity *entity, Move *moves, s32 windowId, u8 a4, s32 a5); +static bool8 IsMoveLinkedAndNotCharging(EntityInfo *entInfo, s32 moveId_); +static bool8 IsMoveLinked(EntityInfo *entInfo, s32 id); +static void ShowMovesInfoWindow(Move *moves, s32 firstMoveId, s32 movesCount); +static void sub_8064228(Entity *entity, Move *moves, WindowTemplates *windows, WindowHeader *header); +static void sub_8064310(Move *moves); +static bool8 sub_8064358(Move *moves, s32 id); + +EWRAM_DATA static WindowTemplates sMovesMenuWindows = {0}; +EWRAM_DATA static s32 sChosenMoveSlotId = 0; + +// Needed to match some functions. +static inline u32 CheckPressed(u32 button) +{ + u32 check = button; + check &= gRealInputs.pressed; + return check; +} + +// In Blue it's 0x401, so A_BUTTON + 0x400 whatever that is +static u32 GetConfirmationButtons(void) +{ + return A_BUTTON; +} + +void ShowMovesFromTeamMenu(ActionContainer *a0) +{ + s32 id = a0->actionParameters[0].actionUseIndex; + Entity *entityOrg = gDungeon->teamPokemon[id]; + Entity *entityNew = entityOrg; + + while (1) { + s32 i, count, countUntilId; + + countUntilId = 0; + count = 0; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + if (sub_8071A8C(gDungeon->teamPokemon[i])) { + if (i == id) { + countUntilId = count; + } + count++; + } + } + + sub_806A2BC(entityNew, 0); + ChangeDungeonCameraPos(&entityNew->pos, 0, 1, 1); + SetLeaderActionToNothing(1); + if (ShowDungeonMovesMenu(entityNew, 0, 1, countUntilId, count)) { + return; + } + + if (GetLeaderActionId() == ACTION_MOVES_MENU_NEXT_MON) { + s32 idBefore = id; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + if (++id >= MAX_TEAM_MEMBERS) { + id = 0; + } + entityNew = gDungeon->teamPokemon[id]; + if (sub_8071A8C(entityNew)) { + break; + } + } + + a0->actionParameters[0].actionUseIndex = id; + if (idBefore != id) { + PlayDungeonCursorSE(0); + } + SetLeaderActionToNothing(TRUE); + } + // Everything is the same as in the above if except for add/sub difference. + else if (GetLeaderActionId() == ACTION_MOVES_MENU_PREV_MON) { + s32 idBefore = id; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + if (--id < 0) { + id = MAX_TEAM_MEMBERS - 1; + } + entityNew = gDungeon->teamPokemon[id]; + if (sub_8071A8C(entityNew)) { + break; + } + } + + a0->actionParameters[0].actionUseIndex = id; + if (idBefore != id) { + PlayDungeonCursorSE(0); + } + SetLeaderActionToNothing(TRUE); + } + else if (GetLeaderActionId() == ACTION_MOVE_INFO) { + ActionShowMoveInfo(GetLeaderActionContainer()); + SetLeaderActionToNothing(TRUE); + } + else if (GetLeaderActionId() == ACTION_SET_MOVE) { + sub_803EAF0(0, NULL); + ActionSetOrUnsetMove(GetLeaderActionContainer(), TRUE); + SetLeaderActionToNothing(TRUE); + } + else if (GetLeaderActionId() == ACTION_UNSET_MOVE) { + sub_803EAF0(0, NULL); + ActionSetOrUnsetMove(GetLeaderActionContainer(), FALSE); + SetLeaderActionToNothing(TRUE); + } + else if (GetLeaderActionId() == ACTION_SWITCH_AI_MOVE) { + sub_803EAF0(0, NULL); + ActionToggleMoveUsableForAi(GetLeaderActionContainer()); + SetLeaderActionToNothing(TRUE); + } + else if (GetLeaderActionId() == ACTION_DELINK_MOVES) { + sub_803EAF0(0, NULL); + ActionDelinkMoves(GetLeaderActionContainer(), TRUE); + SetLeaderActionToNothing(TRUE); + } + + if (GetLeaderActionId() != ACTION_NOTHING) + break; + } + + sub_806A2BC(entityOrg, 0); + ChangeDungeonCameraPos(&entityOrg->pos, 0, 1, 1); +} + +bool8 ShowDungeonMovesMenu(Entity * entity, bool8 addLinkOptions, bool8 addUseMove, s32 a3, s32 a4) +{ + s32 i; + bool8 ret; + EntityInfo *entInfo = GetEntInfo(entity); + bool8 unkBool = TRUE; + EntityInfo *leaderInfo = GetEntInfo(GetLeader()); + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + u8 unk[4]; + bool8 r10; + s32 r5; + bool8 bPress; + + sChosenMoveSlotId = 0; + for (i = 0; i < MAX_MON_MOVES; i++) { + Move *move = &entInfo->moves.moves[i]; + + if (MoveFlagExists(move) && move->moveFlags2 & 2) { + move->moveFlags2 &= ~(2); + sChosenMoveSlotId = i; + } + } + + while (1) { + r5 = 0; + ret = FALSE; + r10 = FALSE; + ShowMovesMenuWindows(entity, entInfo, addLinkOptions, &windows, &header, unk, a3, a4); + while (1) { + AddMenuCursorSprite_(&gDungeonMenu, unk); + DungeonRunFrameActions(0x1E); + if (gRealInputs.repeated & DPAD_DOWN) { + bool8 rHeld = (gRealInputs.held & R_BUTTON) != 0; + s32 id = gDungeonMenu.menuIndex; + + if (rHeld) { + sChosenMoveSlotId = unk_SetMoveToLastInLinkedSequence4(entInfo->moves.moves, id); + if (id != sChosenMoveSlotId) { + PlayDungeonCursorSE(0); + } + else { + PlayDungeonCancelSE(); + } + r10 = TRUE; + break; + } + else { + sub_8013780(&gDungeonMenu, unk_FindMoveEnabledForAIAfter4(entInfo->moves.moves, id)); + if (id != gDungeonMenu.menuIndex) { + PlayDungeonCursorSE(0); + } + } + } + if (gRealInputs.repeated & DPAD_UP) { + bool8 rHeld = (gRealInputs.held & R_BUTTON) != 0; + s32 id = gDungeonMenu.menuIndex; + + if (rHeld) { + sChosenMoveSlotId = unk_SetMoveToFirstInLinkedSequence4(entInfo->moves.moves, id); + if (id != sChosenMoveSlotId) { + PlayDungeonCursorSE(0); + } + else { + PlayDungeonCancelSE(); + } + r10 = TRUE; + break; + } + else { + sub_8013780(&gDungeonMenu, sub_8092DB8(entInfo->moves.moves, id)); + if (id != gDungeonMenu.menuIndex) { + PlayDungeonCursorSE(0); + } + } + } + + if ((gRealInputs.repeated & DPAD_RIGHT) || gDungeonMenu.unk28.dpad_right) { + SetMonsterActionFields(&leaderInfo->action, 6); + break; + } + if ((gRealInputs.repeated & DPAD_LEFT) || gDungeonMenu.unk28.dpad_left) { + SetMonsterActionFields(&leaderInfo->action, 7); + break; + } + + if ((gRealInputs.pressed & GetConfirmationButtons()) || gDungeonMenu.unk28.a_button) { + if (addLinkOptions) { + bool8 rHeld = (gRealInputs.held & R_BUTTON) != 0; + if (rHeld) { + r5 = 3; + } + } + PlayDungeonConfirmationSE(); + break; + } + + if (gRealInputs.pressed & START_BUTTON) { + r5 = 1; + PlayDungeonStartButtonSE(); + break; + } + if (gRealInputs.pressed & SELECT_BUTTON) { + r5 = 2; + PlayDungeonStartButtonSE(); + break; + } + + if (CheckPressed(B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + ret = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1E); + if (leaderInfo->action.action == 6 || leaderInfo->action.action == 7) { + unkBool = FALSE; + break; + } + + if (r10) + continue; + if (ret) + break; + + sChosenMoveSlotId = gDungeonMenu.menuIndex; + if (r5 == 1) { + SetMonsterActionFields(&leaderInfo->action, 0x1D); + leaderInfo->action.actionParameters[0].actionUseIndex = entity->unk24; + leaderInfo->action.actionParameters[1].actionUseIndex = sChosenMoveSlotId; + sub_803EAF0(0, NULL); + sub_803E708(8, 0x1B); + ret = FALSE; + break; + } + + AddMovesSubMenuOptions(entity, addLinkOptions, addUseMove); + if (r5 == 3) { + s32 subMenuId = ActionToDungeonSubMenuId(ACTION_LINK_MOVES); + if (!CanSubMenuItemBeChosen(subMenuId)) { + subMenuId = ActionToDungeonSubMenuId(ACTION_DELINK_MOVES); + if (CanSubMenuItemBeChosen(subMenuId)) { + SetSubMenuOptionAction(&leaderInfo->action, subMenuId, GetTeamMemberEntityIndex(entity)); + break; + } + } + else { + SetSubMenuOptionAction(&leaderInfo->action, subMenuId, GetTeamMemberEntityIndex(entity)); + break; + } + } + else if (r5 == 2) { + if (entInfo->isTeamLeader) { + s32 subMenuId = ActionToDungeonSubMenuId(ACTION_SET_MOVE); + if (!CanSubMenuItemBeChosen(subMenuId)) { + subMenuId = ActionToDungeonSubMenuId(ACTION_UNSET_MOVE); + if (CanSubMenuItemBeChosen(subMenuId)) { + SetSubMenuOptionAction(&leaderInfo->action, subMenuId, GetTeamMemberEntityIndex(entity)); + break; + } + } + else { + SetSubMenuOptionAction(&leaderInfo->action, subMenuId, GetTeamMemberEntityIndex(entity)); + break; + } + } + else { + s32 subMenuId = ActionToDungeonSubMenuId(ACTION_SWITCH_AI_MOVE); + if (CanSubMenuItemBeChosen(subMenuId)) { + SetSubMenuOptionAction(&leaderInfo->action, subMenuId, GetTeamMemberEntityIndex(entity)); + break; + } + } + } + + sub_8009524(2); + CreateDungeonMenuSubWindow(&windows.id[0], 0x16); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & GetConfirmationButtons()) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + MenuChosenOptionToAction(&leaderInfo->action, GetTeamMemberEntityIndex(entity)); + if (leaderInfo->action.action != 20 && leaderInfo->action.action != 21) { + PlayDungeonConfirmationSE(); + } + bPress = FALSE; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + if (bPress != TRUE) { + ret = 0; + break; + } + } + + if (unkBool) { + sub_803EAF0(0, NULL); + sub_803E708(8, 0x1E); + } + + return ret; +} + +static void ShowMovesMenuWindows(Entity *entity, EntityInfo *entInfo, u8 a2, WindowTemplates *windows, WindowHeader *header, u8 *arg5, s32 arg6, s32 arg7) +{ + s32 i, movesCount; + WindowTemplate windowNew = { + .type = WINDOW_TYPE_NORMAL, + .pos = {2, 14}, + .width = 26, + .height = 3, + .unk10 = 3, + .unk12 = 0, + .header = NULL, + }; + + header->count = arg7; + header->currId = arg6; + header->f3 = 0; + + movesCount = 0; + for (i = 0; i < MAX_MON_MOVES; i++) { + Move *move = &entInfo->moves.moves[i]; + if (MoveFlagExists(move)) { + movesCount++; + } + } + + gDungeonMenu.menuIndex = sChosenMoveSlotId; + gDungeonMenu.unk1A = movesCount; + gDungeonMenu.unk1C = 4; + gDungeonMenu.unk1E = arg6; + gDungeonMenu.unk20 = arg7; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + + windows->id[0].height = windows->id[0].unk10 = sub_80095E4(4, 0xC) + 2; + header->width = 13; + windows->id[0].pos.x = 2; + windows->id[1] = windows->id[3]; + windows->id[2] = windowNew; + DungeonShowWindows(windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + gDungeonMenu.unkC = (gWindows[0].x + 16) * 8; + gDungeonMenu.unkE = ((gWindows[0].y + 1) * 8) - 2; + SetMessageArgument_2(gFormatBuffer_Monsters[0], entInfo, 0); + for (i = 0; i < MAX_MON_MOVES; i++) { + Move *move = &entInfo->moves.moves[i]; + + arg5[i] = 0; + if (!MoveFlagExists(move)) { + if (gDungeonMenu.menuIndex == i) { + gDungeonMenu.menuIndex = 0; + } + } + else if (MoveFlagLinkChain(move)) { + arg5[i] = 1; + } + } + + PrintMoveNamesOnWindow(4, entity, entInfo->moves.moves, 0, a2, arg6); + sub_80073B8(2); + PrintFormattedStringOnWindow(4, 0, gUnknown_80FDFE8, 2, '\0'); + sub_80073E0(2); +} + +static void PrintMoveNamesOnWindow(s32 count, Entity *entity, Move *moves, s32 windowId, u8 a4, s32 a5) +{ + s32 i; + EntityInfo *entInfo = GetEntInfo(entity); + + sub_80073B8(windowId); + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], entity, 0); + PrintFormattedStringOnWindow((a5 * 8) + 10, 0, gUnknown_80FE978, windowId, '\0'); + for (i = 0; i < count; i++) { + s32 x, y; + unkStruct_80928C0 movStruct = {0, 106, 0, a4}; + Move *move = &moves[i]; + + if (MoveFlagExists(move)) { + if (entInfo->isTeamLeader) { + movStruct.unk0 = 2; + } + else { + movStruct.unk0 = 4; + } + + movStruct.unk8 = (CanMonsterUseMove(entity, move, TRUE) == FALSE); + BufferMoveName(gFormatBuffer_Items[0], move, &movStruct); + y = GetMenuEntryYCoord(&gDungeonMenu, i); + if (MoveFlagLinkChain(move)) { + x = 13; + } + else { + x = 8; + if (i != 0) { + AddDoubleUnderScoreHighlight(windowId, 12, y - 2, 120, 7); + } + } + PrintFormattedStringOnWindow(x, y, _("{MOVE_ITEM_0}"), windowId, '\0'); + } + } + + sub_80073E0(windowId); +} + +static void AddMovesSubMenuOptions(Entity *entity, bool8 addLinkOptions, bool8 addUseMove) +{ + EntityInfo *entInfo = GetEntInfo(entity); + Move *move = &entInfo->moves.moves[sChosenMoveSlotId]; + + gDungeonSubMenuItemsCount = 0; + if (entInfo->isTeamLeader) { + if (addUseMove) { + AddActionToDungeonSubMenu(ACTION_USE_MOVE_PLAYER, 0); + } + if (MoveFlagExists(move)) { + if (MoveFlagSet(move)) { + AddActionToDungeonSubMenu(ACTION_UNSET_MOVE, 0); + } + else { + AddActionToDungeonSubMenu(ACTION_SET_MOVE, 0); + } + } + } + else { + AddActionToDungeonSubMenu(ACTION_SWITCH_AI_MOVE, 0); + } + + if (addLinkOptions) { + AddActionToDungeonSubMenu(ACTION_LINK_MOVES, 0); + AddActionToDungeonSubMenu(ACTION_DELINK_MOVES, 0); + } + AddActionToDungeonSubMenu(ACTION_MOVE_INFO, 0); + if (!addLinkOptions) { + SetActionUnusableInDungeonSubMenu(ACTION_LINK_MOVES); + } + else { + if (!IsMoveLinkedAndNotCharging(entInfo, sChosenMoveSlotId)) { + SetActionUnusableInDungeonSubMenu(ACTION_LINK_MOVES); + } + if (!IsMoveLinked(entInfo, sChosenMoveSlotId)) { + SetActionUnusableInDungeonSubMenu(ACTION_DELINK_MOVES); + } + } + + if (!IsMoveLinked(entInfo, sChosenMoveSlotId)) { + SetActionUnusableInDungeonSubMenu(ACTION_DELINK_MOVES); + } + + if (addUseMove) { + bool8 moveUnusable = FALSE; + if (sChosenMoveSlotId < MAX_MON_MOVES) { + moveUnusable = CanAIUseMove(entity, sChosenMoveSlotId, TRUE) != FALSE; + } + if (!moveUnusable) { + SetActionUnusableInDungeonSubMenu(ACTION_USE_MOVE_PLAYER); + } + } + + sub_8045064(); +} + +static void MenuChosenOptionToAction(ActionContainer *a0, s32 teamId) +{ + SetSubMenuOptionAction(a0, gDungeonMenu.menuIndex, teamId); +} + +static void SetSubMenuOptionAction(ActionContainer *a0, s32 subMenuOptionId, s32 teamId) +{ + SetMonsterActionFields(a0, gDungeonSubMenu[subMenuOptionId].actionId); + a0->actionParameters[0].actionUseIndex = teamId; + a0->actionParameters[1].actionUseIndex = sChosenMoveSlotId; +} + +void ActionShowMoveInfo(ActionContainer *a0) +{ + Entity *mon = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + EntityInfo *monInfo = GetEntInfo(mon); + + monInfo->moves.moves[a0->actionParameters[1].actionUseIndex].moveFlags2 |= 2; + ShowMovesInfoWindow(monInfo->moves.moves, a0->actionParameters[1].actionUseIndex, MAX_MON_MOVES); +} + +static void ShowMovesInfoWindow(Move *moves, s32 firstMoveId, s32 movesCount) +{ + WindowTemplates windows; + WindowHeader header; + struct subStruct_203B240 *statuses[4]; + s32 i, count, currId; + + sub_80140B4(&windows); + windows.id[0].header = &header; + + count = 1; + for (i = firstMoveId + 1; i < movesCount; i++) { + if (!MoveFlagExists(&moves[i])) + break; + if (!MoveFlagLinkChain(&moves[i])) + break; + count++; + } + + currId = 0; + while (1) { + s32 statusesCount; + s32 inputAction = 0; + + header.count = count; + header.currId = currId; + header.width = 12; + header.f3 = 0; + + gDungeonMenu.unk1E = currId; + gDungeonMenu.unk20 = count; + gDungeonMenu.unkC = (gWindows[0].x + 23) * 8; + gDungeonMenu.unkE = ((gWindows[0].y + 1) * 8) - 2; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1A = 0; + gDungeonMenu.unk1C = 0; + DungeonShowWindows(&windows, TRUE); + statusesCount = unk_PrintMoveDescription(currId, &moves[firstMoveId + currId], 0, statuses); + while (1) { + if (statusesCount != 0) { + ShowStatusDescriptionMenuArrow(); + } + + nullsub_34(&gDungeonMenu.unk28, 0); + DungeonRunFrameActions(0x1C); + + if ((gRealInputs.pressed & GetConfirmationButtons()) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + inputAction = 1; + if (statusesCount != 0) { + inputAction = 2; + } + } + else if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + inputAction = 1; + } + else if ((gRealInputs.pressed & DPAD_LEFT) || gDungeonMenu.unk28.dpad_left) { + s32 prevId = currId; + if (currId == 0) { + currId = count; + } + currId--; + if (prevId != currId) { + PlayDungeonCursorSE(FALSE); + } + } + else if ((CheckPressed(DPAD_RIGHT)) || gDungeonMenu.unk28.dpad_right) { + s32 prevId = currId; + if (currId == count - 1) { + currId = 0; + } + else { + currId++; + } + if (prevId != currId) { + PlayDungeonCursorSE(FALSE); + } + } + else { + continue; + } + + break; + } + + if (inputAction == 1) + break; + + if (inputAction != 0 && statusesCount != 0) { + ShowStatusesDescriptionMenu(statusesCount, statuses); + } + } + + sub_803EAF0(0, 0); +} + +static const WindowHeader sStatusDescriptionHeader = { + .count = 1, + .width = 16, +}; + +void ShowStatusDescriptionMenu(struct subStruct_203B240 *status, MenuInputStructSub *menuSub) +{ + sub_80140B4(&sMovesMenuWindows); + sMovesMenuWindows.id[0].header = &sStatusDescriptionHeader; + DungeonShowWindows(&sMovesMenuWindows, TRUE); + sub_80073B8(0); + + strcpy(gFormatBuffer_Monsters[0], status->pokeName); + PrintFormattedStringOnWindow(16, 0, _("{POKEMON_0}"), 0, '\0'); + PrintFormattedStringOnWindow(4, 16, status->unk4, 0, '\0'); + sub_80073E0(0); + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk0 = 0; + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1A = 0; + gDungeonMenu.unk1C = 0; + sub_801317C(menuSub); +} + +void ActionSetOrUnsetMove(ActionContainer *a0, bool8 flagToSet) +{ + s32 i; + Entity *entity = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + EntityInfo *entInfo = GetEntInfo(entity); + Move *move = &entInfo->moves.moves[a0->actionParameters[1].actionUseIndex]; + bool8 wasSet = MoveFlagSet(move) != 0; + + for (i = 0; i < MAX_MON_MOVES; i++) { + if (MoveFlagExists(&entInfo->moves.moves[i])) { + entInfo->moves.moves[i].moveFlags &= ~(MOVE_FLAG_SET); + } + } + + BufferMoveName(gFormatBuffer_Items[0], move, NULL); + if (!wasSet) { + move->moveFlags |= MOVE_FLAG_SET; + } + unk_FixLinkedMovesSetEnabled4(entInfo->moves.moves); + move->moveFlags2 |= 2; + PlaySoundEffect(0x133); + if (flagToSet) { + if (!wasSet) { + LogMessageByIdWithPopupCheckUser(entity, gUnknown_80F8B40); + } + else { + LogMessageByIdWithPopupCheckUser(entity, gUnknown_80F8B64); + } + sub_803E708(0x78, 0x1F); + } +} + +void ActionToggleMoveUsableForAi(ActionContainer *a0) +{ + Entity *entity = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + EntityInfo *entInfo = GetEntInfo(entity); + Move *move = &entInfo->moves.moves[a0->actionParameters[1].actionUseIndex]; + + BufferMoveName(gFormatBuffer_Items[0], move, NULL); + move->moveFlags ^= MOVE_FLAG_ENABLED_FOR_AI; + unk_FixLinkedMovesSetEnabled4(entInfo->moves.moves); + move->moveFlags2 |= 2; + PlaySoundEffect(0x133); +} + +void ActionLinkMoves(ActionContainer *a0) +{ + s32 linkedCount; + Entity *entity = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + EntityInfo *entInfo = GetEntInfo(entity); + s32 id = a0->actionParameters[1].actionUseIndex; + + BufferMoveName(gFormatBuffer_Items[0], &entInfo->moves.moves[id], NULL); + entInfo->moves.moves[id].moveFlags2 |= 2; + linkedCount = 0; + for (id++; id < MAX_MON_MOVES; id++) { + if (!MoveFlagExists(&entInfo->moves.moves[id])) + break; + if (!MoveFlagLinkChain(&entInfo->moves.moves[id])) + break; + if (++linkedCount >= MAX_MON_MOVES) + break; + } + + if (!MoveFlagExists(&entInfo->moves.moves[id])) + id = MAX_MON_MOVES; + + if (id < MAX_MON_MOVES) { + Move *move = &entInfo->moves.moves[id]; + move->moveFlags |= MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN; + BufferMoveName(gFormatBuffer_Items[1], move, NULL); + } + unk_FixLinkedMovesSetEnabled4(entInfo->moves.moves); + PlaySoundEffect(0x133); +} + +static bool8 IsMoveLinkedAndNotCharging(EntityInfo *entInfo, s32 moveId_) +{ + s32 i; + bool8 ret = FALSE; + s32 moveId = moveId_; + + if (DoesMoveCharge(entInfo->moves.moves[moveId].id)) + return FALSE; + + moveId++; + for (i = 0; i < MAX_MON_MOVES; i++) { + Move *move = &entInfo->moves.moves[moveId]; + + if (DoesMoveCharge(move->id)) + return FALSE; + + if (!MoveFlagExists(move)) + break; + if (!MoveFlagLinkChain(move)) { + ret = TRUE; + break; + } + if (++moveId >= MAX_MON_MOVES) + break; + } + + return ret; +} + +void ActionDelinkMoves(ActionContainer *a0, bool8 showMsg) +{ + s32 linkedCount; + Entity *entity = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + EntityInfo *entInfo = GetEntInfo(entity); + s32 id = a0->actionParameters[1].actionUseIndex; + bool8 unlInked = FALSE; + + BufferMoveName(gFormatBuffer_Items[0], &entInfo->moves.moves[id], NULL); + entInfo->moves.moves[id].moveFlags2 |= 2; + + id++; + for (linkedCount = 0; linkedCount < MAX_MON_MOVES && id < MAX_MON_MOVES; id++, linkedCount++) { + Move *move = &entInfo->moves.moves[id]; + if (MoveFlagLinkChain(move)) { + move->moveFlags &= ~(MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN); + unlInked = TRUE; + } + else { + break; + } + } + + unk_FixLinkedMovesSetEnabled4(entInfo->moves.moves); + PlaySoundEffect(0x133); + if (showMsg) { + if (unlInked) { + LogMessageByIdWithPopupCheckUser(entity, gUnknown_80F8B88); + } + else { + LogMessageByIdWithPopupCheckUser(entity, gUnknown_80F8BB4); + } + sub_803E708(0x78, 0x1F); + } +} + +static bool8 IsMoveLinked(EntityInfo *entInfo, s32 id) +{ + bool8 linkFound = FALSE; + s32 linkedCount; + + id++; + for (linkedCount = 0; linkedCount < MAX_MON_MOVES && id < MAX_MON_MOVES; linkedCount++) { + Move *move = &entInfo->moves.moves[id]; + + if (MoveFlagLinkChain(move)) { + linkFound = TRUE; + id++; + } + else { + break; + } + } + + if (linkFound) + return TRUE; + return FALSE; +} + +static void sub_8063E30(Move *moves, s32 id) +{ + s32 i; + + id++; + for (i = 0; i < 8 && id < 8; id++, i++) { + if (MoveFlagLinkChain(&moves[id])) { + moves[id].moveFlags &= ~(MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN); + } + else { + break; + } + } + + unk_FixLinkedMovesSetEnabled8(moves); +} + +static inline void ResetMoveFlags(Move *move) +{ + move->moveFlags = 0; +} + +bool8 sub_8063E70(Entity *entity, Move *moves, bool8 showYesNoBox, bool8 allowBPress) +{ + s32 i, count; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + Move movesLocal[8]; + + sChosenMoveSlotId = 0; + while (1) { + s32 inputAction; + s32 yesNoAnswer; + + sub_8064228(entity, moves, &windows, &header); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1E); + if (gRealInputs.repeated & DPAD_DOWN) { + s32 prev = gDungeonMenu.menuIndex; + + sub_8013780(&gDungeonMenu, unk_FindMoveEnabledForAIAfter8(moves, prev)); + if (prev != gDungeonMenu.menuIndex) { + PlayDungeonCursorSE(FALSE); + } + } + if (gRealInputs.repeated & DPAD_UP) { + s32 prev = gDungeonMenu.menuIndex; + + sub_8013780(&gDungeonMenu, unk_FindMoveEnabledForAIBefore8(moves, prev)); + if (prev != gDungeonMenu.menuIndex) { + PlayDungeonCursorSE(FALSE); + } + } + ASM_MATCH_TRICK(sChosenMoveSlotId); + if ((gRealInputs.pressed & GetConfirmationButtons()) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + inputAction = 0; + break; + } + if (gRealInputs.pressed & START_BUTTON) { + PlayDungeonStartButtonSE(); + inputAction = 2; + break; + } + if (allowBPress && (CheckPressed(B_BUTTON) || gDungeonMenu.unk28.b_button)) { + PlayDungeonCancelSE(); + inputAction = 1; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1E); + if (inputAction == 1) { + sChosenMoveSlotId = -1; + } + else { + sChosenMoveSlotId = gDungeonMenu.menuIndex; + + if (inputAction == 2) { + sub_803EAF0(0, 0); + sub_803E708(8, 0x1B); + ASM_MATCH_TRICK(sChosenMoveSlotId); + ShowMovesInfoWindow(moves, sChosenMoveSlotId, MAX_MON_MOVES); + continue; + } + + sub_8064310(moves); + CreateDungeonMenuSubWindow(&windows.id[0], 22); + + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & GetConfirmationButtons()) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + if (gDungeonMenu.menuIndex == 2) { + PlayDungeonConfirmationSE(); + } + else { + sub_8083D1C(); + } + inputAction = 0; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + inputAction = 1; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1b); + sub_803EAF0(0, 0); + if (inputAction == 1) + continue; + if (gDungeonMenu.menuIndex == 1) { + sub_8063E30(moves, sChosenMoveSlotId); + continue; + } + if (gDungeonMenu.menuIndex == 2) { + ShowMovesInfoWindow(moves, sChosenMoveSlotId, 8); + continue; + } + } + + if (sChosenMoveSlotId < 0) + break; + + if (showYesNoBox) { + bool8 linked = FALSE; + Move *move = &moves[sChosenMoveSlotId]; + s32 nextMoveId = sChosenMoveSlotId + 1; + + if (nextMoveId < 8 && MoveFlagExists(&moves[nextMoveId])) { + linked = MoveFlagLinkChain(&moves[nextMoveId]) != 0; + } + BufferMoveName(gFormatBuffer_Items[0], move, NULL); + yesNoAnswer = DisplayDungeonYesNoMessage(NULL, (!linked) ? gUnknown_80FDF70 : gUnknown_80FDF00, FALSE); + } + else { + yesNoAnswer = 1; + } + + if (yesNoAnswer == 1) { + moves[sChosenMoveSlotId].moveFlags = 0; + for (i = sChosenMoveSlotId + 1; i < 8; i++) { + Move *move = &moves[i]; + if (!MoveFlagExists(move)) + break; + if (!(move->moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + break; + + ResetMoveFlags(move); + } + + count = 0; + for (i = 0; i < 8; i++) { + Move *move = &moves[i]; + if (MoveFlagExists(move)) { + movesLocal[count++] = *move; + } + } + + for (; count < 8; count++) { + ResetMoveFlags(&movesLocal[count]); + } + + for (i = 0; i < 8; i++) { + moves[i] = movesLocal[i]; + } + + break; + } + } + + if (sChosenMoveSlotId < 0) + return FALSE; + + return TRUE; +} + +static void sub_8064228(Entity *entity, Move *moves, WindowTemplates *windows, WindowHeader *header) +{ + s32 i, count; + + header->count = 1; + header->currId = 0; + header->f3 = 0; + + count = 0; + for (i = 0; i < 8; i++) { + if (MoveFlagExists(&moves[i])) { + count++; + } + } + + gDungeonMenu.menuIndex = sChosenMoveSlotId; + gDungeonMenu.unk1A = count; + gDungeonMenu.unk1C = count; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows->id[0].height = windows->id[0].unk10 = sub_80095E4(count, 12) + 2; + header->width = 14; + windows->id[0].pos.x = 2; + windows->id[1] = windows->id[3]; + windows->id[2] = windows->id[3]; + DungeonShowWindows(windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + SetMessageArgument_2(gFormatBuffer_Monsters[0], GetEntInfo(entity), 0); + PrintMoveNamesOnWindow(count, entity, moves, 0, 0, 0); +} + +static void sub_8064310(Move *moves) +{ + gDungeonSubMenuItemsCount = 0; + AddActionToDungeonSubMenu(ACTION_UNK22, 0); + AddActionToDungeonSubMenu(ACTION_DELINK_MOVES, 0); + if (!sub_8064358(moves, sChosenMoveSlotId)) { + SetActionUnusableInDungeonSubMenu(ACTION_DELINK_MOVES); + } + AddActionToDungeonSubMenu(ACTION_MOVE_INFO, 0); +} + +static bool8 sub_8064358(Move *moves, s32 id) +{ + bool8 linkFound = FALSE; + s32 linkedCount; + + id++; + for (linkedCount = 0; linkedCount < 8 && id < 8; linkedCount++) { + Move *move = &moves[id]; + + if (MoveFlagLinkChain(move)) { + linkFound = TRUE; + id++; + } + else { + break; + } + } + + if (linkFound) + return TRUE; + return FALSE; +} diff --git a/src/dungeon_menu_others.c b/src/dungeon_menu_others.c new file mode 100644 index 000000000..b330713de --- /dev/null +++ b/src/dungeon_menu_others.c @@ -0,0 +1,1076 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_others.h" +#include "dungeon_menu_recruitment.h" +#include "dungeon_submenu.h" +#include "dungeon.h" +#include "text.h" +#include "menu_input.h" +#include "input.h" +#include "code_8044CC8.h" +#include "dungeon_action.h" +#include "dungeon_util.h" +#include "dungeon_map_access.h" +#include "dungeon_leader.h" +#include "code_8045A00.h" +#include "code_8097DD0.h" +#include "dungeon_message.h" +#include "game_options.h" +#include "post_office_guide2.h" +#include "dungeon_main.h" +#include "dungeon_map.h" + +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void PlayDungeonCursorSE(u8 param_1); +extern void sub_803EAF0(u32, u8 *); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern void DungeonRunFrameActions(u32 a0); +extern void DungeonShowWindows(WindowTemplates *a0, bool8 a1); +extern void AddActionToDungeonSubMenu(u16 actionId, u8 param_2); +extern void sub_8045064(void); +extern bool8 IsBossFight(void); +extern u16 GetLeaderActionId(void); +extern void sub_803E13C(void); +extern void sub_8083AB0(s16 param_0, Entity * target, Entity * entity); + +extern MenuInputStruct gDungeonMenu; + +extern const u8 *const gUnknown_80FEBF8; +extern const u8 *const gUnknown_80FEC28; +extern const u8 *const gUnknown_80FDE6C; +extern const u8 *const gUnknown_80FDEB8; +extern const u8 *const gUnknown_80FEA44; +extern const u8 *const gUnknown_80FEA50; +extern const u8 *const gUnknown_80FEA28; +extern const u8 *const gUnknown_80FEA10; +extern const u8 *const gUnknown_80FE9F8; +extern const u8 *const gUnknown_80FE9E8; +extern const u8 *const gUnknown_80FE9CC; +extern const u8 *const gUnknown_80FE8F8; +extern const u8 *const gUnknown_80FF770; +extern const u8 *const gUnknown_80FE8F4; +extern const u8 *const gGameOptionsTextPtr; +extern const u8 *const gOptionsDungeonTextPtr; +extern const u8 *const gOptionsOthersTextPtr; +extern const u8 *const gUnknown_80FE748; +extern const u8 *const gUnknown_80FE764; +extern const u8 *const gUnknown_80FE7C0; +extern const u8 *const gUnknown_80FE788; +extern const u8 *const gUnknown_80FE7A8; +extern const u8 *const gUnknown_80FE7E4; +extern const u8 *const gUnknown_80FA61C; +extern const u8 *const gUnknown_80FA5F4; +extern const u8 *const gOptionsOthersTextPtr; +extern const u8 *const gOptionsWindowColorPtr; +extern const u8 *const gUnknown_80FF774[]; + +static void PrintOthersMenuOptions(void); +static void ShowGameOptionsMenu(void); +static void ShowQuickSaveGiveUpMenu(void); +static void ShowMissionObjectivesMenu(void); +static void ShowHintsMenu(void); +static bool8 ShowDungeonOptions(void); +static bool8 ShowOthersOptions(void); +static void TrySetNewGameOptions(bool8 bPressed); +static void AskToResetToDefault(void); +static void PrintGameOptions(void); +static void PrintDungeonOptions(void); +static void PrintOthersOptions(void); +static void ChangeGameOptionLeft(s32 optionId); +static void ChangeGameOptionRight(s32 optionId); +static bool8 UnknownDungeonOption(void); +static bool8 UnknownOthersOption(void); +static bool8 AskToQuickSave(void); +static bool8 AskToGiveUp(void); +static void PrintQuickSaveMenuOptions(void); +static void PrintHintsMenu(void); +static void ShowChosenHintWindow(s32 hintId); + +EWRAM_DATA static s32 sOthersCursorId = 0; +UNUSED EWRAM_DATA static u8 sUnused[4] = {0}; +EWRAM_DATA static GameOptions sChangedGameOptions = {0}; + +enum { + OTHERS_GAME_OPTIONS, + OTHERS_QUICKSAVE_GIVEUP, + OTHERS_MESSAGE_LOG, + OTHERS_MISSION_OBJECTIVES, + OTHERS_RECRUITMENT_SEARCH, + OTHERS_HINTS, + OTHERS_COUNT +}; + +void ShowDungeonOthersMenu(void) +{ + bool8 unkAlwaysFalse; + s32 hintsMenuId = (gDungeon->unk644.canRecruit) ? OTHERS_HINTS : OTHERS_HINTS - 1; + + sOthersCursorId = 0; + unkAlwaysFalse = FALSE; + while (1) { + bool8 bPress = FALSE; + + PrintOthersMenuOptions(); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (gDungeonMenu.menuIndex != OTHERS_RECRUITMENT_SEARCH || (gDungeon->unk644.canRecruit && !IsBossFight())) { + PlayDungeonConfirmationSE(); + } + else { + PlayDungeonCancelSE(); + } + break; + } + else if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (unkAlwaysFalse) + continue; + if (bPress) + break; + + sOthersCursorId = gDungeonMenu.menuIndex; + if (sOthersCursorId == OTHERS_GAME_OPTIONS) { + ShowGameOptionsMenu(); + } + if (sOthersCursorId == OTHERS_QUICKSAVE_GIVEUP) { + ShowQuickSaveGiveUpMenu(); + } + if (sOthersCursorId == OTHERS_MESSAGE_LOG) { + DisplayMessageLog(); + } + if (sOthersCursorId == OTHERS_MISSION_OBJECTIVES) { + ShowMissionObjectivesMenu(); + } + if (gDungeon->unk644.canRecruit && !IsBossFight() && sOthersCursorId == OTHERS_RECRUITMENT_SEARCH) { + ShowRecruitmentSearchMenu(); + } + if (sOthersCursorId == hintsMenuId) { + ShowHintsMenu(); + } + + if (gDungeon->unk4) + break; + if (GetLeaderActionId() != ACTION_NOTHING) + break; + } + + ShowWholeRevealedDungeonMap(); + sub_803EAF0(0, NULL); +} + +enum { + GAME_OPTION_DUNGEON, + GAME_OPTION_OTHERS, + GAME_OPTION_DEFAULT, +}; + +static void ShowGameOptionsMenu(void) +{ + while (1) { + bool8 bPress = FALSE; + + PrintGameOptions(); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (bPress) + break; + + sChangedGameOptions = *gGameOptionsRef; + if (gDungeonMenu.menuIndex == GAME_OPTION_DUNGEON) { + bPress = ShowDungeonOptions(); + TrySetNewGameOptions(bPress); + } + else if (gDungeonMenu.menuIndex == GAME_OPTION_OTHERS) { + bPress = ShowOthersOptions(); + TrySetNewGameOptions(bPress); + } + else if (gDungeonMenu.menuIndex == GAME_OPTION_DEFAULT) { + AskToResetToDefault(); + } + } + + sub_803EAF0(0, NULL); +} + +enum { + OPTION_SPEED, + OPTION_FAR_OFF_PALS, + OPTION_DAMAGE_TURN, + OPTION_GRIDS, + OPTION_MAP, + OPTION_WINDOWS, + OPTION_COUNT +}; + +#define DUNGEON_OPTIONS_COUNT OPTION_WINDOWS +#define OTHERS_OPTIONS_COUNT (OPTION_COUNT - DUNGEON_OPTIONS_COUNT) + +static bool8 ShowDungeonOptions(void) +{ + bool8 dpadMoved; + bool8 bPress = FALSE; + + gDungeonMenu.menuIndex = 0; + while (1) { + bPress = FALSE; + dpadMoved = FALSE; + + PrintDungeonOptions(); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if (gRealInputs.repeated & DPAD_LEFT) { + PlayDungeonCursorSE(FALSE); + ChangeGameOptionLeft(gDungeonMenu.menuIndex); + dpadMoved = TRUE; + break; + } + if (gRealInputs.repeated & DPAD_RIGHT) { + PlayDungeonCursorSE(FALSE); + ChangeGameOptionRight(gDungeonMenu.menuIndex); + dpadMoved = TRUE; + break; + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonConfirmationSE(); + break; + } + if (gRealInputs.pressed & B_BUTTON) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + + if (UnknownDungeonOption()) { + dpadMoved = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (!dpadMoved) + break; + } + + return bPress; +} + +static bool8 ShowOthersOptions(void) +{ + bool8 dpadMoved; + bool8 bPress = FALSE; + + gDungeonMenu.menuIndex = 0; + while (1) { + bPress = FALSE; + dpadMoved = FALSE; + + PrintOthersOptions(); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if (gRealInputs.repeated & DPAD_LEFT) { + PlayDungeonCursorSE(FALSE); + ChangeGameOptionLeft(gDungeonMenu.menuIndex + DUNGEON_OPTIONS_COUNT); + dpadMoved = TRUE; + break; + } + if (gRealInputs.repeated & DPAD_RIGHT) { + PlayDungeonCursorSE(FALSE); + ChangeGameOptionRight(gDungeonMenu.menuIndex + DUNGEON_OPTIONS_COUNT); + dpadMoved = TRUE; + break; + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonConfirmationSE(); + break; + } + if (gRealInputs.pressed & B_BUTTON) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + + if (UnknownOthersOption()) { + dpadMoved = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (!dpadMoved) + break; + } + + return bPress; +} + +static void TrySetNewGameOptions(bool8 bPressed) +{ + bool8 optionsChanged = FALSE; + + if (bPressed) { + if (!GameOptionsNotChange(&sChangedGameOptions)) + optionsChanged = TRUE; + } + else { + optionsChanged = TRUE; + } + + if (optionsChanged) { + if (DisplayDungeonYesNoMessage(0, gUnknown_80FEBF8, TRUE) == 1) { + *gGameOptionsRef = sChangedGameOptions; + sub_803E13C(); + LoadDungeonMapPalette(); + } + } +} + +static void AskToResetToDefault(void) +{ + if (DisplayDungeonYesNoMessage(0, gUnknown_80FEC28, FALSE) == 1) { + InitializeGameOptions(FALSE); + sub_803E13C(); + } +} + +static void ShowQuickSaveGiveUpMenu(void) +{ + bool8 unkAlwaysFalse = FALSE; + while (1) { + bool8 bPress = FALSE; + + PrintQuickSaveMenuOptions(); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + + if (unkAlwaysFalse) + continue; + if (bPress) + break; + + if (gDungeonMenu.menuIndex == 0) { + AskToQuickSave(); + } + else if (gDungeonMenu.menuIndex == 1) { + AskToGiveUp(); + } + + if (GetLeaderActionId() != ACTION_NOTHING) + break; + } +} + +static void ShowMissionObjectivesMenu(void) +{ + sub_80319A4(gDungeon->unk644.unk34, gDungeon->unk644.dungeonLocation.id, 0); + do { + DungeonRunFrameActions(0x47); + } while (sub_80319F8() == 0); + sub_8031A3C(); +} + +static bool8 AskToQuickSave(void) +{ + if (DisplayDungeonYesNoMessage(NULL, gUnknown_80FDE6C, FALSE) != 1) { + return TRUE; + } + SetMonsterActionFields(GetLeaderActionContainer(), ACTION_QUICK_SAVE); + return FALSE; +} + +static bool8 AskToGiveUp(void) +{ + if (DisplayDungeonYesNoMessage(NULL, gUnknown_80FDEB8, FALSE) != 1) { + return TRUE; + } + SetMonsterActionFields(GetLeaderActionContainer(), ACTION_GIVE_UP); + sub_8083AB0(0x21B, NULL, GetLeader()); + gDungeon->unk644.unk10 = 1; + return FALSE; +} + +static void PrintOthersMenuOptions(void) +{ + s32 optionsCount, currOptionId; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + header.count = 1; + header.currId = 0; + header.f3 = 0; + gDungeonMenu.menuIndex = sOthersCursorId; + optionsCount = (gDungeon->unk644.canRecruit) ? OTHERS_COUNT : OTHERS_COUNT - 1; + gDungeonMenu.unk1A = optionsCount; + gDungeonMenu.unk1C = optionsCount; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 18; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(optionsCount, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + sub_80073B8(0); + currOptionId = 0; + PrintFormattedStringOnWindow(16, 0, gUnknown_80FE8F8, 0, '\0'); + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80FE9CC, 0, '\0'); + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80FE9E8, 0, '\0'); + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80FE9F8, 0, '\0'); + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80FEA10, 0, '\0'); + if (gDungeon->unk644.canRecruit) { + if (!IsBossFight()) { + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80FEA28, 0, '\0'); + } + else { + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80FEA44, 0, '\0'); + } + } + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId), gUnknown_80FEA50, 0, '\0'); + + sub_80073E0(0); +} + +struct Struct_80F7C50 +{ + const u8 *str; + s32 val; +}; + +// TODO: Fix this table in other file + +extern const struct Struct_80F7C50 gUnknown_80F7C50[]; + +static void PrintQuickSaveMenuOptions(void) +{ + s32 optionsCount, currOptionId; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + header.count = 1; + header.currId = 0; + header.f3 = 0; + gDungeonMenu.menuIndex = 0; + optionsCount = 2; + gDungeonMenu.unk1A = optionsCount; + gDungeonMenu.unk1C = optionsCount; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 18; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(optionsCount, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + sub_80073B8(0); + currOptionId = 0; + PrintFormattedStringOnWindow(16, 0, gUnknown_80FE8F4, 0, '\0'); + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80F7C50[43].str, 0, '\0'); + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, currOptionId++), gUnknown_80F7C50[46].str, 0, '\0'); + + sub_80073E0(0); +} + +static void PrintGameOptions(void) +{ + s32 optionsCount; + s32 y[3]; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 12, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + header.count = 1; + header.currId = 0; + header.f3 = 0; + gDungeonMenu.menuIndex = 0; + optionsCount = 3; + gDungeonMenu.unk1A = optionsCount; + gDungeonMenu.unk1C = optionsCount; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 12; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(optionsCount, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + + y[0] = GetMenuEntryYCoord(&gDungeonMenu, 0); + y[1] = GetMenuEntryYCoord(&gDungeonMenu, 1); + y[2] = GetMenuEntryYCoord(&gDungeonMenu, 2); + sub_80073B8(0); + PrintFormattedStringOnWindow(16, 0, gGameOptionsTextPtr, 0, '\0'); + PrintFormattedStringOnWindow(8, y[0], gOptionsDungeonTextPtr, 0, '\0'); + PrintFormattedStringOnWindow(8, y[1], gOptionsOthersTextPtr, 0, '\0'); + PrintFormattedStringOnWindow(8, y[2], gUnknown_80FE748, 0, '\0'); + sub_80073E0(0); +} + +static void PrintDungeonOptions(void) +{ + s32 y[DUNGEON_OPTIONS_COUNT]; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + s32 mapOptionUnderscoreWidths[] = {16, 25, 27}; + + header.count = 1; + header.currId = 0; + header.f3 = 0; + + gDungeonMenu.unk1A = DUNGEON_OPTIONS_COUNT; + gDungeonMenu.unk1C = DUNGEON_OPTIONS_COUNT; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 24; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(DUNGEON_OPTIONS_COUNT, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + + y[0] = GetMenuEntryYCoord(&gDungeonMenu, 0); + y[1] = GetMenuEntryYCoord(&gDungeonMenu, 1); + y[2] = GetMenuEntryYCoord(&gDungeonMenu, 2); + y[3] = GetMenuEntryYCoord(&gDungeonMenu, 3); + y[4] = GetMenuEntryYCoord(&gDungeonMenu, 4); + sub_80073B8(0); + PrintFormattedStringOnWindow(16, 0, gOptionsDungeonTextPtr, 0, '\0'); + PrintFormattedStringOnWindow(8, y[0], gUnknown_80FE764, 0, '\0'); + PrintFormattedStringOnWindow(8, y[1], gUnknown_80FE788, 0, '\0'); + PrintFormattedStringOnWindow(8, y[2], gUnknown_80FE7A8, 0, '\0'); + PrintFormattedStringOnWindow(8, y[3], gUnknown_80FE7C0, 0, '\0'); + PrintFormattedStringOnWindow(8, y[4], gUnknown_80FE7E4, 0, '\0'); + + if (sChangedGameOptions.dungeonSpeed != DUNGEON_SPEED_SLOW) { + AddDoubleUnderScoreHighlight(0, 136, y[0] + 10, 21, 7); + } + else { + AddDoubleUnderScoreHighlight(0, 80, y[0] + 10, 22, 7); + } + + if (sChangedGameOptions.FarOffPals != FAROFFPALS_SELF) { + AddDoubleUnderScoreHighlight(0, 136, y[1] + 10, 22, 7); + } + else { + AddDoubleUnderScoreHighlight(0, 80, y[1] + 10, 18, 7); + } + + if (sChangedGameOptions.damageTurn) { + AddDoubleUnderScoreHighlight(0, 136, y[2] + 10, 16, 7); + } + else { + AddDoubleUnderScoreHighlight(0, 80, y[2] + 10, 12, 7); + } + + if (sChangedGameOptions.gridEnable) { + AddDoubleUnderScoreHighlight(0, 136, y[3] + 10, 12, 7); + } + else { + AddDoubleUnderScoreHighlight(0, 80, y[3] + 10, 16, 7); + } + + AddDoubleUnderScoreHighlight(0, 80 + (sChangedGameOptions.mapOption * 40), y[4] + 10, mapOptionUnderscoreWidths[sChangedGameOptions.mapOption], 7); + + sub_80073E0(0); +} + +static void PrintOthersOptions(void) +{ + s32 i; + s32 y[OTHERS_OPTIONS_COUNT]; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + s32 underscoreWidths[] = {19, 17, 25}; + + header.count = 1; + header.currId = 0; + header.f3 = 0; + + gDungeonMenu.unk1A = OTHERS_OPTIONS_COUNT; + gDungeonMenu.unk1C = OTHERS_OPTIONS_COUNT; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 24; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(OTHERS_OPTIONS_COUNT, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + + for (i = 0; i < OTHERS_OPTIONS_COUNT; i++) { + y[i] = GetMenuEntryYCoord(&gDungeonMenu, i); + } + sub_80073B8(0); + + PrintFormattedStringOnWindow(16, 0, gOptionsOthersTextPtr, 0, '\0'); + PrintFormattedStringOnWindow(8, y[0], gOptionsWindowColorPtr, 0, '\0'); + AddDoubleUnderScoreHighlight(0, 80 + (sChangedGameOptions.windowColor * 40), y[0] + 10, underscoreWidths[sChangedGameOptions.windowColor], 7); + + sub_80073E0(0); +} + +static void ChangeGameOptionLeft(s32 optionId) +{ + switch (optionId) { + case OPTION_SPEED: + sChangedGameOptions.dungeonSpeed = (sChangedGameOptions.dungeonSpeed == DUNGEON_SPEED_SLOW) ? DUNGEON_SPEED_FAST : DUNGEON_SPEED_SLOW; + break; + case OPTION_FAR_OFF_PALS: + sChangedGameOptions.FarOffPals = (sChangedGameOptions.FarOffPals == 0) ? 1 : 0; + break; + case OPTION_DAMAGE_TURN: + sChangedGameOptions.damageTurn = (sChangedGameOptions.damageTurn == 0) ? 1 : 0; + break; + case OPTION_GRIDS: + sChangedGameOptions.gridEnable = (sChangedGameOptions.gridEnable == 0) ? 1 : 0; + break; + case OPTION_MAP: + if (sChangedGameOptions.mapOption == 0) { + sChangedGameOptions.mapOption = MAP_OPTION_SHADE; + } + else { + sChangedGameOptions.mapOption--; + } + break; + case OPTION_WINDOWS: + if (sChangedGameOptions.windowColor == 0) { + sChangedGameOptions.windowColor = WINDOW_COLOR_GREEN; + } + else { + sChangedGameOptions.windowColor--; + } + break; + } +} + +static void ChangeGameOptionRight(s32 optionId) +{ + switch (optionId) { + case OPTION_SPEED: + sChangedGameOptions.dungeonSpeed = (sChangedGameOptions.dungeonSpeed == DUNGEON_SPEED_SLOW) ? DUNGEON_SPEED_FAST : DUNGEON_SPEED_SLOW; + break; + case OPTION_FAR_OFF_PALS: + sChangedGameOptions.FarOffPals = (sChangedGameOptions.FarOffPals == 0) ? 1 : 0; + break; + case OPTION_DAMAGE_TURN: + sChangedGameOptions.damageTurn = (sChangedGameOptions.damageTurn == 0) ? 1 : 0; + break; + case OPTION_GRIDS: + sChangedGameOptions.gridEnable = (sChangedGameOptions.gridEnable == 0) ? 1 : 0; + break; + case OPTION_MAP: + if (sChangedGameOptions.mapOption == MAP_OPTION_SHADE) { + sChangedGameOptions.mapOption = 0; + } + else { + sChangedGameOptions.mapOption++; + } + break; + case OPTION_WINDOWS: + if (sChangedGameOptions.windowColor == WINDOW_COLOR_GREEN) { + sChangedGameOptions.windowColor = 0; + } + else { + sChangedGameOptions.windowColor++; + } + break; + } +} + +// Different in Blue maybe? +static bool8 UnknownDungeonOption(void) +{ + return FALSE; +} + +static bool8 UnknownOthersOption(void) +{ + return FALSE; +} + +enum +{ + HINTS_CONTROLS, + HINTS_ORIENTATION, + HINTS_SEEDS, + HINTS_MOVES, + HINTS_RANGE, + HINTS_LINKING_MOVES, + HINTS_POKEMON_TYPES, + HINTS_TOUCH_SCREEN, + HINTS_COUNT, +}; + +#define HINTS_COUNT_RED_VERSION HINTS_COUNT - 1 // No Touch Screen Hints in Red + +static void ShowHintsMenu(void) +{ + while (1) { + bool8 bPress = FALSE; + + PrintHintsMenu(); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if (bPress) + break; + + ShowChosenHintWindow(gDungeonMenu.menuIndex); + } +} + +static void PrintHintsMenu(void) +{ + s32 i; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 12, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + header.count = 1; + header.currId = 0; + header.f3 = 0; + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1A = HINTS_COUNT_RED_VERSION; + gDungeonMenu.unk1C = HINTS_COUNT_RED_VERSION; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 12; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(HINTS_COUNT_RED_VERSION, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + sub_80137B0(&gDungeonMenu, 0); + sub_80073B8(0); + PrintFormattedStringOnWindow(16, 0, gUnknown_80FF770, 0, '\0'); + for (i = 0; i < HINTS_COUNT_RED_VERSION; i++) { + PrintFormattedStringOnWindow(8, GetMenuEntryYCoord(&gDungeonMenu, i), gUnknown_80FF774[i], 0, '\0'); + } + sub_80073E0(0); +} + +extern const u8 *const gUnknown_80FF7EC[2][HINTS_COUNT]; + +static void ShowChosenHintWindow(s32 hintId) +{ + bool8 unk9 = (gGameOptionsRef->unk9 != 0); + + while (1) { + bool8 dpadPressed = FALSE; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 12, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + header.count = HINTS_COUNT_RED_VERSION; + header.currId = hintId; + header.f3 = 0; + gDungeonMenu.unk1E = hintId; + gDungeonMenu.unk20 = HINTS_COUNT_RED_VERSION; + gDungeonMenu.unk1A = 0; + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1C = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + windows.id[0].width = 24; + windows.id[0].height = windows.id[0].unk10 = sub_80095E4(HINTS_COUNT, 12) + 2; + header.width = 10; + windows.id[0].pos.x = 2; + DungeonShowWindows(&windows, TRUE); + gDungeonMenu.unkC = (gWindows[0].x + 19) * 8; + gDungeonMenu.unkE = ((gWindows[0].y + 1) * 8) - 2; + sub_80073B8(0); + PrintFormattedStringOnWindow(16 + hintId * 8, 0, gUnknown_80FF774[hintId], 0, '\0'); + PrintFormattedStringOnWindow(8, 16, gUnknown_80FF7EC[unk9][hintId], 0, '\0'); + sub_80073E0(0); + + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x24); + if ((gRealInputs.pressed & DPAD_RIGHT) || gDungeonMenu.unk28.dpad_right) { + PlayDungeonCursorSE(FALSE); + if (++hintId == HINTS_COUNT_RED_VERSION) { + hintId = 0; + } + dpadPressed = TRUE; + break; + } + if ((gRealInputs.pressed & DPAD_LEFT) || gDungeonMenu.unk28.dpad_left) { + PlayDungeonCursorSE(FALSE); + if (--hintId == -1) { + hintId = HINTS_COUNT_RED_VERSION - 1; + } + dpadPressed = TRUE; + break; + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + break; + } + } + + DungeonRunFrameActions(0x24); + if (!dpadPressed) + break; + } +} diff --git a/src/dungeon_menu_recruitment.c b/src/dungeon_menu_recruitment.c new file mode 100644 index 000000000..5e6f895c6 --- /dev/null +++ b/src/dungeon_menu_recruitment.c @@ -0,0 +1,383 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_recruitment.h" +#include "dungeon.h" +#include "text.h" +#include "menu_input.h" +#include "input.h" +#include "dungeon_message.h" +#include "pokemon.h" +#include "pokemon_3.h" +#include "sprite.h" +#include "exclusive_pokemon.h" + +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void PlayDungeonCursorSE(u8 param_1); +extern void sub_803EAF0(u32, u8 *); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern void DungeonRunFrameActions(u32 a0); +extern void DungeonShowWindows(const WindowTemplates *a0, bool8 a1); +extern void AddActionToDungeonSubMenu(u16 actionId, u8 param_2); +extern u16 GetLeaderActionId(void); +extern u32 sub_8014140(s32 a0, const void *a1); +extern void sprintfStatic(char *buffer, const char *text, ...); +extern u8 sub_806F9BC(s32); +extern bool8 sub_80860A8(u8 id); +extern bool8 sub_806A564(s32 r0); + +extern MenuInputStruct gDungeonMenu; +extern s32 gDungeonFramesCounter; + +struct MonRecruitList +{ + s16 speciesIds[MONSTER_MAX]; + u8 monColor[MONSTER_MAX]; + s32 count; +}; + +static void PrintAvailableMons(struct MonRecruitList *tabData, s32 tabId); +static bool8 TryScrollUp(struct MonRecruitList *tabData, s32 a1); +static bool8 TryScrollDown(struct MonRecruitList *tabData, s32 a1); +static void CreateScrollingArrow(bool8 upArrow, s32 y); +static void SetRecruitableMons(struct MonRecruitList *tabsData); + +extern const u8 *const gUnknown_80FA61C; +extern const u8 *const gUnknown_80FA5F4; +extern const u8 *const gUnknown_80FEA68; +extern const u8 *const gUnknown_80FEA80; +extern const u8 *const gUnknown_80FEA8C; + +EWRAM_DATA static s32 sScrollId = 0; +EWRAM_DATA static u8 sScrollFlags = 0; +EWRAM_DATA static SpriteOAM sScrollingArrowOAM = {0}; +EWRAM_INIT static WindowHeader sRecruitmentWindowHeader = {2, 0, 13, 0}; + +enum { + TAB_POTENTIAL_RECRUITS, + TAB_RECRUITED_MONS, + TABS_COUNT +}; + + +static const WindowTemplates sRecruitmentSearchWindows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 14, + .unk10 = 18, + .unk12 = 2, + .header = &sRecruitmentWindowHeader, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } +}; + +static const u8 gUnknown_8106D68[] = {1, 0, 56, 0, 0, 0, 24, 0, 24, 0, 0, 0, 2, 0, 56, 0, 104, 0, 24, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +void ShowRecruitmentSearchMenu(void) +{ + s32 currTabId = 0; + + if (!IsRecruitingEnabled(gDungeon->unk644.dungeonLocation.id)) { + DisplayDungeonMessage(NULL, gUnknown_80FA5F4, TRUE); + } + else if (gDungeon->unk644.unk19) { + DisplayDungeonMessage(NULL, gUnknown_80FA61C, TRUE); + } + else { + struct MonRecruitList tabsData[2]; + + SetRecruitableMons(tabsData); + while (1) { + bool8 closeWindow = FALSE; + struct MonRecruitList *currTabData = &tabsData[currTabId]; + + sRecruitmentWindowHeader.currId = currTabId; + DungeonShowWindows(&sRecruitmentSearchWindows, TRUE); + gDungeonMenu.unk1A = 0; + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1C = 0; + gDungeonMenu.unk1E = currTabId; + gDungeonMenu.unk20 = 2; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + sScrollId = 0; + sScrollFlags = 0; + PrintAvailableMons(currTabData, currTabId); + gDungeonMenu.unkC = (gWindows[0].x + 16) * 8; + gDungeonMenu.unkE = ((gWindows[0].y + 1) * 8) - 2; + + while (1) { + s32 unkVar; + bool8 scroll = FALSE; + + sScrollFlags = 0; + unkVar = sub_8014140(0, gUnknown_8106D68); + if (TryScrollUp(currTabData, unkVar)) { + scroll = TRUE; + } + if (TryScrollDown(currTabData, unkVar)) { + scroll = TRUE; + } + + if (!scroll) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x45); + } + + if (sScrollFlags & FLAG_CAN_SCROLL_UP) { + CreateScrollingArrow(TRUE, 8); + } + if (sScrollFlags & FLAG_CAN_SCROLL_DOWN) { + CreateScrollingArrow(FALSE, 0x70); + } + + if ((gRealInputs.pressed & (DPAD_LEFT | DPAD_RIGHT)) || gDungeonMenu.unk28.dpad_left || gDungeonMenu.unk28.dpad_right) { + PlayDungeonCursorSE(FALSE); + currTabId = (currTabId == 0) ? 1 : 0; + break; + } + + if (sub_80048C8()) + continue; + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + closeWindow = TRUE; + break; + } + if ((gRealInputs.pressed & (SELECT_BUTTON | START_BUTTON))) { + PlayDungeonConfirmationSE(); + closeWindow = TRUE; + break; + } + } + + if (closeWindow) + break; + } + + sub_803EAF0(0, NULL); + } +} + +static void PrintAvailableMons(struct MonRecruitList *tabData, s32 tabId) +{ + u8 text[64]; + s32 i; + s32 menuMonId = sScrollId; + s32 y = 32; + + sub_80073B8(0); + if (tabId == TAB_POTENTIAL_RECRUITS) { + PrintStringOnWindow(12, 0, gUnknown_80FEA68, 0, '\0'); + } + else { + PrintStringOnWindow(20, 0, gUnknown_80FEA80, 0, '\0'); + } + + if (tabData->count != 0) { + for (i = 0; i < 8; i++, menuMonId++, y += 12) { + if (menuMonId >= 0 && menuMonId < tabData->count) { + sprintfStatic(text, _("{color}%d{POKEMON_0}"), tabData->monColor[menuMonId]); + sub_808D930(gFormatBuffer_Monsters[0], tabData->speciesIds[menuMonId]); + PrintFormattedStringOnWindow(8, y, text, 0, '\0'); + } + } + } + else { + PrintStringOnWindow(8, y, gUnknown_80FEA8C, 0, '\0'); + } + sub_80073E0(0); +} + +static bool8 TryScrollUp(struct MonRecruitList *tabData, s32 a1) +{ + s32 i; + u8 text[64]; + s32 menuMonId = sScrollId; + if (menuMonId == 0) + return FALSE; + + menuMonId--; + sScrollFlags |= FLAG_CAN_SCROLL_UP; + if (!(gRealInputs.repeated & DPAD_UP) && a1 != 1) { + return FALSE; + } + else { + PlayDungeonCursorSE(FALSE); + sub_80073B8(0); + sub_80087EC(0, 0, 16, 144, 16); + sprintfStatic(text, _("{color}%d{POKEMON_0}"), tabData->monColor[menuMonId]); + sub_808D930(gFormatBuffer_Monsters[0], tabData->speciesIds[menuMonId]); + PrintFormattedStringOnWindow(8, 20, text, 0, '\0'); + sub_80073E0(0); + DungeonRunFrameActions(0x45); + for (i = 0; i < 6; i++) { + ScrollUpWindowFunc(0); + DungeonRunFrameActions(0x45); + } + sScrollId--; + return TRUE; + } +} + +static bool8 TryScrollDown(struct MonRecruitList *tabData, s32 a1) +{ + s32 i; + u8 text[64]; + s32 menuMonId = sScrollId + 8; + s32 y = 128; + if (tabData->count <= menuMonId) + return FALSE; + + sScrollFlags |= FLAG_CAN_SCROLL_DOWN; + if (!(gRealInputs.repeated & DPAD_DOWN) && a1 != 2) { + return FALSE; + } + else { + PlayDungeonCursorSE(FALSE); + sub_80073B8(0); + sub_80087EC(0, 0, y, 72, 16); + sprintfStatic(text, _("{color}%d{POKEMON_0}"), tabData->monColor[menuMonId]); + sub_808D930(gFormatBuffer_Monsters[0], tabData->speciesIds[menuMonId]); + PrintFormattedStringOnWindow(8, y, text, 0, '\0'); + sub_80073E0(0); + DungeonRunFrameActions(13); + for (i = 0; i < 6; i++) { + ScrollDownWindowFunc(0); + DungeonRunFrameActions(13); + } + sScrollId++; + return TRUE; + } +} + +// Almost identical to CreateMessageLogArrow +static void CreateScrollingArrow(bool8 upArrow, s32 y) +{ + struct Window *window = &gWindows[0]; + if (!(gDungeonFramesCounter & 8)) { + SpriteSetAffine1(&sScrollingArrowOAM, 0); + SpriteSetAffine2(&sScrollingArrowOAM, 0); + SpriteSetObjMode(&sScrollingArrowOAM, 0); + SpriteSetMosaic(&sScrollingArrowOAM, 0); + SpriteSetBpp(&sScrollingArrowOAM, 0); + SpriteSetMatrixNum(&sScrollingArrowOAM, (upArrow != FALSE) ? (16) : 0); + SpriteSetPalNum(&sScrollingArrowOAM, 15); + SpriteSetY(&sScrollingArrowOAM, (window->y * 8) + y); + SpriteSetX(&sScrollingArrowOAM, (window->x * 8) + 64); + SpriteSetShape(&sScrollingArrowOAM, 1); + SpriteSetSize(&sScrollingArrowOAM, 0); + SpriteSetPriority(&sScrollingArrowOAM, 0); + SpriteSetPalNum(&sScrollingArrowOAM, 15); + SpriteSetTileNum(&sScrollingArrowOAM, 0x3f0); + + AddSprite(&sScrollingArrowOAM, 127, NULL, NULL); + } +} + +static void SetRecruitableMons(struct MonRecruitList *tabsData) +{ + s32 i, id, dummy; + u8 spArray[MONSTER_MAX]; + + for (i = 0; i < MONSTER_MAX; i++) { + spArray[i] = 0; + } + + for (id = 0; id < gDungeon->unk37E4; id++) { + u8 byte = 1; + s32 val1 = gDungeon->unk343C[id].unk2[0]; + s32 val2 = gDungeon->unk343C[id].unk2[1]; + if (val1 == 0) { + if (val2 == 0) + continue; + byte = 2; + } + spArray[ExtractSpeciesIndex(&gDungeon->unk343C[id])] = byte; + } + + if (gDungeon->unk644.unk2A) { + spArray[MONSTER_KECLEON] = 1; + } + + // ??? + for (dummy = 0; dummy < 6; dummy++) {;} + + for (i = 0; i < TABS_COUNT; i++) { + s32 count = 0; + s32 j; + // Line below is only to trick compiler into generating matching stack pattern. + dummy = tabsData[i].count; + for (j = 1; j < MONSTER_MUNCHLAX; j++) { + s32 k; + s32 speciesId = (s16) j; + s32 monNameColor = 7; + bool8 monIsRecruited = FALSE; + + + if (spArray[speciesId] == 0) + continue; + + if (i == TAB_POTENTIAL_RECRUITS) { + u32 recruitRate, unrecruitableRate; + if (!sub_806F9BC(speciesId)) + continue; + if (!IsExclusivePokemonUnlocked(speciesId)) + continue; + // Weird casting needed to match... + recruitRate = (u16) GetRecruitRate(speciesId); + unrecruitableRate = (u16) -999; + if (recruitRate == unrecruitableRate) + continue; + if (speciesId == MONSTER_MEW && !sub_80860A8(122)) + continue; + } + else { + for (k = 0; k < NUM_MONSTERS; k++) { + if (PokemonFlag1(&gRecruitedPokemonRef->pokemon[k]) && gRecruitedPokemonRef->pokemon[k].speciesNum == speciesId) + break; + } + if (k != NUM_MONSTERS) { + monIsRecruited = TRUE; + } + + if (!monIsRecruited) { + for (k = 0; k < 4; k++) { + PokemonStruct2 *mon = &gRecruitedPokemonRef->pokemon2[k]; + if (PokemonFlag1Struct2(mon) && !sub_806A564(mon->unkA) && mon->speciesNum == speciesId) + break; + } + if (k != 4) { + monIsRecruited = TRUE; + monNameColor = 6; + } + } + } + + if (i == TAB_POTENTIAL_RECRUITS) { + if (spArray[speciesId] == 2) { + monNameColor = 2; + } + tabsData[TAB_POTENTIAL_RECRUITS].speciesIds[count] = speciesId; + tabsData[TAB_POTENTIAL_RECRUITS].monColor[count] = monNameColor; + count++; + } + else if (monIsRecruited) { + tabsData[i].speciesIds[count] = speciesId; + tabsData[i].monColor[count] = monNameColor; + count++; + } + } + tabsData[i].count = count; + } +} diff --git a/src/dungeon_menu_stairs.c b/src/dungeon_menu_stairs.c new file mode 100644 index 000000000..ed059ec8c --- /dev/null +++ b/src/dungeon_menu_stairs.c @@ -0,0 +1,243 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_stairs.h" +#include "dungeon_menu_team.h" +#include "dungeon_menu_moves.h" +#include "dungeon_submenu.h" +#include "dungeon.h" +#include "text.h" +#include "menu_input.h" +#include "input.h" +#include "code_8044CC8.h" +#include "dungeon_action.h" +#include "dungeon_util.h" +#include "dungeon_map_access.h" +#include "code_8045A00.h" +#include "code_8097DD0.h" +#include "dungeon_generation.h" + +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void PlayDungeonCursorSE(u8 param_1); +extern void sub_803EAF0(u32, u8 *); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern void DungeonRunFrameActions(u32 a0); +extern void DungeonShowWindows(WindowTemplates *a0, bool8 a1); +extern void AddActionToDungeonSubMenu(u16 actionId, u8 param_2); +extern void sub_8045064(void); +extern u8 GetFloorType(void); + +extern MenuInputStruct gDungeonMenu; +extern s32 gDungeonSubMenuItemsCount; + +extern const u8 *const gUnknown_80FE70C; +extern const u8 *const gUnknown_80FE720; +extern const u8 *const gUnknown_80FE724; +extern const u8 *const gUnknown_80F8104[]; +extern const u8 *const gUnknown_80F7F70[]; + +static void ShowAndPrintOnStairsMenu(DungeonPos *pos, WindowTemplates *windows, WindowHeader *header); +static void AddStairsSubMenuOptions(Entity *mon); +static void ShowStairsDescription(DungeonPos *pos); + +// Pretty much a copy of ShowDungeonTileMenu +void ShowDungeonStairsMenu(Entity *mon) +{ + while (1) { + s32 inputAction = 0; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 4, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + PlayDungeonStartButtonSE(); + ShowAndPrintOnStairsMenu(&mon->pos, &windows, &header); + DungeonRunFrameActions(0x2E); + AddStairsSubMenuOptions(mon); + gDungeonMenu.unk8.x = 0; + gDungeonMenu.unk8.y = 0; + CreateDungeonMenuSubWindow(&windows.id[0], 22); + + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x2E); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (gDungeonMenu.menuIndex == 1) { + PlayDungeonConfirmationSE(); + ShowStairsDescription(&mon->pos); + inputAction = 2; + break; + } + else if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + ActionContainer *action = &GetEntInfo(mon)->action; + + SetMonsterActionFields(action, gDungeonSubMenu[gDungeonMenu.menuIndex].actionId); + PlayDungeonConfirmationSE(); + action->actionParameters[0].actionUseIndex = 0; + action->actionParameters[0].itemPos.x = 0; + action->actionParameters[0].itemPos.y = 0; + action->actionParameters[1].actionUseIndex = 0; + action->actionParameters[1].itemPos.x = 0; + action->actionParameters[1].itemPos.y = 0; + inputAction = 0; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + inputAction = 1; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x2E); + if (inputAction != 2) + break; + } + + sub_803EAF0(0, 0); +} + +static void ShowAndPrintOnStairsMenu(DungeonPos *pos, WindowTemplates *windows, WindowHeader *header) +{ + const u8 *str; + + header->count = 1; + header->currId = 0; + header->width = 11; + header->f3 = 0; + DungeonShowWindows(windows, TRUE); + sub_80073B8(0); + switch (GetFloorType()) { + default: + case FLOOR_TYPE_NORMAL: + str = gUnknown_80FE70C; + break; + case FLOOR_TYPE_RESCUE: + str = gUnknown_80FE720; + break; + case FLOOR_TYPE_FIXED: + str = gUnknown_80FE724; + break; + } + PrintStringOnWindow(12, 0, str, 0, '\0'); + PrintStringOnWindow(8, 18, str, 0, '\0'); + sub_80073E0(0); +} + +static void AddStairsSubMenuOptions(Entity *mon) +{ + gDungeonSubMenuItemsCount = 0; + AddActionToDungeonSubMenu(ACTION_STAIRS, 0); + AddActionToDungeonSubMenu(ACTION_SHOW_INFO, 0); + sub_8045064(); +} + +// Again, almost identical to its Tile counterpart. +static void ShowStairsDescription(DungeonPos *pos) +{ + while (1) { + u8 floorType; + bool8 bPress; + struct subStruct_203B240 *statuses[4]; + MenuInputStructSub menuSub; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 26, + .height = 12, + .unk10 = 12, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + s32 i, statusesCount; + + sub_801317C(&menuSub); + header.count = 1; + header.currId = 0; + header.width = 16; + header.f3 = 0; + + DungeonShowWindows(&windows, FALSE); + floorType = GetFloorType(); + sub_80073B8(0); + PrintStringOnWindow(16, 0, gUnknown_80F8104[floorType], 0, '\0'); + PrintStringOnWindow(8, 24, gUnknown_80F7F70[floorType], 0, '\0'); + sub_80073E0(0); + statusesCount = sub_8097DF0(gUnknown_80F7F70[floorType], statuses); + while (1) { + if (statusesCount != 0) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(0x16); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + PlayDungeonConfirmationSE(); + bPress = FALSE; + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + if (bPress || statusesCount == 0) + break; + + for (i = 0; i < statusesCount; i++) { + ShowStatusDescriptionMenu(statuses[i], &menuSub); + while (1) { + if (i < statusesCount - 1) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(0x16); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + PlayDungeonCancelSE(); + break; + } + } + } + } + + sub_803EAF0(0, 0); +} + diff --git a/src/dungeon_menu_team.c b/src/dungeon_menu_team.c new file mode 100644 index 000000000..17eb834b9 --- /dev/null +++ b/src/dungeon_menu_team.c @@ -0,0 +1,1666 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_team.h" +#include "dungeon_menu_moves.h" +#include "dungeon_submenu.h" +#include "structs/str_dungeon.h" +#include "number_util.h" +#include "input.h" +#include "structs/map.h" +#include "dungeon_main.h" +#include "dungeon_message.h" +#include "dungeon_action.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_random.h" +#include "dungeon_util.h" +#include "pokemon.h" +#include "moves.h" +#include "items.h" +#include "dungeon_music.h" +#include "dungeon_ai_movement.h" +#include "code_8045A00.h" +#include "string_format.h" +#include "code_803E46C.h" +#include "code_801602C.h" +#include "code_800D090.h" +#include "dungeon_map_access.h" +#include "status_checks_1.h" +#include "weather.h" +#include "dungeon_items.h" +#include "dungeon_leader.h" +#include "tile_types.h" +#include "dungeon_visibility.h" +#include "dungeon_movement.h" +#include "menu_input.h" +#include "music.h" +#include "items.h" +#include "pokemon_3.h" +#include "text.h" +#include "code_806CD90.h" +#include "code_8044CC8.h" +#include "code_801B3C0.h" +#include "dungeon_capabilities.h" +#include "constants/tactic.h" +#include "structs/struct_sub80095e4.h" +#include "structs/str_text.h" +#include "code_8097DD0.h" +#include "move_util.h" + +extern bool8 sub_8048A68(Entity *param_1,Item *item); +extern bool8 sub_8048950(Entity *param_1,Item *item); +extern bool8 sub_8048B9C(Entity *param_1,Item *item); +extern Item *sub_8044D90(Entity *, s32, u32); +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void PlayDungeonCursorSE(u8 param_1); +extern void sub_806A6E8(Entity *); +extern bool8 sub_8047084(s32 itemFlag); +extern void HandleTrap(Entity *pokemon, DungeonPos *pos, int param_3, char param_4); +extern void sub_8045DB4(DungeonPos *, u32); +bool8 sub_807EF48(void); +void sub_806A2BC(Entity *a0, u8 a1); +bool8 sub_805E874(void); +bool8 sub_80701A4(Entity *a0); +void sub_805E738(Entity *a0); +void sub_803E708(s32 a0, s32 a1); +void sub_8040A78(void); +void sub_805E804(void); +void ShowDungeonOthersMenu(void); +void sub_8075680(u32); +void sub_8094C88(void); +void sub_8040A84(void); +void sub_8047158(void); +void sub_806A914(u8 a0, u8 a1, u8 a2); +void SetLeaderActionToNothing(u8 a0); +u16 GetLeaderActionId(void); +void sub_80978C8(s16 a0); +bool8 sub_8094C48(void); +bool8 sub_805EC4C(Entity *a0, u8 a1); +void sub_803E724(s32 a0); +void HandleTalkFieldAction(Entity *); +bool8 sub_8044B28(void); +bool8 IsNotAttacking(Entity *param_1, bool8 param_2); +void ShowMainMenu(bool8 fromBPress, bool8 a1); +bool8 sub_805EF60(Entity *a0, EntityInfo *a1); +bool8 sub_8070F80(Entity * pokemon, s32 direction); +void PrintOnMainMenu(bool8 printAll); +bool8 ShowDungeonItemsMenu(Entity * a0, struct UnkMenuBitsStruct *a1); +void sub_8060D24(UNUSED ActionContainer *a0); +bool8 ShowDungeonTeamMenu(Entity *a0); +void ActionShowMoveInfo(ActionContainer *a0); +void ActionToggleMoveUsableForAi(ActionContainer *a0); +void ActionLinkMoves(ActionContainer *a0); +void sub_806752C(ActionContainer *a0); +void ActionSetOrUnsetMove(ActionContainer *a0, bool8 a1); +void ActionDelinkMoves(ActionContainer *a0, bool8 a1); +void sub_8067768(ActionContainer *a0); +void ChangeDungeonCameraPos(DungeonPos *pos, s32 a1, u8 a2, u8 a3); +extern void sub_80643AC(Entity *pokemon); +extern bool8 ShowDungeonMovesMenu(Entity * entity, u8 a1, u8 a2, s32 a3, s32 a4); +extern bool8 sub_8070F14(Entity * pokemon, s32 direction); +bool8 sub_805EC2C(Entity *a0, s32 x, s32 y); +extern Entity *sub_80696A8(Entity *a0); +extern u8 sub_806A538(s32); +extern void sub_803EAF0(u32, u8 *); +extern void sub_803F508(Entity *); +extern void sub_8041AD0(Entity *pokemon); +extern void sub_8041AE0(Entity *pokemon); +extern void sub_807EC28(bool8); +extern u8 *GetDungeonSubMenuItemString(s32 param_1); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern s32 gDungeonSubMenuItemsCount; +extern const u8 gUnknown_8106B50[]; +extern void DungeonShowWindows(WindowTemplates *a0, u8 a1); +extern Item * sub_8044CC8(Entity *param_1, ActionParameter *param_2, UNUSED s32 a3); +extern void AddActionToDungeonSubMenu(u16 actionId, u8 param_2); +extern void SetActionUnusableInDungeonSubMenu(u16 param_1); +extern u16 sub_8044DC8(Item *param_1); +extern bool8 sub_8046F00(Item *item); +extern void sub_8045064(void); +extern void sub_8070968(u8 *buffer, EntityInfo *entityInfo, s32 colorNum); +extern bool8 CanLeaderSwitch(u8 dungeon); +extern void GetAvailTacticsforLvl(u8 *tacticsBuffer, s32 pokeLevel); +extern void sub_8069844(struct unkStruct_808FF20 *param_1, Entity *target); +extern u32 sub_8014140(s32 a0, const void *a1); +extern char* sub_808E4FC(s32 a1); +extern char* sub_808E51C(s32 a1); +extern void sub_8045C18(u8 *buffer, Item *item); +extern bool32 sub_8069D18(DungeonPos *a0, Entity *a1); + +extern u8 gUnknown_202EE00; +extern Entity *gLeaderPointer; +extern MenuInputStruct gDungeonMenu; +extern s32 gDungeonFramesCounter; +extern u8 gUnknown_202EE39; + +extern const u8 *gUnknown_80FE940; +extern const u8 *const gUnknown_80FE954; +extern const u8 gUnknown_8106BEC[]; +extern const u8 gUnknown_8106BF4[]; +extern const u8 *const gUnknown_80FE95C; +extern const u8 *const gUnknown_80FE960; +extern const u8 *const gUnknown_80FE964; +extern const u8 *const gUnknown_80FE978; +extern const u8 *const gWhichTextPtr2; + +EWRAM_DATA s32 gTeamMenuChosenId = 0; +static UNUSED EWRAM_DATA u8 sUnused[4] = {0}; +EWRAM_DATA static SpriteOAM gUnknown_202F268 = {0}; +EWRAM_DATA static WindowHeader sTeamWindowHeader = {0}; + +struct UnkFieldTeamMenuStruct +{ + s32 unk0; + s32 unk4[MAX_TEAM_MEMBERS]; + u8 unk14[MAX_TEAM_MEMBERS]; +}; + +static void PrintOnDungeonTeamMenu(struct UnkFieldTeamMenuStruct *a0, WindowTemplates *windows, bool8 a2); +static void AddTeamSubMenuOptions(struct UnkFieldTeamMenuStruct *a0); +static void ChosenSubMenuToAction(ActionContainer *a0, struct UnkFieldTeamMenuStruct *a1); +static void PrintMonTactics(s32 firstId, u8 *tacticIds, EntityInfo *mon, s32 windowId); +static void ShowUpArrowSprite(void); +static void ShowDownArrowSprite(void); +static void ShowIqDescriptionWindow(u8 iqSkillId); +static void ShowTacticDescriptionWindow(u8 tacticId); +static void ShowStatusInfoWindow(s32 a0); +static void PrintMoveNamesOnBottomWindow(Entity *entity); +static void PrintItemNameOnBottomWindow(Entity *entity); +static void ResetDungeonMenu(void); + +// Struct only used in Blue maybe? +static const u8 gUnknown_8106B8C[] = {1, 0, 56, 0, 0, 0, 24, 0, 24, 0, 0, 0, 2, 0, 56, 0, 104, 0, 24, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +bool8 ShowDungeonTeamMenu(Entity *a0) +{ + s32 i; + bool32 r10, ret; + struct UnkFieldTeamMenuStruct sp; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 14, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &sTeamWindowHeader, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + GetEntInfo(teamMon)->unk157 = TRUE; + } + } + + if (!gDungeon->unk644.unk17) { + windows.id[0].type = WINDOW_TYPE_NORMAL; + windows.id[0].pos.y++; + } + + while (1) { + s32 id; + bool32 r4; + + ret = FALSE; + PrintOnDungeonTeamMenu(&sp, &windows, TRUE); + r10 = FALSE; + while (1) { + s32 id = sp.unk4[gDungeonMenu.menuIndex]; + if (id >= 0) { + Entity *teamMon = gDungeon->teamPokemon[id]; + sub_806A2BC(teamMon, 0); + ChangeDungeonCameraPos(&teamMon->pos, 0, 1, 1); + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.pressed & START_BUTTON) { + if (sp.unk14[gDungeonMenu.menuIndex] != 0) { + PlayDungeonStartButtonSE(); + r10 = TRUE; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) + { + if (sp.unk14[gDungeonMenu.menuIndex] != 0) { + PlayDungeonConfirmationSE(); + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + ret = TRUE; + break; + } + } + + id = sp.unk4[gDungeonMenu.menuIndex]; + if (id >= 0) { + Entity *teamMon = gDungeon->teamPokemon[id]; + sub_806A2BC(teamMon, 0); + ChangeDungeonCameraPos(&teamMon->pos, 0, 1, 1); + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + sub_804AA60(); + if (ret) { + break; + } + + sp.unk0 = gDungeonMenu.menuIndex; + gTeamMenuChosenId = gDungeonMenu.menuIndex; + AddTeamSubMenuOptions(&sp); + if (r10) { + EntityInfo *info = GetEntInfo(a0); + SetMonsterActionFields(&info->action, 0x1B); + info->action.actionParameters[0].actionUseIndex = sp.unk4[sp.unk0]; + ret = FALSE; + break; + } + + CreateDungeonMenuSubWindow(&windows.id[0], 0x12); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + ChosenSubMenuToAction(&GetEntInfo(a0)->action, &sp); + PlayDungeonConfirmationSE(); + r4 = FALSE; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + r4 = TRUE; + break; + } + } + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + if (r4 != TRUE) { + ret = FALSE; + break; + } + } + + if (ret) { + sub_806A2BC(GetLeader(), 0); + } + sub_803EAF0(0, NULL); + return ret; +} + +static void PrintOnDungeonTeamMenu(struct UnkFieldTeamMenuStruct *a0, WindowTemplates *windows, bool8 a2) +{ + s32 r0; + DungeonPos pos; + s32 i; + + s32 count = 0; + bool8 r10 = (windows->id[0].type == WINDOW_TYPE_WITH_HEADER); + + sub_8069D18(&pos, GetLeader()); + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + EntityInfo *monInfo; + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + a0->unk4[count] = i; + monInfo = GetEntInfo(teamMon); + a0->unk14[count] = monInfo->unk157; + if (pos.x == teamMon->pos.x && pos.y == teamMon->pos.y && gTeamMenuChosenId < 0) { + gTeamMenuChosenId = count; + } + count++; + } + } + + if (gTeamMenuChosenId >= count) { + gTeamMenuChosenId = count - 1; + } + if (gTeamMenuChosenId < 0) { + gTeamMenuChosenId = 0; + } + + for (i = count; i < MAX_TEAM_MEMBERS; i++) { + a0->unk4[i] = -1; + a0->unk14[i] = 0; + } + + sTeamWindowHeader.count = 1; + sTeamWindowHeader.currId = 0; + sTeamWindowHeader.f3 = 0; + gDungeonMenu.menuIndex = gTeamMenuChosenId; + gDungeonMenu.unk1A = count; + gDungeonMenu.unk1C = count; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = (r10 != FALSE) * 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + r0 = sub_80095E4(count, 0); + if (r10) { + r0 += 2; + } + windows->id[0].unk10 = r0; + windows->id[0].height = r0; + sTeamWindowHeader.width = 8; + if (a2) { + windows->id[1] = windows->id[3]; + } + + DungeonShowWindows(windows, 1); + sub_80137B0(&gDungeonMenu, 0); + sub_80073B8(0); + if (r10) { + PrintFormattedStringOnWindow(0xC, 0, _("$t"), 0, 0); + } + + // Print hp/max hp + for (i = 0; i < count; i++) { + s32 y; + s32 id = a0->unk4[i]; + if (id >= 0) { + Entity *teamMon = gDungeon->teamPokemon[id]; + if (EntityIsValid(teamMon)) + { + EntityInfo *monInfo = GetEntInfo(teamMon); + s32 color = (a0->unk14[i] != 0) ? 6 : 2; + + sub_8070968(gFormatBuffer_Monsters[0], monInfo, color); + if (sub_806A538(gRecruitedPokemonRef->pokemon2[monInfo->teamIndex].unkA)) { + if (monInfo->HP <= monInfo->maxHPStat / 4) { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_RED_TINY}")); + } + else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 2) { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_RED_SMALL}")); + } + else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 3) { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_RED_MEDIUM}")); + } + else { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_RED_LARGE}")); + } + } + else { + if (monInfo->HP <= monInfo->maxHPStat / 4) { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_YELLOW_TINY}")); + } + else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 2) { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_YELLOW_SMALL}")); + } + else if (monInfo->HP <= (monInfo->maxHPStat / 4) * 3) { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_YELLOW_MEDIUM}")); + } + else { + InlineStrcpy(gFormatBuffer_Monsters[1], _("{HEART_YELLOW_LARGE}")); + } + } + + gFormatArgs[0] = monInfo->HP; + gFormatArgs[1] = monInfo->maxHPStat; + y = GetMenuEntryYCoord(&gDungeonMenu, i); + if (monInfo->isTeamLeader) { + PrintFormattedStringOnWindow(9, y, _("{STAR_BULLET}{POKEMON_0}{UNK_MACRO_3D}{0x59}{POKEMON_1}"), 0, 0); + } + else { + PrintFormattedStringOnWindow(9, y, _("{ICON_BLANK}{POKEMON_0}{UNK_MACRO_3D}{0x59}{POKEMON_1}"), 0, 0); + } + } + } + } + + sub_80073E0(0); +} + +static void AddTeamSubMenuOptions(struct UnkFieldTeamMenuStruct *a0) +{ + Entity *teamMon; + EntityInfo *monInfo; + + gDungeonSubMenuItemsCount = 0; + teamMon = gDungeon->teamPokemon[a0->unk4[gDungeonMenu.menuIndex]]; + monInfo = GetEntInfo(teamMon); + AddActionToDungeonSubMenu(ACTION_CHECK_SUMMARY, 0); + AddActionToDungeonSubMenu(ACTION_CHECK_MOVES, 0); + if (!monInfo->isTeamLeader) { + if (!gDungeon->unk644.unk19 && (monInfo->joinedAt.id != DUNGEON_JOIN_LOCATION_PARTNER || gDungeon->unk644.unk18)) { + AddActionToDungeonSubMenu(0x34, 0); + } + AddActionToDungeonSubMenu(ACTION_TALK_MENU, 0); + } + AddActionToDungeonSubMenu(0x30, 0); + if (!monInfo->isTeamLeader) { + AddActionToDungeonSubMenu(ACTION_CHANGE_TACTICS, 0); + } + if (!monInfo->isTeamLeader && gDungeon->unk644.unk18 && CanLeaderSwitch(gDungeon->unk644.dungeonLocation.id)) { + bool32 r5; + + AddActionToDungeonSubMenu(0x3B, 0); + r5 = TRUE; + if (monInfo->teamIndex >= MAX_TEAM_MEMBERS) { + r5 = FALSE; + } + else { + PokemonStruct2 *mon = &gRecruitedPokemonRef->pokemon2[monInfo->teamIndex]; + if (sub_806A538(mon->unkA)) { + r5 = FALSE; + } + } + + if (CheckVariousStatuses2(teamMon, FALSE)) { + r5 = FALSE; + } + if (!r5) { + SetActionUnusableInDungeonSubMenu(0x3B); + } + } + + if (IsExperienceLocked(monInfo->joinedAt.id)) { + SetActionUnusableInDungeonSubMenu(ACTION_CHECK_MOVES); + SetActionUnusableInDungeonSubMenu(0x3B); + SetActionUnusableInDungeonSubMenu(ACTION_CHANGE_TACTICS); + SetActionUnusableInDungeonSubMenu(ACTION_VIEW_IQ); + SetActionUnusableInDungeonSubMenu(0x34); + } + + sub_8045064(); +} + +static void ChosenSubMenuToAction(ActionContainer *a0, struct UnkFieldTeamMenuStruct *a1) +{ + SetMonsterActionFields(a0, gDungeonSubMenu[gDungeonMenu.menuIndex].actionId); + a0->actionParameters[0].actionUseIndex = a1->unk4[a1->unk0]; +} + +void ShowDungeonTacticsMenu(ActionContainer *a0) +{ + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 14, + .unk10 = 18, + .unk12 = 2, + .header = &sTeamWindowHeader, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + EntityInfo *monInfo; + u8 tacticIds[NUM_TACTICS]; + s32 scrollFirstId; + s32 menuIndex; + Entity *teamMon; + + teamMon = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + monInfo = GetEntInfo(teamMon); + menuIndex = 0; + scrollFirstId = 0; + while (1) { + s32 i; + bool32 addCursor = TRUE; + bool32 loopBreak = FALSE; + + sTeamWindowHeader.count = 1; + sTeamWindowHeader.currId = 0; + sTeamWindowHeader.width = 10; + sTeamWindowHeader.f3 = 0; + DungeonShowWindows(&windows, 1); + PrintMonTactics(scrollFirstId, tacticIds, monInfo, 0); + for (i = 0; i < 8; i++) { + if (tacticIds[i] == TACTIC_UNUSED) + break; + } + gDungeonMenu.unk1A = i; + gDungeonMenu.unk1C = 8; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + sub_80137B0(&gDungeonMenu, 0); + gDungeonMenu.menuIndex = menuIndex; + while (1) { + s32 i; + + AddMenuCursorSprite(&gDungeonMenu); + if (tacticIds[8] != TACTIC_UNUSED) { + ShowDownArrowSprite(); + } + if (scrollFirstId != 0) { + ShowUpArrowSprite(); + } + DungeonRunFrameActions(0x3D); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 7) { + if (tacticIds[8] != TACTIC_UNUSED) { + for (i = 0; i < 6; i++) { + ScrollDownWindowFunc(0); + DungeonRunFrameActions(0x3D); + } + scrollFirstId++; + } + menuIndex = 7; + break; + } + MoveMenuCursorDownWrapAround(&gDungeonMenu, FALSE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 0) { + if (scrollFirstId != 0) { + for (i = 0; i < 6; i++) { + ScrollUpWindowFunc(0); + DungeonRunFrameActions(0x3D); + } + scrollFirstId--; + } + menuIndex = 0; + break; + } + MoveMenuCursorUpWrapAround(&gDungeonMenu, FALSE); + } + if (gRealInputs.pressed & START_BUTTON) { + u32 tacticId = tacticIds[gDungeonMenu.menuIndex]; + menuIndex = gDungeonMenu.menuIndex; + PlayDungeonStartButtonSE(); + ShowTacticDescriptionWindow(tacticId); + loopBreak = FALSE; + break; + } + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + bool32 changed; + + u32 tacticId = tacticIds[gDungeonMenu.menuIndex]; + menuIndex = gDungeonMenu.menuIndex; + ResetDungeonMenu(); + PlayDungeonConfirmationSE(); + gDungeonSubMenuItemsCount = 0; + AddActionToDungeonSubMenu(0x2F, 0); + AddActionToDungeonSubMenu(0xC, 0); + if (CheckVariousStatuses2(teamMon, TRUE)) { + SetActionUnusableInDungeonSubMenu(0x2F); + } + CreateDungeonMenuSubWindow(&windows.id[0], 0x16); + while (1) { + changed = FALSE; + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x3D); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + changed = TRUE; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + changed = FALSE; + break; + } + } + if (changed) { + PlayDungeonConfirmationSE(); + if (gDungeonMenu.menuIndex == 0) { + PlaySoundEffect(0x133); + monInfo->tactic = tacticId; + monInfo->aiTarget.aiObjective = 6; + monInfo->aiTarget.aiTarget = NULL; + monInfo->aiTarget.unkC = 0; + monInfo->aiTarget.aiTargetSpawnGenID = 0; + if (!monInfo->isTeamLeader) { + AIMovement(teamMon, TRUE); + } + } + else { + ShowTacticDescriptionWindow(tacticId); + addCursor = FALSE; + } + } + loopBreak = FALSE; + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + loopBreak = TRUE; + break; + } + } + + if (addCursor) { + AddMenuCursorSprite(&gDungeonMenu); + } + DungeonRunFrameActions(0x3D); + if (loopBreak) + break; + } + sub_803EAF0(0, NULL); +} + +static void PrintMonTactics(s32 firstId, u8 *tacticIds, EntityInfo *mon, s32 windowId) +{ + u8 tacticsBuffer[NUM_TACTICS]; + u32 tactic; + s32 y, i, j; + + firstId--; + sub_80073B8(windowId); + PrintStringOnWindow(0x10, 0, gUnknown_80FE954, windowId, 0); + y = 0x14; + for (j = 0; j < 9; j++) { + tacticIds[j] = TACTIC_UNUSED; + } + GetAvailTacticsforLvl(tacticsBuffer, GetLeaderInfo()->level); + for (i = -1; i < 10; i++, y += 12, firstId++) { + if (firstId < 0) + continue; + if (firstId >= NUM_TACTICS) + continue; + + tactic = tacticsBuffer[firstId]; + if (i >= 0 && i < 9) { + tacticIds[i] = tactic; + } + if (tactic == TACTIC_UNUSED) + break; + + CopyTacticsNameToBuffer(gFormatBuffer_Monsters[0], tactic); + if (mon->tactic == tactic) { + PrintFormattedStringOnWindow(0x10, y, _("{STAR_BULLET}{POKEMON_0}"), windowId, 0); + } + else { + PrintFormattedStringOnWindow(0x10, y, _("{ICON_BLANK}{POKEMON_0}"), windowId, 0); + } + } + + sub_80073E0(windowId); +} + +enum +{ + SUB_WINDOW_NONE, + SUB_WINDOW_STATUS, + SUB_WINDOW_STATS, + SUB_WINDOW_FEATUERS, + SUB_WINDOW_IQ, + SUB_WINDOW_INFO, +}; + +// The way this function was written, it seems that they planned to put IQ skills in the Summary Menu first, but later decided to create a separate menu for it. +void ShowDungeonSummaryOrIQMenu(ActionContainer *a0, bool8 showIq) +{ + s32 subWindowIds[6]; + struct unkStruct_808FF20 unkMonStruct; + struct UnkInfoTabStruct unkInfoTabStruct; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 14, + .unk10 = 18, + .unk12 = 2, + .header = &sTeamWindowHeader, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + s32 r8; + Entity *entity; + s32 currSubWindowId; + s32 totalSubWindows; + EntityInfo *entityInfo; + + currSubWindowId = 0; + r8 = 0; + entity = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; + entityInfo = GetEntInfo(entity); + + if (IsExperienceLocked(entityInfo->joinedAt.id)) { + subWindowIds[0] = SUB_WINDOW_STATUS; + subWindowIds[1] = SUB_WINDOW_NONE; + subWindowIds[2] = SUB_WINDOW_NONE; + subWindowIds[3] = SUB_WINDOW_NONE; + subWindowIds[4] = SUB_WINDOW_NONE; + subWindowIds[5] = SUB_WINDOW_NONE; + totalSubWindows = 1; + } + else if (showIq) { + subWindowIds[0] = SUB_WINDOW_IQ; + subWindowIds[1] = SUB_WINDOW_NONE; + subWindowIds[2] = SUB_WINDOW_NONE; + subWindowIds[3] = SUB_WINDOW_NONE; + subWindowIds[4] = SUB_WINDOW_NONE; + subWindowIds[5] = SUB_WINDOW_NONE; + totalSubWindows = 1; + } + else { + subWindowIds[0] = SUB_WINDOW_STATS; + subWindowIds[1] = SUB_WINDOW_STATUS; + subWindowIds[2] = SUB_WINDOW_FEATUERS; + subWindowIds[3] = SUB_WINDOW_INFO; + subWindowIds[4] = SUB_WINDOW_NONE; + subWindowIds[5] = SUB_WINDOW_NONE; + totalSubWindows = 4; + } + + unkMonStruct.unk40 = 0; + unkMonStruct.unk56 = 0; + gDungeonMenu.menuIndex = 0; + + while (1) { + bool8 loopBreak = FALSE; + bool8 hasIqSkills = FALSE; + bool8 hasStatusProblems = FALSE; + bool8 addCursorSprite = TRUE; + Window *mainWindow = &gWindows[0]; + + sTeamWindowHeader.count = totalSubWindows; + sTeamWindowHeader.currId = currSubWindowId; + sTeamWindowHeader.width = 10; + sTeamWindowHeader.f3 = 0; + DungeonShowWindows(&windows, TRUE); + sub_8069844(&unkMonStruct, entity); + CreatePokemonInfoTabScreen(subWindowIds[currSubWindowId], currSubWindowId, &unkMonStruct, &unkInfoTabStruct, 0); + gDungeonMenu.unk1E = currSubWindowId; + gDungeonMenu.unk20 = totalSubWindows; + gDungeonMenu.unkC = (mainWindow->x + 15) * 8; + gDungeonMenu.unkE = ((mainWindow->y + 1) * 8) - 2; + gDungeonMenu.unk14.x = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 16; + gDungeonMenu.unk0 = 0; + sub_801317C(&gDungeonMenu.unk28); + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1A = 0; + gDungeonMenu.unk1C = 0; + + if (subWindowIds[currSubWindowId] == SUB_WINDOW_STATUS) { + s32 i; + + for (i = 0; i < 8; i++) { + if (unkInfoTabStruct.unkC[i] == 0) { + break; + } + } + + if (i != 0) { + hasStatusProblems = TRUE; + gDungeonMenu.unk1A = i; + gDungeonMenu.unk1C = 8; + sub_80137B0(&gDungeonMenu, 0); + } + gDungeonMenu.menuIndex = r8; + } + else if (subWindowIds[currSubWindowId] == SUB_WINDOW_IQ) { + s32 i; + + for (i = 0; i < 8; i++) { + if (unkInfoTabStruct.unk0[i] == 0) { + break; + } + } + + if (i != 0) { + hasIqSkills = TRUE; + gDungeonMenu.unk1A = i; + gDungeonMenu.unk1C = 8; + sub_80137B0(&gDungeonMenu, 0); + } + gDungeonMenu.menuIndex = r8; + } + + while (1) { + s32 unkVar; + bool8 r5, r6; + + AddMenuCursorSprite(&gDungeonMenu); + unkVar = sub_8014140(0, gUnknown_8106B8C); + r5 = FALSE; + r6 = FALSE; + if (hasIqSkills) { + if (unkInfoTabStruct.unk0[8] != 0) { + r5 = TRUE; + ShowDownArrowSprite(); + } + if (unkMonStruct.unk40 != 0) { + r6 = TRUE; + ShowUpArrowSprite(); + } + } + if (hasStatusProblems) { + if (unkInfoTabStruct.unkC[8] != 0) { + r5 = TRUE; + ShowDownArrowSprite(); + } + if (unkMonStruct.unk56 != 0) { + r6 = TRUE; + ShowUpArrowSprite(); + } + } + + DungeonRunFrameActions(0x1C); + if (sTeamWindowHeader.count > 1 && !sub_80048C8()) { + if ((gRealInputs.pressed & DPAD_RIGHT) || gDungeonMenu.unk28.dpad_right) { + PlayDungeonCursorSE(0); + currSubWindowId++; + if (subWindowIds[currSubWindowId] == SUB_WINDOW_NONE) { + currSubWindowId = 0; + } + break; + } + if ((gRealInputs.pressed & DPAD_LEFT) || gDungeonMenu.unk28.dpad_left) { + PlayDungeonCursorSE(0); + currSubWindowId--; + if (currSubWindowId == -1) { + currSubWindowId = 5; + while (subWindowIds[currSubWindowId] == SUB_WINDOW_NONE) { + currSubWindowId--; + } + } + break; + } + } + + if (hasStatusProblems) { + if (unkVar == 2 && r5) { + PlayDungeonCursorSE(0); + if (unkInfoTabStruct.unkC[8] != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollDownWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk56++; + } + r8 = 7; + break; + } + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(0); + if (gDungeonMenu.menuIndex == 7) { + if (unkInfoTabStruct.unkC[8] != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollDownWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk56++; + } + r8 = 7; + break; + } + else { + MoveMenuCursorDownWrapAround(&gDungeonMenu, FALSE); + } + } + + if (unkVar == 1 && r6) { + if (unkMonStruct.unk56 != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollUpWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk56--; + } + r8 = 0; + break; + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 0) { + if (unkMonStruct.unk56 != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollUpWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk56--; + } + r8 = 0; + break; + } + else { + MoveMenuCursorUpWrapAround(&gDungeonMenu, FALSE); + } + } + } + else if (hasIqSkills) { + if (unkVar == 2 && r5) { + if (unkInfoTabStruct.unk0[8] != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollDownWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk40++; + } + r8 = 7; + break; + } + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 7) { + if (unkInfoTabStruct.unk0[8] != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollDownWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk40++; + } + r8 = 7; + break; + } + else { + MoveMenuCursorDownWrapAround(&gDungeonMenu, FALSE); + } + } + + if (unkVar == 1 && r6) { + if (unkMonStruct.unk40 != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollUpWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk40--; + } + r8 = 0; + break; + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + if (gDungeonMenu.menuIndex == 0) { + if (unkMonStruct.unk40 != 0) { + s32 i; + for (i = 0; i < 6; i++) { + ScrollUpWindowFunc(0); + DungeonRunFrameActions(28); + } + unkMonStruct.unk40--; + } + r8 = 0; + break; + } + else { + MoveMenuCursorUpWrapAround(&gDungeonMenu, FALSE); + } + } + } + + if (sub_80048C8()) + continue; + + if (gRealInputs.pressed & START_BUTTON) { + if (hasStatusProblems) { + s32 var = unkInfoTabStruct.unkC[gDungeonMenu.menuIndex]; + + r8 = gDungeonMenu.menuIndex; + PlayDungeonStartButtonSE(); + ShowStatusInfoWindow(var); + addCursorSprite = FALSE; + loopBreak = FALSE; + break; + } + else if (hasIqSkills) { + s32 iqSkillId = unkInfoTabStruct.unk0[gDungeonMenu.menuIndex]; + + r8 = gDungeonMenu.menuIndex; + PlayDungeonStartButtonSE(); + ShowIqDescriptionWindow(iqSkillId); + addCursorSprite = FALSE; + loopBreak = FALSE; + break; + } + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (hasStatusProblems) { + s32 var = unkInfoTabStruct.unkC[gDungeonMenu.menuIndex]; + + r8 = gDungeonMenu.menuIndex; + ResetDungeonMenu(); + gDungeonSubMenuItemsCount = 0; + PlayDungeonConfirmationSE(); + AddActionToDungeonSubMenu(0xC, 0); + CreateDungeonMenuSubWindow(&windows.id[0], 0x16); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1C); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + PlayDungeonConfirmationSE(); + ShowStatusInfoWindow(var); + addCursorSprite = FALSE; + loopBreak = FALSE; + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + loopBreak = FALSE; + break; + } + } + } + else if (hasIqSkills) { + bool8 aPress = FALSE; + s32 var = unkInfoTabStruct.unk0[gDungeonMenu.menuIndex]; + + r8 = gDungeonMenu.menuIndex; + ResetDungeonMenu(); + gDungeonSubMenuItemsCount = 0; + PlayDungeonConfirmationSE(); + AddActionToDungeonSubMenu(0x28, 0); + AddActionToDungeonSubMenu(0xC, 0); + if (CheckVariousStatuses2(entity, TRUE)) { + SetActionUnusableInDungeonSubMenu(0x28); + } + CreateDungeonMenuSubWindow(&windows.id[0], 0x16); + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1C); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + PlayDungeonConfirmationSE(); + aPress = TRUE; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + loopBreak = FALSE; + aPress = FALSE; + break; + } + } + + if (aPress) { + if (gDungeonMenu.menuIndex == 0) { + PlaySoundEffect(0x133); + ToggleIQSkill(&entityInfo->IQSkillMenuFlags, var); + } + else { + ShowIqDescriptionWindow(var); + addCursorSprite = FALSE; + } + loopBreak = FALSE; + break; + } + } + else { + PlayDungeonConfirmationSE(); + loopBreak = TRUE; + } + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + loopBreak = TRUE; + break; + } + } + + if (addCursorSprite) { + if (hasIqSkills || hasStatusProblems) { + AddMenuCursorSprite(&gDungeonMenu); + } + DungeonRunFrameActions(0x1C); + } + + if (loopBreak) { + break; + } + } + + sub_803EAF0(0, NULL); + LoadIQSkills(entity); +} + +// The same as sub_8068344 +static void ShowUpArrowSprite(void) +{ + if ((gDungeonFramesCounter & 8) != 0) { + Window *window = &gWindows[0]; + SpriteOAM sprite = {0}; + + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 0); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 1); + SpriteSetMatrixNum(&sprite, 16); + SpriteSetSize(&sprite, 0); + SpriteSetTileNum(&sprite, 0x3F0); + SpriteSetPriority(&sprite, 0); + SpriteSetPalNum(&sprite, 15); + SpriteSetY(&sprite, (window->y * 8) + 0x8); + SpriteSetX(&sprite, (window->x * 8) + 0x40); + + AddSprite(&sprite, 0x100, NULL, NULL); + } +} + +// The same as sub_80684C4 +static void ShowDownArrowSprite(void) +{ + if ((gDungeonFramesCounter & 8) != 0) { + Window *window = &gWindows[0]; + SpriteOAM sprite = {0}; + + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 0); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 1); + SpriteSetMatrixNum(&sprite, 0); + SpriteSetSize(&sprite, 0); + SpriteSetTileNum(&sprite, 0x3F0); + SpriteSetPriority(&sprite, 0); + SpriteSetPalNum(&sprite, 15); + SpriteSetY(&sprite, (window->y * 8) + 0x70); + SpriteSetX(&sprite, (window->x * 8) + 0x40); + AddSprite(&sprite,0x100,NULL,NULL); + } +} + +void ShowStatusDescriptionMenuArrow(void) +{ + if ((gDungeonFramesCounter & 8) != 0) { + Window *window = &gWindows[0]; + + SpriteSetAffine1(&gUnknown_202F268, 0); + SpriteSetAffine2(&gUnknown_202F268, 0); + SpriteSetObjMode(&gUnknown_202F268, 0); + SpriteSetMosaic(&gUnknown_202F268, 0); + SpriteSetBpp(&gUnknown_202F268, 0); + SpriteSetShape(&gUnknown_202F268, 1); + SpriteSetMatrixNum(&gUnknown_202F268, 0); + SpriteSetSize(&gUnknown_202F268, 0); + SpriteSetTileNum(&gUnknown_202F268, 0x3F0); + SpriteSetPriority(&gUnknown_202F268, 0); + SpriteSetPalNum(&gUnknown_202F268, 15); + SpriteSetY(&gUnknown_202F268, (window->y * 8) + 0x60); + SpriteSetX(&gUnknown_202F268, 0x70); + AddSprite(&gUnknown_202F268,0x100,NULL,NULL); + } +} + +void ShowStatusesDescriptionMenu(s32 count, struct subStruct_203B240 **strings) +{ + s32 i; + MenuInputStructSub menuSub; + + sub_801317C(&menuSub); + for (i = 0; i < count; i++) { + ShowStatusDescriptionMenu(strings[i], &menuSub); + while (1) { + if (i < count - 1) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(0x16); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + PlayDungeonCancelSE(); + break; + } + } + } +} + +static void ShowIqDescriptionWindow(u8 iqSkillId) +{ + MenuInputStructSub menuSub; + WindowTemplates windows; + WindowHeader header; + struct subStruct_203B240 *result[4]; + + while (1) { + s32 count; + bool8 bPress; + + sub_801317C(&menuSub); + sub_80140B4(&windows); + windows.id[0].header = &header; + header.count = 1; + header.currId = 0; + header.width = 16; + header.f3 = 0; + DungeonShowWindows(&windows, TRUE); + sub_80073B8(0); + + strcpy(gFormatBuffer_Items[0], GetIQSkillName(iqSkillId)); + PrintFormattedStringOnWindow(16, 0, gUnknown_80FE95C, 0, '\0'); + PrintFormattedStringOnWindow(8, 16, GetIQSkillDescription(iqSkillId), 0, '\0'); + sub_80073E0(0); + count = sub_8097DF0(GetIQSkillDescription(iqSkillId), result); + while (1) { + if (count != 0) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(0x16); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + bPress = FALSE; + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + bPress = TRUE; + PlayDungeonCancelSE(); + break; + } + } + + if (bPress || count == 0) + break; + + ShowStatusesDescriptionMenu(count, result); + } + + sub_803E708(4, 0x3E); +} + +static void ShowTacticDescriptionWindow(u8 tacticId) +{ + MenuInputStructSub menuSub; + WindowTemplates windows; + WindowHeader header; + struct subStruct_203B240 *result[4]; + + while (1) { + s32 count; + bool8 bPress; + + sub_801317C(&menuSub); + sub_80140B4(&windows); + windows.id[0].header = &header; + header.count = 1; + header.currId = 0; + header.width = 16; + header.f3 = 0; + DungeonShowWindows(&windows, TRUE); + sub_80073B8(0); + + CopyTacticsNameToBuffer(gFormatBuffer_Items[0], tacticId); + PrintFormattedStringOnWindow(16, 0, gUnknown_80FE960, 0, '\0'); + PrintFormattedStringOnWindow(8, 16, GetTacticsDescription(tacticId), 0, '\0'); + sub_80073E0(0); + count = sub_8097DF0(GetTacticsDescription(tacticId), result); + while (1) { + if (count != 0) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(62); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + bPress = FALSE; + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + bPress = TRUE; + PlayDungeonCancelSE(); + break; + } + } + + if (bPress || count == 0) + break; + + ShowStatusesDescriptionMenu(count, result); + } + + sub_803E708(4, 0x3E); +} + +static void ShowStatusInfoWindow(s32 statusId) +{ + const u8 *str; + MenuInputStructSub menuSub; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 26, + .height = 12, + .unk10 = 12, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + sub_801317C(&menuSub); + header.count = 1; + header.currId = 0; + header.width = 16; + header.f3 = 0; + DungeonShowWindows(&windows, TRUE); + sub_80073B8(0); + str = sub_808E4FC(statusId); + strcpy(gFormatBuffer_Items[0], str); + PrintFormattedStringOnWindow(16, 0, gUnknown_80FE964, 0, '\0'); + PrintFormattedStringOnWindow(8, 16, sub_808E51C(statusId), 0, '\0'); + sub_80073E0(0); + + while (1) { + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(22); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + PlayDungeonCancelSE(); + break; + } + } + + sub_803E708(4, 0x3E); +} + +static const WindowHeader sBottomWindowHeader = {1, 0, 15, 0}; +static const WindowTemplate sMovesSubMenu = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 10}, + .width = 18, + .height = 8, + .unk10 = 8, + .unk12 = 0, + .header = &sBottomWindowHeader, +}; +static const WindowTemplate sItemSubMenu = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 10}, + .width = 18, + .height = 4, + .unk10 = 4, + .unk12 = 0, + .header = &sBottomWindowHeader, +}; + +Entity *ShowDungeonToWhichMonMenu(s32 *teamId, s32 caseId) +{ + struct UnkFieldTeamMenuStruct unkStruct; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_NORMAL, // Since the window has a header, it should probably be WINDOW_TYPE_WTIH_HEADER. + .pos = {14, 2}, + .width = 14, + .height = 16, + .unk10 = 16, + .unk12 = 0, + .header = &sTeamWindowHeader, + }, + [1] = { + .type = WINDOW_TYPE_NORMAL, + .pos = {2, 2}, + .width = 10, + .height = 2, + .unk10 = 2, + .unk12 = 0, + .header = NULL, + }, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + bool8 bPress = FALSE; + s32 prevId, currId; + + if (teamId != NULL) { + *teamId = -1; + } + + if (caseId == WHICH_MENU_MOVES) { + windows.id[2] = sMovesSubMenu; + } + else if (caseId == WHICH_MENU_ITEMS) { + windows.id[2] = sItemSubMenu; + } + + PrintOnDungeonTeamMenu(&unkStruct, &windows, FALSE); + sub_80073B8(1); + PrintStringOnWindow(4, 3, gWhichTextPtr2, 1, '\0'); + sub_80073E0(1); + prevId = -985; // Magic number or does it actually mean anything? + + while (1) { + currId = unkStruct.unk4[gDungeonMenu.menuIndex]; + + if (currId >= 0) { + Entity *entity = gDungeon->teamPokemon[currId]; + + if (EntityIsValid(entity) && prevId != currId) { + if (caseId == WHICH_MENU_MOVES) { + PrintMoveNamesOnBottomWindow(entity); + } + else if (caseId == WHICH_MENU_ITEMS) { + PrintItemNameOnBottomWindow(entity); + } + } + prevId = currId; + sub_806A2BC(entity, 0); + ChangeDungeonCameraPos(&entity->pos, 0, 1, 1); + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(1); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(1); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (unkStruct.unk14[gDungeonMenu.menuIndex] != 0) { + PlayDungeonConfirmationSE(); + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x1B); + sub_804AA60(); + sub_806A2BC(GetLeader(), 0); + sub_803EAF0(0, 0); + sub_803E708(4, 0x3E); + if (bPress) { + return NULL; + } + currId = unkStruct.unk4[gDungeonMenu.menuIndex]; + if (teamId != NULL) { + *teamId = currId; + } + if (currId >= 0) { + return gDungeon->teamPokemon[currId]; + } + + return NULL; +} + +static void PrintMoveNamesOnBottomWindow(Entity *entity) +{ + s32 x, y; + EntityInfo *entInfo = GetEntInfo(entity); + + CallPrepareTextbox_8008C54(2); + sub_80073B8(2); + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], entity, 0); + PrintFormattedStringOnWindow(12, 0, gUnknown_80FE978, 2, '\0'); + y = 16; + + if (entInfo->monsterBehavior == 1 || IsExperienceLocked(entInfo->joinedAt.id)) { + PrintFormattedStringOnWindow(12, y, _("????"), 2, '\0'); + } + else { + s32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) { + unkStruct_80928C0 movStruct = {0, 106, 0, 0}; + Move *move = &entInfo->moves.moves[i]; + + if (MoveFlagExists(move)) { + if (entInfo->isTeamLeader) { + movStruct.unk0 = 2; + } + else { + movStruct.unk0 = 4; + } + + movStruct.unk8 = (CanMonsterUseMove(entity, move, TRUE) == FALSE); + BufferMoveName(gFormatBuffer_Items[0], move, &movStruct); + + if (MoveFlagLinkChain(move)) { + x = 13; + } + else { + x = 8; + if (i != 0) { + AddDoubleUnderScoreHighlight(2, 12, y - 2, 120, 7); + } + } + PrintFormattedStringOnWindow(x, y, _("{MOVE_ITEM_0}"), 2, '\0'); + y += 12; + } + } + } + + sub_80073E0(2); +} + +static void PrintItemNameOnBottomWindow(Entity *entity) +{ + s32 x, y; + EntityInfo *entInfo = GetEntInfo(entity); + + CallPrepareTextbox_8008C54(2); + sub_80073B8(2); + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], entity, 0); + PrintFormattedStringOnWindow(12, 0, gUnknown_80FE940, 2, '\0'); + x = 8; + y = 18; + + if (entInfo->monsterBehavior == 1 || IsExperienceLocked(entInfo->joinedAt.id)) { + PrintFormattedStringOnWindow(8, y, _("????"), 2, '\0'); + } + else { + Item *item = &entInfo->heldItem; + if (!ItemExists(item)) { + PrintFormattedStringOnWindow(x, y, _("None"), 2, '\0'); + } + else { + sub_8045C18(gFormatBuffer_Items[0], item); + PrintFormattedStringOnWindow(x, y, _("{MOVE_ITEM_0}"), 2, '\0'); + } + } + + sub_80073E0(2); +} + +static void ResetDungeonMenu(void) +{ + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14.x = 0; + sub_801317C(&gDungeonMenu.unk28); +} diff --git a/src/dungeon_menu_tile.c b/src/dungeon_menu_tile.c new file mode 100644 index 000000000..e0e76768f --- /dev/null +++ b/src/dungeon_menu_tile.c @@ -0,0 +1,241 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_menu_tile.h" +#include "dungeon_menu_team.h" +#include "dungeon_menu_moves.h" +#include "dungeon_submenu.h" +#include "dungeon.h" +#include "text.h" +#include "menu_input.h" +#include "input.h" +#include "code_8044CC8.h" +#include "dungeon_action.h" +#include "dungeon_util.h" +#include "dungeon_map_access.h" +#include "code_8045A00.h" +#include "trap.h" +#include "code_8097DD0.h" + +extern void PlayDungeonStartButtonSE(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); +extern void PlayDungeonCursorSE(u8 param_1); +extern void sub_803EAF0(u32, u8 *); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern void DungeonRunFrameActions(u32 a0); +extern void DungeonShowWindows(WindowTemplates *a0, bool8 a1); +extern void AddActionToDungeonSubMenu(u16 actionId, u8 param_2); +extern void sub_8045064(void); + +extern MenuInputStruct gDungeonMenu; +extern s32 gDungeonSubMenuItemsCount; + +extern const u8 *const gUnknown_80FE708; +extern const u8 *const gTrapDescriptions[]; + +static void ShowAndPrintOnTileMenu(DungeonPos *pos, WindowTemplates *windows, WindowHeader *header); +static void AddTileSubMenuOptions(Entity *mon); +static void ShowTileDescription(DungeonPos *pos); + +void ShowDungeonTileMenu(Entity *mon) +{ + while (1) { + s32 inputAction = 0; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 4, + .unk10 = 16, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + PlayDungeonStartButtonSE(); + ShowAndPrintOnTileMenu(&mon->pos, &windows, &header); + DungeonRunFrameActions(0x2D); + AddTileSubMenuOptions(mon); + gDungeonMenu.unk8.x = 0; + gDungeonMenu.unk8.y = 0; + CreateDungeonMenuSubWindow(&windows.id[0], 22); + + while (1) { + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x2D); + if (gRealInputs.repeated & DPAD_DOWN) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorDownWrapAround(&gDungeonMenu, TRUE); + } + if (gRealInputs.repeated & DPAD_UP) { + PlayDungeonCursorSE(TRUE); + MoveMenuCursorUpWrapAround(&gDungeonMenu, TRUE); + } + + if ((gRealInputs.pressed & A_BUTTON) || gDungeonMenu.unk28.a_button) { + if (gDungeonMenu.menuIndex == 1) { + PlayDungeonConfirmationSE(); + ShowTileDescription(&mon->pos); + inputAction = 2; + break; + } + else if (CanSubMenuItemBeChosen(gDungeonMenu.menuIndex)) { + ActionContainer *action = &GetEntInfo(mon)->action; + + SetMonsterActionFields(action, gDungeonSubMenu[gDungeonMenu.menuIndex].actionId); + PlayDungeonConfirmationSE(); + action->actionParameters[0].actionUseIndex = 0; + action->actionParameters[0].itemPos.x = 0; + action->actionParameters[0].itemPos.y = 0; + action->actionParameters[1].actionUseIndex = 0; + action->actionParameters[1].itemPos.x = 0; + action->actionParameters[1].itemPos.y = 0; + inputAction = 0; + break; + } + PlayDungeonCancelSE(); + } + if ((gRealInputs.pressed & B_BUTTON) || gDungeonMenu.unk28.b_button) { + PlayDungeonCancelSE(); + inputAction = 1; + break; + } + } + + AddMenuCursorSprite(&gDungeonMenu); + DungeonRunFrameActions(0x2D); + if (inputAction != 2) + break; + } + + sub_803EAF0(0, 0); +} + +static void ShowAndPrintOnTileMenu(DungeonPos *pos, WindowTemplates *windows, WindowHeader *header) +{ + u8 text[80]; + const Tile *tile; + + header->count = 1; + header->currId = 0; + header->width = 12; + header->f3 = 0; + DungeonShowWindows(windows, TRUE); + sub_80073B8(0); + tile = GetTile(pos->x, pos->y); + + PrintStringOnWindow(12, 0, gUnknown_80FE708, 0, '\0'); + if (EntityIsValid(tile->object)) { + SubstitutePlaceholderStringTags(text, tile->object, 0); + PrintStringOnWindow(8, 18, text, 0, '\0'); + } + sub_80073E0(0); +} + +static void AddTileSubMenuOptions(Entity *mon) +{ + gDungeonSubMenuItemsCount = 0; + AddActionToDungeonSubMenu(ACTION_STEPPED_ON_TRAP, 0); + AddActionToDungeonSubMenu(ACTION_SHOW_INFO, 0); + sub_8045064(); +} + +static void ShowTileDescription(DungeonPos *pos) +{ + while (1) { + const Tile *tile; + Entity *object; + Trap *trap; + bool8 bPress = FALSE; + struct subStruct_203B240 *statuses[4]; + MenuInputStructSub menuSub; + WindowHeader header; + WindowTemplates windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 26, + .height = 12, + .unk10 = 12, + .unk12 = 0, + .header = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + u8 trapName[0x60]; + s32 i, statusesCount; + + sub_801317C(&menuSub); + header.count = 1; + header.currId = 0; + header.width = 16; + header.f3 = 0; + + tile = GetTile(pos->x, pos->y); + object = tile->object; + if (object == NULL) + break; + if (GetEntityType(object) != ENTITY_TRAP) + break; + + DungeonShowWindows(&windows, FALSE); + trap = GetTrapData(object); + GetTrapName(trapName, trap->id); + sub_80073B8(0); + PrintStringOnWindow(16, 0, trapName, 0, '\0'); + PrintStringOnWindow(8, 24, gTrapDescriptions[trap->id], 0, '\0'); + sub_80073E0(0); + statusesCount = sub_8097DF0(gTrapDescriptions[trap->id], statuses); + while (1) { + if (statusesCount != 0) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(0x16); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + PlayDungeonConfirmationSE(); + bPress = FALSE; + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + PlayDungeonCancelSE(); + bPress = TRUE; + break; + } + } + if (bPress || statusesCount == 0) + break; + + for (i = 0; i < statusesCount; i++) { + ShowStatusDescriptionMenu(statuses[i], &menuSub); + while (1) { + if (i < statusesCount - 1) { + ShowStatusDescriptionMenuArrow(); + } + nullsub_34(&menuSub, 0); + DungeonRunFrameActions(0x16); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + PlayDungeonConfirmationSE(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + PlayDungeonCancelSE(); + break; + } + } + } + } + + sub_803EAF0(0, 0); +} diff --git a/src/dungeon_message.c b/src/dungeon_message.c index ce445f182..69220ffc1 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -36,15 +36,16 @@ extern void sub_805E804(void); extern void sub_803EAF0(s32, s32); extern void sub_8083E28(void); extern u32 sub_8014140(s32 a0, const void *a1); -extern void sub_8083D30(void); -extern void sub_8083D08(void); +extern void PlayDungeonCancelSE(void); +extern void PlayDungeonConfirmationSE(void); extern void sub_8007334(s32 a0); extern void sub_80087EC(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); -extern void sub_8083CE0(u8 param_1); +extern void PlayDungeonCursorSE(u8 param_1); extern u32 gUnknown_202EDD0; extern u8 gUnknown_203B40C; -extern s32 gUnknown_202EDCC; +extern u8 gUnknown_202EE01; +extern s32 gDungeonFramesCounter; extern const u8 gUnknown_80F7AE8[]; extern const u8 gUnknown_80F7AF8[]; @@ -60,10 +61,6 @@ static EWRAM_DATA u8 sMessageLogFlags = 0; static EWRAM_DATA SpriteOAM sMessageLogArrowSpriteOAM = {0}; EWRAM_INIT u8 gUnknown_203B434 = 1; -// Used for sMessageLogFlags -#define FLAG_CAN_SCROLL_UP 0x1 -#define FLAG_CAN_SCROLL_DOWN 0x2 - void sub_80521D0(void) { s32 i; @@ -92,7 +89,7 @@ void sub_8052210(bool8 a0) if (a0 && gUnknown_202EDD0 == 3) { sub_803EAF0(0, 0); - sub_803E46C(11); + DungeonRunFrameActions(11); } } @@ -195,7 +192,7 @@ static void DisplayMessageAddToLog(Entity *pokemon, const u8 *str, bool8 r2) if (val != gDungeon->unk1BDD4.unk1C062) { break; } - sub_803E46C(0); + DungeonRunFrameActions(0); } if (*str == '\0') @@ -254,7 +251,7 @@ void xxx_draw_string_80524F0(void) sp.unk10 = 7; sub_80073B8(0); if (strPtr->unk1C054[id] != 0 && strPtr->unk1C066 >= 8) { - sub_80078A4(0, 0, strPtr->unk1C066 - 1, 0xE0, 7); + AddDoubleUnderScoreHighlight(0, 0, strPtr->unk1C066 - 1, 0xE0, 7); } while (1) { @@ -304,7 +301,7 @@ void sub_80526D0(s32 r0) { struct UnkStructDungeon1BDD4 *strPtr = &gDungeon->unk1BDD4; while (strPtr->unk1C06C != 0 || gDungeon->unk1BDD4.unk1C060 != gDungeon->unk1BDD4.unk1C062) { - sub_803E46C(r0); + DungeonRunFrameActions(r0); } } @@ -321,7 +318,7 @@ void sub_8052740(s32 a0) break; if (gRealInputs.pressed & JOY_EXCL_DPAD) break; - sub_803E46C(a0); + DungeonRunFrameActions(a0); } } @@ -332,7 +329,7 @@ void sub_8052740(s32 a0) \ do { \ DrawDialogueBoxString(); \ - sub_803E46C(9); \ + DungeonRunFrameActions(9); \ unkPrintRet = sub_80144A4(chosenMenuIndex);\ } while (unkPrintRet != 0); \ } @@ -771,7 +768,7 @@ void sub_8052FB8(const u8 *str) break; } DrawDialogueBoxString(); - sub_803E46C(9); + DungeonRunFrameActions(9); } while (r8 >= 0) { @@ -779,12 +776,12 @@ void sub_8052FB8(const u8 *str) SetBGPaletteBufferColorRGB(240 + j, &gFontPalette[j], r8 / 2, NULL); } DrawDialogueBoxString(); - sub_803E46C(9); + DungeonRunFrameActions(9); r8--; } ShowWindows(NULL, TRUE, TRUE); - sub_803E46C(9); + DungeonRunFrameActions(9); LoadDungeonMapPalette(); for (j = 0; j < 8; j++) { SetBGPaletteBufferColorArray(240 + j, &gFontPalette[j]); @@ -865,7 +862,7 @@ bool32 DisplayMessageLog(void) sub_801317C(&menuInput); sub_803EAF0(9, 0); do { - sub_803E46C(13); + DungeonRunFrameActions(13); unkRet = sub_8008D8C(0); } while (unkRet); @@ -887,7 +884,7 @@ bool32 DisplayMessageLog(void) scroll = TRUE; if (!scroll) { - sub_803E46C(0xD); + DungeonRunFrameActions(0xD); } if (sMessageLogFlags & FLAG_CAN_SCROLL_UP) { @@ -899,11 +896,11 @@ bool32 DisplayMessageLog(void) if (!sub_80048C8()) { if (gRealInputs.pressed & B_BUTTON || menuInput.b_button) { - sub_8083D30(); + PlayDungeonCancelSE(); break; } else if (gRealInputs.pressed & A_BUTTON) { - sub_8083D08(); + PlayDungeonConfirmationSE(); break; } } @@ -929,7 +926,7 @@ static void PutStringsOnMessageLog(void) if (msgLogString->unk0) { if (msgLogString->unk1) { - sub_80078A4(0, 0, y, 0xE0, 7); + AddDoubleUnderScoreHighlight(0, 0, y, 0xE0, 7); } PrintStringOnWindow(8, y + 3, msgLogString->str, 0, 0xD); y += 14; @@ -971,22 +968,22 @@ static bool8 TryScrollLogUp(s32 a0) return FALSE; } - sub_8083CE0(0); + PlayDungeonCursorSE(0); sub_80073B8(0); msgLogString = &gDungeon->messageLogStrings[arrId]; if (msgLogString->unk0) { sub_80087EC(0, 0, 0, 0xD0, 0x10); if (msgLogString->unk1) { - sub_80078A4(0, 0, y, 0xE0, 7); + AddDoubleUnderScoreHighlight(0, 0, y, 0xE0, 7); } PrintStringOnWindow(8, y + 3, msgLogString->str, 0, 0xD); } sub_80073E0(0); - sub_803E46C(0xD); + DungeonRunFrameActions(0xD); for (i = 0; i < 7; i++) { - gIwramTextFunc2(0); - sub_803E46C(0xD); + ScrollUpWindowFunc(0); + DungeonRunFrameActions(0xD); } sMessageLogCursor--; @@ -1021,22 +1018,22 @@ static bool8 TryScrollLogDown(s32 a0) return FALSE; } - sub_8083CE0(0); + PlayDungeonCursorSE(0); sub_80073B8(0); msgLogString = &gDungeon->messageLogStrings[arrId]; if (msgLogString->unk0) { sub_80087EC(0, 0, y, 0x68, 0x10); if (msgLogString->unk1) { - sub_80078A4(0, 0, y, 0xE0, 7); + AddDoubleUnderScoreHighlight(0, 0, y, 0xE0, 7); } PrintStringOnWindow(8, y + 3, msgLogString->str, 0, 0xD); } sub_80073E0(0); - sub_803E46C(0xD); + DungeonRunFrameActions(0xD); for (i = 0; i < 7; i++) { - gIwramTextFunc1(0); - sub_803E46C(0xD); + ScrollDownWindowFunc(0); + DungeonRunFrameActions(0xD); } sMessageLogCursor++; @@ -1045,8 +1042,8 @@ static bool8 TryScrollLogDown(s32 a0) static void CreateMessageLogArrow(bool8 upArrow, s32 y) { - struct UnkTextStruct1 *unkStr = &gUnknown_2027370[0]; - if (!(gUnknown_202EDCC & 8)) { + struct Window *window = &gWindows[0]; + if (!(gDungeonFramesCounter & 8)) { SpriteSetAffine1(&sMessageLogArrowSpriteOAM, 0); SpriteSetAffine2(&sMessageLogArrowSpriteOAM, 0); SpriteSetObjMode(&sMessageLogArrowSpriteOAM, 0); @@ -1054,8 +1051,8 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y) SpriteSetBpp(&sMessageLogArrowSpriteOAM, 0); SpriteSetMatrixNum(&sMessageLogArrowSpriteOAM, (upArrow != FALSE) ? (16) : 0); SpriteSetPalNum(&sMessageLogArrowSpriteOAM, 15); - SpriteSetY(&sMessageLogArrowSpriteOAM, (unkStr->unk2 * 8) + y); - SpriteSetX(&sMessageLogArrowSpriteOAM, (unkStr->unk0 * 8) + 92); + SpriteSetY(&sMessageLogArrowSpriteOAM, (window->y * 8) + y); + SpriteSetX(&sMessageLogArrowSpriteOAM, (window->x * 8) + 92); SpriteSetShape(&sMessageLogArrowSpriteOAM, 1); SpriteSetSize(&sMessageLogArrowSpriteOAM, 0); SpriteSetPriority(&sMessageLogArrowSpriteOAM, 0); diff --git a/src/dungeon_move.c b/src/dungeon_move.c index 95881ee7a..e73cad7f3 100644 --- a/src/dungeon_move.c +++ b/src/dungeon_move.c @@ -2285,7 +2285,7 @@ s32 sub_8056564(Entity *entity, DungeonPos *pos, Move *move, s32 r4) sub_800EF10(sub_80412E0(move->id, GetApparentWeather(entity), 1)); sub_800EF64(); - sub_803E46C(0x5E); + DungeonRunFrameActions(0x5E); someRetVal = sub_800E710(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), 1)); if (someRetVal != -1) { sub_800569C(&unkSp1.unk8, &entity->axObj.axdata, someRetVal); @@ -2438,7 +2438,7 @@ void sub_80566F8(Entity *attacker, Move *move, s32 a2, bool8 a3, s32 itemId, s32 r2 /= 2; sub_800E3AC(var_34, &var_64, r2 + var_38); } - sub_803E46C(0x30); + DungeonRunFrameActions(0x30); pos32.x += var_28; pos32.y += var_24; r9 += var_2C; diff --git a/src/dungeon_music.c b/src/dungeon_music.c index e0c12616f..4f6d5ec31 100644 --- a/src/dungeon_music.c +++ b/src/dungeon_music.c @@ -10,7 +10,7 @@ #include "text_util.h" -extern MenuInputStruct gUnknown_202EE10; +extern MenuInputStruct gDungeonMenu; extern u8 *gUnknown_80FE6F4[]; extern u8 gUnknown_810AC60; // 0xC @@ -138,14 +138,14 @@ bool8 sub_8083C88(u8 param_1) } } -void sub_8083CE0(u8 param_1) +void PlayDungeonCursorSE(bool8 checkMenuEntriesCount) { - if ((param_1 == 0) || (1 < gUnknown_202EE10.unk1A)) { + if ((!checkMenuEntriesCount) || (gDungeonMenu.unk1A > 1)) { PlayFanfareSE(0x12d,MAX_VOLUME); } } -void sub_8083D08(void) +void PlayDungeonConfirmationSE(void) { PlayFanfareSE(0x12E, MAX_VOLUME); } @@ -155,12 +155,12 @@ void sub_8083D1C(void) PlayFanfareSE(0x133, MAX_VOLUME); } -void sub_8083D30(void) +void PlayDungeonCancelSE(void) { PlayFanfareSE(0x12F, MAX_VOLUME); } -void sub_8083D44(void) +void PlayDungeonStartButtonSE(void) { PlayFanfareSE(0x130, MAX_VOLUME); } diff --git a/src/dungeon_submenu.c b/src/dungeon_submenu.c new file mode 100644 index 000000000..d77e36680 --- /dev/null +++ b/src/dungeon_submenu.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_submenu.h" +#include "menu_input.h" +#include "text.h" +#include "code_800D090.h" + +// The reason this short file(just 1 function) exists is because of the pksdir string which usually signifies the file's beginning. + +extern MenuInputStruct gDungeonMenu; +extern s32 gDungeonSubMenuItemsCount; + +extern u8 *GetDungeonSubMenuItemString(s32 param_1); +extern bool8 CanSubMenuItemBeChosen(s32 param_1); +extern void DungeonShowWindows(WindowTemplates *a0, u8 a1); + +void CreateDungeonMenuSubWindow(WindowTemplate *mainWindow, s32 subWindowX) +{ + s32 i; + WindowTemplates windows = { + .id = { + [0] = WINDOW_DUMMY, + [1] = { + .type = WINDOW_TYPE_NORMAL, + .pos = {22, 4}, + .width = 6, + .height = 4, + .unk10 = 4, + }, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + windows.id[0] = *mainWindow; + windows.id[0].unk0 = 0x80; + + gDungeonMenu.menuIndex = 0; + gDungeonMenu.unk1C = gDungeonSubMenuItemsCount; + gDungeonMenu.unk1A = gDungeonSubMenuItemsCount; + gDungeonMenu.unk1E = 0; + gDungeonMenu.unk20 = 0; + gDungeonMenu.unk4 = 0; + gDungeonMenu.firstEntryY = 0; + gDungeonMenu.unk0 = 1; + gDungeonMenu.unkC = 0; + gDungeonMenu.unkE = 0; + gDungeonMenu.unk14 = gDungeonMenu.unk8; + + sub_801317C(&gDungeonMenu.unk28); + + windows.id[1].pos.x = subWindowX; + windows.id[1].width = 28 - subWindowX; + windows.id[1].height = windows.id[1].unk10 = sub_80095E4(gDungeonMenu.unk1C, 0); + DungeonShowWindows(&windows, FALSE); + sub_80137B0(&gDungeonMenu, windows.id[1].height * 8); + sub_80073B8(1); + + for (i = 0; i < gDungeonSubMenuItemsCount; i++) { + s32 colorId, y; + u8 text[20]; + + colorId = (CanSubMenuItemBeChosen(i) != FALSE) ? 7 : 2; + sprintfStatic(text, _("{COLOR}%c%s"), colorId, GetDungeonSubMenuItemString(i)); + y = GetMenuEntryYCoord(&gDungeonMenu, i); + PrintStringOnWindow(8, y, text, 1, 0); + } + sub_80073E0(1); +} diff --git a/src/dungeon_util_1.c b/src/dungeon_util_1.c index 33bca699a..158e129fd 100644 --- a/src/dungeon_util_1.c +++ b/src/dungeon_util_1.c @@ -181,7 +181,7 @@ void sub_80856E0(Entity * pokemon, s32 direction) for(counter = 0; counter < 5; counter++) { entityInfo->unk174 = F248_Add(entityInfo->unk174, IntToF248(2)); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } entityInfo->action.direction = direction & DIRECTION_MASK; sub_806CE68(pokemon, direction); @@ -189,10 +189,10 @@ void sub_80856E0(Entity * pokemon, s32 direction) for(counter = 0; counter < 5; counter++) { entityInfo->unk174 = F248_Sub(entityInfo->unk174, IntToF248(2)); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } entityInfo->unk174.raw = 0; // weird one that doesn't match with struct assignment - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } void sub_8085764(void) @@ -265,12 +265,12 @@ void ShiftCameraToPosition(PixelPos *posStruct, s32 cameraSteps) XPos += XIncrement; YPos += YIncrement; sub_803F878(XPos,YPos); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); cameraSteps--; } while (cameraSteps != 0); } sub_803F878(posStruct->x,posStruct->y); - sub_803E46C(0x46); + DungeonRunFrameActions(0x46); } void SetFacingDirection(Entity *pokemon, s32 direction) diff --git a/src/exclusive_pokemon.c b/src/exclusive_pokemon.c index a4dde740f..96a7c7900 100644 --- a/src/exclusive_pokemon.c +++ b/src/exclusive_pokemon.c @@ -168,12 +168,10 @@ bool32 GetTutorialFlag(s32 index) } } -bool8 IsExclusivePokemonUnlocked(s16 pokeID) +bool8 IsExclusivePokemonUnlocked(s32 pokeID) { s32 index; - s32 pokeID_s32; - - pokeID_s32 = pokeID; + s32 pokeID_s32 = (s16) pokeID; for(index = 0; index < NUM_EXCLUSIVE_POKEMON; index++) { diff --git a/src/friend_areas_map_util.c b/src/friend_areas_map_util.c index 837ce5c89..78d96aacb 100644 --- a/src/friend_areas_map_util.c +++ b/src/friend_areas_map_util.c @@ -258,7 +258,7 @@ void FriendAreasMap_PrintCurrAreaName(void) u8 txt[200]; s32 id = gFriendAreasMapPtr->currLocationId; const struct FriendAreaLocationInfo *locationInfo = &gFriendAreasMapPtr->locationsInfo[id]; - Windows windows = {0}; + WindowTemplates windows = {0}; windows.id[0].type = WINDOW_TYPE_NORMAL; windows.id[0].pos.x = 7; @@ -295,7 +295,7 @@ void FriendAreasMap_PrintAvailableSubAreas(void) const struct FriendAreaLocationInfo *locationInfo = &gFriendAreasMapPtr->locationsInfo[id]; MenuInputStruct *menuInput = &gFriendAreasMapPtr->menu; WindowHeader header; - Windows windows = { + WindowTemplates windows = { .id = { [0] = { .type = WINDOW_TYPE_WITH_HEADER, @@ -303,7 +303,7 @@ void FriendAreasMap_PrintAvailableSubAreas(void) .width = 21, .height = 2, .unk10 = 2, - .unk14 = &header, + .header = &header, }, [1] = WINDOW_DUMMY, [2] = WINDOW_DUMMY, @@ -320,9 +320,9 @@ void FriendAreasMap_PrintAvailableSubAreas(void) } gFriendAreasMapPtr->displayedAreasCount = count; - header.f0 = 1; - header.f1 = 0; - header.f2 = 18; + header.count = 1; + header.currId = 0; + header.width = 18; header.f3 = 0; menuInput->menuIndex = 0; menuInput->unk1A = count; diff --git a/src/friend_rescue.c b/src/friend_rescue.c index da673ddcb..0f02fb76a 100644 --- a/src/friend_rescue.c +++ b/src/friend_rescue.c @@ -32,7 +32,7 @@ extern void SetFriendRescueMenuState(u32); extern TeamInventory *gTeamInventoryRef; -// NOTE: MenuItems and Window defined in here.. +// NOTE: MenuItems and WindowTemplate defined in here.. #include "data/friend_rescue_menus.h" const u8 gUnknown_80E25F4[] = "What would you like to do?"; diff --git a/src/hints_menu2.c b/src/hints_menu2.c index bc127ac88..52b2496d7 100644 --- a/src/hints_menu2.c +++ b/src/hints_menu2.c @@ -25,7 +25,7 @@ bool8 CreateHintDisplayScreen(u32 index) sUnknown_203B268->s0.unk38 = &sUnknown_203B268->s0.windows.id[0]; RestoreUnkTextStruct_8006518(&sUnknown_203B268->s0.windows); sUnknown_203B268->s0.windows.id[sUnknown_203B268->s0.unk34] = sUnknown_80DC0FC; - sUnknown_203B268->s0.unk38->unk14 = &sUnknown_203B268->unk9C; + sUnknown_203B268->s0.unk38->header = &sUnknown_203B268->unk9C; ResetUnusedInputStruct(); ShowWindows(&sUnknown_203B268->s0.windows, TRUE, TRUE); sub_8013818(&sUnknown_203B268->s0.input, 5, 1, sUnknown_203B268->s0.unk34); @@ -72,9 +72,9 @@ void DestroyHintDisplayScreen(void) static void sub_801E76C(void) { - sUnknown_203B268->unk9C.f0 = sUnknown_203B268->s0.input.unk20; - sUnknown_203B268->unk9C.f1 = sUnknown_203B268->s0.input.unk1E; - sUnknown_203B268->unk9C.f2 = 15; + sUnknown_203B268->unk9C.count = sUnknown_203B268->s0.input.unk20; + sUnknown_203B268->unk9C.currId = sUnknown_203B268->s0.input.unk1E; + sUnknown_203B268->unk9C.width = 15; sUnknown_203B268->unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&sUnknown_203B268->s0.windows, TRUE, TRUE); diff --git a/src/iq_skill_list_menu.c b/src/iq_skill_list_menu.c index b289a5cf6..9b74c99f2 100644 --- a/src/iq_skill_list_menu.c +++ b/src/iq_skill_list_menu.c @@ -33,7 +33,7 @@ bool8 CreateIQSkillListMenu(s16 species, u32 index, u32 a2) sIQSkillListMenu->s24.s0.unk38 = &sIQSkillListMenu->s24.s0.windows.id[index]; RestoreUnkTextStruct_8006518(&sIQSkillListMenu->s24.s0.windows); sIQSkillListMenu->s24.s0.windows.id[sIQSkillListMenu->s24.s0.unk34] = sUnknown_80DBDF0; - sIQSkillListMenu->s24.s0.unk38->unk14 = &sIQSkillListMenu->s24.unk9C; + sIQSkillListMenu->s24.s0.unk38->header = &sIQSkillListMenu->s24.unk9C; sub_8012D08(sIQSkillListMenu->s24.s0.unk38, a2); ResetUnusedInputStruct(); ShowWindows(&sIQSkillListMenu->s24.s0.windows, TRUE, TRUE); @@ -101,9 +101,9 @@ void CleanIQSkillListMenu(void) static void sub_801C440(void) { - sIQSkillListMenu->s24.unk9C.f0 = sIQSkillListMenu->s24.s0.input.unk20; - sIQSkillListMenu->s24.unk9C.f1 = sIQSkillListMenu->s24.s0.input.unk1E; - sIQSkillListMenu->s24.unk9C.f2 = 10; + sIQSkillListMenu->s24.unk9C.count = sIQSkillListMenu->s24.s0.input.unk20; + sIQSkillListMenu->s24.unk9C.currId = sIQSkillListMenu->s24.s0.input.unk1E; + sIQSkillListMenu->s24.unk9C.width = 10; sIQSkillListMenu->s24.unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&sIQSkillListMenu->s24.s0.windows, TRUE, TRUE); @@ -126,7 +126,7 @@ void BuildIQSkillList(void) PrintStringOnWindow(x2, 0, sIQSkills, sIQSkillListMenu->s24.s0.unk34, 0); x += 4; - x2 = x + sIQSkillListMenu->s24.unk9C.f2 * 8; + x2 = x + sIQSkillListMenu->s24.unk9C.width * 8; sub_8012BC4(x2, 0, sIQSkillListMenu->s24.s0.input.unk1E + 1, 1, 7, sIQSkillListMenu->s24.s0.unk34); for (counter = 0; counter < sIQSkillListMenu->s24.s0.input.unk1A; counter++) { diff --git a/src/items.c b/src/items.c index f8cc8f8a5..fa898c3b8 100644 --- a/src/items.c +++ b/src/items.c @@ -654,7 +654,7 @@ u32 sub_80913E0(Item* slot, u32 a2, struct subStruct_203B240 ** a3) u32 result; InitPokemonMove(buffer8, move); - sub_80078A4(a2, 4, 82, 200, COLOR_WHITE_2); + AddDoubleUnderScoreHighlight(a2, 4, 82, 200, COLOR_WHITE_2); PrintFormattedStringOnWindow(4, 84, gPtrTypeText, a2, 0); moves_data = GetMoveType(buffer8); typestring = GetUnformattedTypeString(moves_data); diff --git a/src/kecleon_bros2.c b/src/kecleon_bros2.c index ffe7467e5..eef49dd1a 100644 --- a/src/kecleon_bros2.c +++ b/src/kecleon_bros2.c @@ -28,7 +28,7 @@ bool8 sub_8019E40(u32 r0) gUnknown_203B214->s0.unk38 = &gUnknown_203B214->s0.windows.id[gUnknown_203B214->s0.unk34]; RestoreUnkTextStruct_8006518(&gUnknown_203B214->s0.windows); gUnknown_203B214->s0.windows.id[gUnknown_203B214->s0.unk34] = sUnknown_80DB8CC; - gUnknown_203B214->s0.unk38->unk14 = &gUnknown_203B214->unk9C; + gUnknown_203B214->s0.unk38->header = &gUnknown_203B214->unk9C; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B214->s0.windows, TRUE, TRUE); sub_8013818(&gUnknown_203B214->s0.input, CountKecleonShopItems(), 10, r0); @@ -107,9 +107,9 @@ void sub_801A010(void) static void sub_801A064(void) { - gUnknown_203B214->unk9C.f0 = gUnknown_203B214->s0.input.unk20; - gUnknown_203B214->unk9C.f1 = gUnknown_203B214->s0.input.unk1E; - gUnknown_203B214->unk9C.f2 = 10; + gUnknown_203B214->unk9C.count = gUnknown_203B214->s0.input.unk20; + gUnknown_203B214->unk9C.currId = gUnknown_203B214->s0.input.unk1E; + gUnknown_203B214->unk9C.width = 10; gUnknown_203B214->unk9C.f3 = 0; SUB_80095E4_CALL(gUnknown_203B214->s0); diff --git a/src/kecleon_bros3.c b/src/kecleon_bros3.c index af8b70663..78fb7a7d9 100644 --- a/src/kecleon_bros3.c +++ b/src/kecleon_bros3.c @@ -28,7 +28,7 @@ u8 sub_801A20C(u32 r0) gUnknown_203B21C->s0.unk38 = &gUnknown_203B21C->s0.windows.id[gUnknown_203B21C->s0.unk34]; RestoreUnkTextStruct_8006518(&gUnknown_203B21C->s0.windows); gUnknown_203B21C->s0.windows.id[gUnknown_203B21C->s0.unk34] = sUnknown_80DB914; - gUnknown_203B21C->s0.unk38->unk14 = &gUnknown_203B21C->unk9C; + gUnknown_203B21C->s0.unk38->header = &gUnknown_203B21C->unk9C; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B21C->s0.windows, TRUE, TRUE); sub_8013818(&gUnknown_203B21C->s0.input, CountKecleonWareItems(), 10, r0); @@ -108,9 +108,9 @@ void sub_801A3DC(void) static void sub_801A430(void) { - gUnknown_203B21C->unk9C.f0 = gUnknown_203B21C->s0.input.unk20; - gUnknown_203B21C->unk9C.f1 = gUnknown_203B21C->s0.input.unk1E; - gUnknown_203B21C->unk9C.f2 = 10; + gUnknown_203B21C->unk9C.count = gUnknown_203B21C->s0.input.unk20; + gUnknown_203B21C->unk9C.currId = gUnknown_203B21C->s0.input.unk1E; + gUnknown_203B21C->unk9C.width = 10; gUnknown_203B21C->unk9C.f3 = 0; SUB_80095E4_CALL(gUnknown_203B21C->s0); diff --git a/src/kecleon_bros4.c b/src/kecleon_bros4.c index e7d83f4dd..6a50ff9a5 100644 --- a/src/kecleon_bros4.c +++ b/src/kecleon_bros4.c @@ -38,7 +38,7 @@ bool8 sub_801A5D8(u32 param_1, s32 param_2, DungeonPos *param_3, u32 param_4) gUnknown_203B224->unk54.s0.unk38 = &gUnknown_203B224->unk54.s0.windows.id[param_2]; RestoreUnkTextStruct_8006518(&gUnknown_203B224->unk54.s0.windows); gUnknown_203B224->unk54.s0.windows.id[gUnknown_203B224->unk54.s0.unk34] = sUnknown_80DB95C; - gUnknown_203B224->unk54.s0.unk38->unk14 = &gUnknown_203B224->unk54.unk9C; + gUnknown_203B224->unk54.s0.unk38->header = &gUnknown_203B224->unk54.unk9C; if (param_3 != NULL) gUnknown_203B224->unk54.s0.windows.id[gUnknown_203B224->unk54.s0.unk34].pos = *param_3; @@ -173,9 +173,9 @@ void sub_801A928(void) static void sub_801A998(void) { - gUnknown_203B224->unk54.unk9C.f0 = gUnknown_203B224->unk54.s0.input.unk20; - gUnknown_203B224->unk54.unk9C.f1 = gUnknown_203B224->unk54.s0.input.unk1E; - gUnknown_203B224->unk54.unk9C.f2 = 11; + gUnknown_203B224->unk54.unk9C.count = gUnknown_203B224->unk54.s0.input.unk20; + gUnknown_203B224->unk54.unk9C.currId = gUnknown_203B224->unk54.s0.input.unk1E; + gUnknown_203B224->unk54.unk9C.width = 11; gUnknown_203B224->unk54.unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B224->unk54.s0.windows, TRUE, TRUE); diff --git a/src/load_screen.c b/src/load_screen.c index d15c565e5..acc17b55f 100644 --- a/src/load_screen.c +++ b/src/load_screen.c @@ -29,7 +29,7 @@ struct LoadScreen // size: 0x27c u32 currMenu; MenuStruct unk4[4]; - Windows unk144; + WindowTemplates unk144; /* 0x1A4 */ u8 formattedTeamName[0x24]; /* 0x1C8 */ u8 formattedPlayerName[0x24]; /* 0x1EC */ u8 formattedLocation[0x24]; @@ -48,7 +48,7 @@ void sub_80397B4(void); extern void sub_80920D8(u8 *); -const Window gUnknown_80E75F8 = { +const WindowTemplate gUnknown_80E75F8 = { 0, 0x03, 0x00, 0x00, @@ -57,7 +57,7 @@ const Window gUnknown_80E75F8 = { NULL }; -const Window gUnknown_80E7610 = { +const WindowTemplate gUnknown_80E7610 = { 0, 0x03, 0x02, 0x02, @@ -80,7 +80,7 @@ EWRAM_INIT MenuItem gUnknown_203B378[2] = { EWRAM_INIT u32 gUnknown_203B388[12] = {0xC, 0xC, 0xE, 0xE, 0xD, 0xE, 0xC, 0xD, 0xD, 0xB, 0xB, 0xB}; EWRAM_INIT u32 gUnknown_203B3B8[12] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1A, 0x18, 0x1B, 0x16, 0x19, 0x17}; -const Window gUnknown_80E762C = { +const WindowTemplate gUnknown_80E762C = { 0, 0x03, 0x02, 0x0F, @@ -124,7 +124,7 @@ const MenuItem gDeleteSaveConfirmMenuItems[3] = {NULL, 3}, }; -const Window gUnknown_80E7784 = +const WindowTemplate gUnknown_80E7784 = { 0, 0x03, diff --git a/src/mailbox.c b/src/mailbox.c index ead63f107..b9126a1e0 100644 --- a/src/mailbox.c +++ b/src/mailbox.c @@ -20,7 +20,7 @@ EWRAM_INIT struct unkStruct_203B304 *gUnknown_203B304 = {NULL}; -const Window gUnknown_80E0284 = +const WindowTemplate gUnknown_80E0284 = { 0, 0x03, @@ -30,7 +30,7 @@ const Window gUnknown_80E0284 = NULL }; -const Window gUnknown_80E029C = +const WindowTemplate gUnknown_80E029C = { 0, 0x03, @@ -40,7 +40,7 @@ const Window gUnknown_80E029C = NULL }; -const Window gUnknown_80E02B4 = +const WindowTemplate gUnknown_80E02B4 = { 0, 0x04, @@ -50,7 +50,7 @@ const Window gUnknown_80E02B4 = NULL }; -const Window gUnknown_80E02CC = +const WindowTemplate gUnknown_80E02CC = { 0, 0x04, diff --git a/src/main_menu1.c b/src/main_menu1.c index adf9cc8ae..b1627fbb9 100644 --- a/src/main_menu1.c +++ b/src/main_menu1.c @@ -291,9 +291,9 @@ void sub_8035C1C(void) sMainMenu->sub.unk2D = 0; } -void SetMenuItems(MenuStruct *a0, Windows *a1, s32 index, const Window *a3, const MenuItem *menuItems, bool8 a5, u32 menuAction, bool8 unused) +void SetMenuItems(MenuStruct *a0, WindowTemplates *a1, s32 index, const WindowTemplate *a3, const MenuItem *menuItems, bool8 a5, u32 menuAction, bool8 unused) { - Window *winPtrs = a1->id; + WindowTemplate *winPtrs = a1->id; winPtrs[index] = *a3; ResetUnusedInputStruct(); ShowWindows(a1, TRUE, TRUE); @@ -306,9 +306,9 @@ void SetMenuItems(MenuStruct *a0, Windows *a1, s32 index, const Window *a3, cons a0[index].unk4C = TRUE; } -void sub_8035CC0(Windows *dataArray, u32 index) +void sub_8035CC0(WindowTemplates *dataArray, u32 index) { - Window *winPtrs; + WindowTemplate *winPtrs; RestoreUnkTextStruct_8006518(dataArray); winPtrs = dataArray->id; diff --git a/src/makuhita_dojo2.c b/src/makuhita_dojo2.c index de517e53b..09ccdb020 100644 --- a/src/makuhita_dojo2.c +++ b/src/makuhita_dojo2.c @@ -34,7 +34,7 @@ bool8 sub_80302E8(s32 param_1, DungeonPos *param_2, u32 param_3) sMakuhitaDojoWork2->s30.s0.unk38 = &sMakuhitaDojoWork2->s30.s0.windows.id[param_1]; RestoreUnkTextStruct_8006518(&sMakuhitaDojoWork2->s30.s0.windows); sMakuhitaDojoWork2->s30.s0.windows.id[sMakuhitaDojoWork2->s30.s0.unk34] = sUnknown_80E0804; - sMakuhitaDojoWork2->s30.s0.unk38->unk14 = &sMakuhitaDojoWork2->s30.unk9C; + sMakuhitaDojoWork2->s30.s0.unk38->header = &sMakuhitaDojoWork2->s30.unk9C; if (param_2 != NULL) sMakuhitaDojoWork2->s30.s0.windows.id[sMakuhitaDojoWork2->s30.s0.unk34].pos = *param_2; @@ -101,9 +101,9 @@ void sub_8030480(void) static void sub_80304C8(void) { - sMakuhitaDojoWork2->s30.unk9C.f0 = 1; - sMakuhitaDojoWork2->s30.unk9C.f1 = 0; - sMakuhitaDojoWork2->s30.unk9C.f2 = 8; + sMakuhitaDojoWork2->s30.unk9C.count = 1; + sMakuhitaDojoWork2->s30.unk9C.currId = 0; + sMakuhitaDojoWork2->s30.unk9C.width = 8; sMakuhitaDojoWork2->s30.unk9C.f3 = 0; SUB_80095E4_CALL(sMakuhitaDojoWork2->s30.s0); @@ -122,7 +122,7 @@ static void MakuhitaDojo_DrawCourseList(void) CallPrepareTextbox_8008C54(sMakuhitaDojoWork2->s30.s0.unk34); sub_80073B8(sMakuhitaDojoWork2->s30.s0.unk34); PrintStringOnWindow(10, 0, sCourses, sMakuhitaDojoWork2->s30.s0.unk34, 0); - sub_8012BC4((sMakuhitaDojoWork2->s30.unk9C.f2 * 8) + 4, 0, sMakuhitaDojoWork2->s30.s0.input.unk1E + 1, 2, 7, sMakuhitaDojoWork2->s30.s0.unk34); + sub_8012BC4((sMakuhitaDojoWork2->s30.unk9C.width * 8) + 4, 0, sMakuhitaDojoWork2->s30.s0.input.unk1E + 1, 2, 7, sMakuhitaDojoWork2->s30.s0.unk34); for (i = 0; i < sMakuhitaDojoWork2->s30.s0.input.unk1A; i++) { iVar6 = sMakuhitaDojoWork2->unk0[sMakuhitaDojoWork2->s30.s0.input.unk1E * sMakuhitaDojoWork2->s30.s0.input.unk1C + i]; diff --git a/src/menu_input.c b/src/menu_input.c index 26eba7212..a973b4795 100644 --- a/src/menu_input.c +++ b/src/menu_input.c @@ -18,7 +18,7 @@ const u32 gDefaultMenuTextColors[3] = { COLOR_WHITE_2, COLOR_RED, COLOR_RED }; const WindowHeader UnkData_80D47C4 = {0x01, 0x00, 0x10, 0x00}; -const Window gUnknown_80D47C8[MAX_WINDOWS] = { +const WindowTemplate gUnknown_80D47C8[MAX_WINDOWS] = { 0, 0x06, 0x02, 0x02, @@ -223,7 +223,7 @@ void sub_8012C60(u32 x, u32 y, u32 a2, u32 color, u32 a4) xxx_call_draw_char(x + add_x, y, uVar2, color, a4); } -void sub_8012CAC(Window *a0, const MenuItem *a1) +void sub_8012CAC(WindowTemplate *a0, const MenuItem *a1) { s32 length; s32 maxLength; @@ -244,7 +244,7 @@ void sub_8012CAC(Window *a0, const MenuItem *a1) sub_8012D08(a0, count); } -void sub_8012D08(Window *param_1, s32 param_2) +void sub_8012D08(WindowTemplate *param_1, s32 param_2) { s32 sVar2; s16 sVar3; @@ -258,7 +258,7 @@ void sub_8012D08(Window *param_1, s32 param_2) param_1->unk10 = sVar3; } -void sub_8012D34(struct Window *param_1, s32 param_2) +void sub_8012D34(struct WindowTemplate *param_1, s32 param_2) { s32 sVar2; s16 sVar3; @@ -386,21 +386,20 @@ void sub_8012EBC(MenuStruct *param_1) const u32 *colorArray; s32 counter; s32 index; - Windows textStack; + WindowTemplates winTemplates; u8 buffer[256]; - UnkTextStruct1 *ptr_text; - Window *ptr_text2; + Window *window; if (param_1->unk4D) { sub_80073B8(param_1->index); index = param_1->index; - ptr_text = &gUnknown_2027370[index]; + window = &gWindows[index]; - if (ptr_text->unkC == 6) { - ptr_text2 = &textStack.id[index]; - RestoreUnkTextStruct_8006518(&textStack); + if (window->type == WINDOW_TYPE_WITH_HEADER) { + WindowTemplate *windowTemplate = &winTemplates.id[index]; + RestoreUnkTextStruct_8006518(&winTemplates); x = sub_8008ED0(param_1->unk0); - PrintFormattedStringOnWindow(((ptr_text2->unk14->f2 * 8 - x) / 2) + 8, 0, param_1->unk0, param_1->index, 0); + PrintFormattedStringOnWindow(((windowTemplate->header->width * 8 - x) / 2) + 8, 0, param_1->unk0, param_1->index, 0); } colorArray = param_1->menuTextColorArray; @@ -538,20 +537,18 @@ bool8 sub_8013114(MenuStruct *param_1, s32 *menuAction) return FALSE; } -static void sub_8013134(MenuInputStruct *param_1, u32 menuItemCounter, u32 index) +static void sub_8013134(MenuInputStruct *param_1, u32 menuItemCounter, u32 windowId) { - UnkTextStruct1 *temp; + Window *window = &gWindows[windowId]; - temp = &gUnknown_2027370[index]; - - param_1->unk0 = index; + param_1->unk0 = windowId; param_1->menuIndex = 0; param_1->unk1A = menuItemCounter; param_1->unk1C = menuItemCounter; param_1->unk1E = 0; param_1->unk4 = 0; - if (temp->unkC == 6) + if (window->type == WINDOW_TYPE_WITH_HEADER) param_1->firstEntryY = 16; else param_1->firstEntryY = 2; @@ -595,13 +592,14 @@ void AddMenuCursorSprite_(MenuInputStruct *a0, u8 *a1) SpriteSetMosaic(&sp, 0); SpriteSetBpp(&sp, 0); SpriteSetShape(&sp, 0); + SpriteSetMatrixNum(&sp, 0); SpriteSetSize(&sp, 0); SpriteSetTileNum(&sp, 0x3F4); SpriteSetPriority(&sp, 0); SpriteSetPalNum(&sp, 15); SpriteSetUnk6_0(&sp, 0); SpriteSetUnk6_1(&sp, 0); - SpriteSetX_MatrixNumSize0(&sp, a0->unk8.x); + SpriteSetX(&sp, a0->unk8.x); SpriteSetY(&sp, a0->unk8.y + 1); AddSprite(&sp, 0xFF, 0, 0); @@ -629,13 +627,14 @@ static void sub_801332C(DungeonPos *a0) SpriteSetMosaic(&sp, 0); SpriteSetBpp(&sp, 0); SpriteSetShape(&sp, 0); + SpriteSetMatrixNum(&sp, 0); SpriteSetSize(&sp, 0); SpriteSetTileNum(&sp, 0x3F5); SpriteSetPriority(&sp, 0); SpriteSetPalNum(&sp, 15); SpriteSetUnk6_0(&sp, 0); SpriteSetUnk6_1(&sp, 0); - SpriteSetX_MatrixNumSize0(&sp, a0->x); + SpriteSetX(&sp, a0->x); SpriteSetY(&sp, a0->y + 1); AddSprite(&sp, 0xFF, NULL, NULL); @@ -653,13 +652,14 @@ static void sub_8013470(MenuInputStruct *a0) SpriteSetMosaic(&sp, 0); SpriteSetBpp(&sp, 0); SpriteSetShape(&sp, 0); + SpriteSetMatrixNum(&sp, 0); SpriteSetSize(&sp, 0); SpriteSetTileNum(&sp, 0x3F2); SpriteSetPriority(&sp, 0); SpriteSetPalNum(&sp, 15); SpriteSetUnk6_0(&sp, 0); SpriteSetUnk6_1(&sp, 0); - SpriteSetX_MatrixNumSize0(&sp, a0->unkC); + SpriteSetX(&sp, a0->unkC); SpriteSetY(&sp, a0->unkE); AddSprite(&sp, 0xFF, NULL, NULL); @@ -671,13 +671,14 @@ static void sub_8013470(MenuInputStruct *a0) SpriteSetMosaic(&sp, 0); SpriteSetBpp(&sp, 0); SpriteSetShape(&sp, 0); + SpriteSetMatrixNum(&sp, 0); SpriteSetSize(&sp, 0); SpriteSetTileNum(&sp, 0x3F3); SpriteSetPriority(&sp, 0); SpriteSetPalNum(&sp, 15); SpriteSetUnk6_0(&sp, 0); SpriteSetUnk6_1(&sp, 0); - SpriteSetX_MatrixNumSize0(&sp, a0->unkC + 10); + SpriteSetX(&sp, a0->unkC + 10); SpriteSetY(&sp, a0->unkE); AddSprite(&sp, 0xFF, NULL, NULL); @@ -696,12 +697,12 @@ void sub_8013660(MenuInputStruct *param_1) void UpdateMenuCursorSpriteCoords(MenuInputStruct *param_1) { s32 index; - UnkTextStruct1 *temp; + Window *window; index = param_1->unk0; - temp = &gUnknown_2027370[index]; - param_1->unk8.x = temp->unk0 * 8 + param_1->unk4; - param_1->unk8.y = temp->unk2 * 8 + GetMenuEntryYCoord(param_1, param_1->menuIndex); + window = &gWindows[index]; + param_1->unk8.x = window->x * 8 + param_1->unk4; + param_1->unk8.y = window->y * 8 + GetMenuEntryYCoord(param_1, param_1->menuIndex); } void MoveMenuCursorDown(MenuInputStruct *param_1) @@ -718,7 +719,7 @@ void MoveMenuCursorDown(MenuInputStruct *param_1) } } -void sub_80136E0(MenuInputStruct *param_1, u8 param_2) +void MoveMenuCursorDownWrapAround(MenuInputStruct *param_1, u8 param_2) { param_1->unk24 = 0; @@ -750,7 +751,7 @@ void MoveMenuCursorUp(MenuInputStruct *param_1) } } -void sub_8013744(MenuInputStruct *param_1, u8 param_2) +void MoveMenuCursorUpWrapAround(MenuInputStruct *param_1, u8 param_2) { param_1->unk24 = 0; @@ -794,12 +795,12 @@ void sub_80137B0(MenuInputStruct *param_1, s32 param_2) iVar2 = param_2 << 8; } else { - if (gUnknown_2027370[param_1->unk0].unkC == 6) + if (gWindows[param_1->unk0].type == WINDOW_TYPE_WITH_HEADER) iVar1 = 16; else iVar1 = 0; - iVar2 = (gUnknown_2027370[param_1->unk0].unk6 * 8 - iVar1) << 8; + iVar2 = (gWindows[param_1->unk0].height * 8 - iVar1) << 8; } param_1->unk10 = iVar2 / param_1->unk1C; @@ -927,10 +928,10 @@ void sub_8013984(MenuInputStruct *param_1) { s32 iVar2; s32 iVar4; - UnkTextStruct1 *ptr; + Window *window; iVar4 = param_1->unk0; - ptr = &gUnknown_2027370[iVar4]; + window = &gWindows[iVar4]; if (param_1->unk1C == 0) param_1->unk1C++; @@ -953,7 +954,7 @@ void sub_8013984(MenuInputStruct *param_1) param_1->unk4 = 0; - if (ptr->unkC == 6) + if (window->type== WINDOW_TYPE_WITH_HEADER) param_1->firstEntryY = 16; else param_1->firstEntryY = 0; @@ -961,9 +962,9 @@ void sub_8013984(MenuInputStruct *param_1) if (param_1->unk20 < 2) param_1->unkC = 0; else - param_1->unkC = (ptr->unk0 + ptr->unk4 - 2) * 8; + param_1->unkC = (window->x + window->width - 2) * 8; - param_1->unkE = (ptr->unk2 + 1) * 8 - 2; + param_1->unkE = (window->y + 1) * 8 - 2; } void sub_8013A54(MenuInputStruct *param_1) @@ -1074,16 +1075,16 @@ void sub_8013C68(unkStructFor8013AA0 *a0) } for (i = 0; i < a0->unk10; i++) - sub_800792C(a0->unk14, a0->unk1C - ((i + 1) * 12) - 1, a0->unk20 + 10, 11, 5); + AddUnderScoreHighlight(a0->unk14, a0->unk1C - ((i + 1) * 12) - 1, a0->unk20 + 10, 11, 5); } void sub_8013D10(unkStructFor8013AA0 *a0) { s32 x, y; u8 uVar4; - UnkTextStruct1 *ptr; + Window *window; - ptr = &gUnknown_2027370[a0->unk14]; + window = &gWindows[a0->unk14]; uVar4 = a0->unk24; switch (sub_8012AE8()) { @@ -1101,10 +1102,10 @@ void sub_8013D10(unkStructFor8013AA0 *a0) a0->unk26 = 8; } - x = (a0->unk1C - ((a0->unk24 + 1) * 12) + (ptr->unk0 * 8)) - 3; + x = (a0->unk1C - ((a0->unk24 + 1) * 12) + (window->x * 8)) - 3; SpriteSetX(&a0->unk28, x); - y = a0->unk20 + (ptr->unk2 * 8) - 7; + y = a0->unk20 + (window->y * 8) - 7; SpriteSetY(&a0->unk28, y); } @@ -1148,7 +1149,7 @@ static bool8 sub_8013DD0(unkStructFor8013AA0 *a0) void sub_8013E54(void) { - UnkTextStruct1 *ptr = &gUnknown_2027370[0]; + Window *window = &gWindows[0]; SpriteOAM SStack_18 = {0}; SpriteSetAffine1(&SStack_18, 0); @@ -1162,7 +1163,7 @@ void sub_8013E54(void) SpriteSetTileNum(&SStack_18, 0x3F0); SpriteSetPriority(&SStack_18, 0); SpriteSetPalNum(&SStack_18, 15); - SpriteSetY(&SStack_18, (ptr->unk2 * 8) + 0x80); + SpriteSetY(&SStack_18, (window->y * 8) + 0x80); SpriteSetX(&SStack_18, 112); AddSprite(&SStack_18,0x100,0,0x0); @@ -1170,7 +1171,7 @@ void sub_8013E54(void) void sub_8013F84(void) { - UnkTextStruct1 *ptr = &gUnknown_2027370[0]; + Window *window = &gWindows[0]; SpriteOAM SStack_18 = {0}; SpriteSetAffine1(&SStack_18, 0); @@ -1184,13 +1185,13 @@ void sub_8013F84(void) SpriteSetTileNum(&SStack_18, 0x3F0); SpriteSetPriority(&SStack_18, 0); SpriteSetPalNum(&SStack_18, 15); - SpriteSetY(&SStack_18, (ptr->unk2 * 8) + 0x60); + SpriteSetY(&SStack_18, (window->y * 8) + 0x60); SpriteSetX(&SStack_18, 112); AddSprite(&SStack_18,0x100,0,0x0); } -void sub_80140B4(Windows *a0) +void sub_80140B4(WindowTemplates *a0) { s32 i; diff --git a/src/mission_reward.c b/src/mission_reward.c index b35434301..5973a4e68 100644 --- a/src/mission_reward.c +++ b/src/mission_reward.c @@ -22,7 +22,7 @@ struct unkStruct_203B310 /* 0xC */ s32 itemRewardIndex; unkStruct_802F204 *unk10; /* 0x14 */ struct MonPortraitMsg monPortrait; - Windows unk24; + WindowTemplates unk24; }; EWRAM_INIT struct unkStruct_203B310 *gUnknown_203B310 = {NULL}; @@ -41,7 +41,7 @@ enum FriendRewardStates REWARD_EXIT, }; -const Window gUnknown_80E041C = { +const WindowTemplate gUnknown_80E041C = { 0, 0x03, 0x00, 0x00, diff --git a/src/move_actions.c b/src/move_actions.c index a50f494ed..1a797a308 100644 --- a/src/move_actions.c +++ b/src/move_actions.c @@ -2616,7 +2616,7 @@ _0805A8C2: for(counter = 0; counter < 0xC; counter++) { IncreaseEntityPixelPos(target,pos2.x,pos2.y); - sub_803E46C(0x2c); + DungeonRunFrameActions(0x2c); } } tile = GetTileMut(pos1.x,pos1.y); @@ -2639,7 +2639,7 @@ _0805A9FE: for(counter = 0; counter < 0xC; counter++) { IncreaseEntityPixelPos(target, -pos2.x,-pos2.y); - sub_803E46C(0x2c); + DungeonRunFrameActions(0x2c); } } goto _0805AA5E; diff --git a/src/moves.c b/src/moves.c index 4b2c5fbb4..edad645eb 100644 --- a/src/moves.c +++ b/src/moves.c @@ -1403,7 +1403,7 @@ static void unk_MovePrintData(Move *move, s32 y) s32 power; const u8 *text; - sub_80078A4(y, 4, 72, 200, COLOR_WHITE_2); + AddDoubleUnderScoreHighlight(y, 4, 72, 200, COLOR_WHITE_2); sub_8092D54(gFormatBuffer_Monsters[0], move); PrintFormattedStringOnWindow(4, 74, gUnknown_810CF00, y, 0); PrintFormattedStringOnWindow(4, 86, gPtrTypeText, y, 0); diff --git a/src/options_menu2.c b/src/options_menu2.c index b7f943857..cb0a936b2 100644 --- a/src/options_menu2.c +++ b/src/options_menu2.c @@ -110,15 +110,15 @@ static void CreateOptionsMenu(void) switch (sUnknown_203B260->optionsMenu->windowColor) { case WINDOW_COLOR_BLUE: length = sub_8008ED0(sBlue); - sub_80078A4(sUnknown_203B260->unk44, (sUnknown_203B260->optionsMenu->windowColor * 40) + 80, y + 10, length, COLOR_WHITE_2); + AddDoubleUnderScoreHighlight(sUnknown_203B260->unk44, (sUnknown_203B260->optionsMenu->windowColor * 40) + 80, y + 10, length, COLOR_WHITE_2); break; case WINDOW_COLOR_RED: length = sub_8008ED0(sRed); - sub_80078A4(sUnknown_203B260->unk44, (sUnknown_203B260->optionsMenu->windowColor * 40) + 80, y + 10, length, COLOR_WHITE_2); + AddDoubleUnderScoreHighlight(sUnknown_203B260->unk44, (sUnknown_203B260->optionsMenu->windowColor * 40) + 80, y + 10, length, COLOR_WHITE_2); break; case WINDOW_COLOR_GREEN: length = sub_8008ED0(sGreen); - sub_80078A4(sUnknown_203B260->unk44, (sUnknown_203B260->optionsMenu->windowColor * 40) + 80, y + 10, length, COLOR_WHITE_2); + AddDoubleUnderScoreHighlight(sUnknown_203B260->unk44, (sUnknown_203B260->optionsMenu->windowColor * 40) + 80, y + 10, length, COLOR_WHITE_2); break; } diff --git a/src/other_menus1.c b/src/other_menus1.c index 9c3b97911..60001409f 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -119,7 +119,7 @@ static void sub_80371B8(void) { unkStruct_8035D94 *item; const MenuItem *MenuItems; - const Window *puVar5; + const WindowTemplate *puVar5; puVar5 = NULL; MenuItems = NULL; diff --git a/src/pelipper_board.c b/src/pelipper_board.c index 05fc3f7aa..13a521c0b 100644 --- a/src/pelipper_board.c +++ b/src/pelipper_board.c @@ -20,7 +20,7 @@ EWRAM_INIT struct unkStruct_203B308 *gPelipperBoard = {NULL}; -const Window gUnknown_80E0330 = +const WindowTemplate gUnknown_80E0330 = { 0, 0x03, @@ -30,7 +30,7 @@ const Window gUnknown_80E0330 = NULL }; -const Window gUnknown_80E0348 = +const WindowTemplate gUnknown_80E0348 = { 0, 0x03, @@ -40,7 +40,7 @@ const Window gUnknown_80E0348 = NULL }; -const Window gUnknown_80E0360 = +const WindowTemplate gUnknown_80E0360 = { 0, 0x04, @@ -50,7 +50,7 @@ const Window gUnknown_80E0360 = NULL }; -const Window gUnknown_80E0378 = +const WindowTemplate gUnknown_80E0378 = { 0, 0x04, diff --git a/src/personality_test1.c b/src/personality_test1.c index 8eed940c8..20a2253b9 100644 --- a/src/personality_test1.c +++ b/src/personality_test1.c @@ -386,7 +386,7 @@ static void PersonalityTest_DisplayStarterSprite(void) s32 paletteIndex; s32 emotionId; const u8 *gfx; - Windows stackArray; + WindowTemplates stackArray; starterID = sPersonalityTestTracker->unk4.StarterID; RestoreUnkTextStruct_8006518(&stackArray); diff --git a/src/personality_test2.c b/src/personality_test2.c index b40f611e8..c82d295fe 100644 --- a/src/personality_test2.c +++ b/src/personality_test2.c @@ -40,11 +40,11 @@ void CreatePartnerSelectionMenu(s16 starterID) gUnknown_203B404->s18.s0.windows.id[2] = gUnknown_80F4278; gUnknown_203B404->s18.s0.windows.id[3] = gUnknown_80F4278; - gUnknown_203B404->s18.s0.unk38->unk14 = &gUnknown_203B404->s18.unk9C; + gUnknown_203B404->s18.s0.unk38->header = &gUnknown_203B404->s18.unk9C; - gUnknown_203B404->s18.unk9C.f0 = 1; - gUnknown_203B404->s18.unk9C.f1 = 0; - gUnknown_203B404->s18.unk9C.f2 = 6; + gUnknown_203B404->s18.unk9C.count = 1; + gUnknown_203B404->s18.unk9C.currId = 0; + gUnknown_203B404->s18.unk9C.width = 6; gUnknown_203B404->s18.unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B404->s18.s0.windows, TRUE, TRUE); diff --git a/src/pokemon_news1.c b/src/pokemon_news1.c index 92770b943..037a09d9f 100644 --- a/src/pokemon_news1.c +++ b/src/pokemon_news1.c @@ -136,7 +136,7 @@ static void CreatePKMNNewsMenu(void) sub_80073B8(sUnknown_203B2CC->s38.unk34); PrintStringOnWindow(10, 0, sNewsList, sUnknown_203B2CC->s38.unk34, 0); - sub_8012BC4((sUnknown_80DFBE8.f2 * 8) + 4, 0, sUnknown_203B2CC->s38.input.unk1E + 1, 2, 7, sUnknown_203B2CC->s38.unk34); + sub_8012BC4((sUnknown_80DFBE8.width * 8) + 4, 0, sUnknown_203B2CC->s38.input.unk1E + 1, 2, 7, sUnknown_203B2CC->s38.unk34); for (index = 0; index < sUnknown_203B2CC->s38.input.unk1A; index++) { y = GetMenuEntryYCoord(&sUnknown_203B2CC->s38.input, index); diff --git a/src/pokemon_news3.c b/src/pokemon_news3.c index ee129ad59..655690036 100644 --- a/src/pokemon_news3.c +++ b/src/pokemon_news3.c @@ -38,7 +38,7 @@ bool8 sub_802BD14(s32 a0, DungeonPos *a1, u32 a2) sUnknown_203B2D8->unk4.s0.unk38 = &sUnknown_203B2D8->unk4.s0.windows.id[a0]; RestoreUnkTextStruct_8006518(&sUnknown_203B2D8->unk4.s0.windows); sUnknown_203B2D8->unk4.s0.windows.id[sUnknown_203B2D8->unk4.s0.unk34] = sUnknown_80DFC74; - sUnknown_203B2D8->unk4.s0.unk38->unk14 = &sUnknown_203B2D8->unk4.unk9C; + sUnknown_203B2D8->unk4.s0.unk38->header = &sUnknown_203B2D8->unk4.unk9C; if (a1 != NULL) sUnknown_203B2D8->unk4.s0.windows.id[sUnknown_203B2D8->unk4.s0.unk34].pos = *a1; @@ -114,9 +114,9 @@ void sub_802BEDC(void) static void sub_802BF30(void) { - sUnknown_203B2D8->unk4.unk9C.f0 = 1; - sUnknown_203B2D8->unk4.unk9C.f1 = 0; - sUnknown_203B2D8->unk4.unk9C.f2 = 12; + sUnknown_203B2D8->unk4.unk9C.count = 1; + sUnknown_203B2D8->unk4.unk9C.currId = 0; + sUnknown_203B2D8->unk4.unk9C.width = 12; sUnknown_203B2D8->unk4.unk9C.f3 = 0; SUB_8009614_CALL(sUnknown_203B2D8->unk4.s0); } diff --git a/src/rescue_password_menu.c b/src/rescue_password_menu.c index 77d0d9ebd..7c38bfb8a 100644 --- a/src/rescue_password_menu.c +++ b/src/rescue_password_menu.c @@ -26,7 +26,7 @@ EWRAM_INIT u8 gUnknown_203B368 = {1}; EWRAM_INIT u32 gUnknown_203B36C = {65502}; EWRAM_INIT struct RescuePasswordMenu *gRescuePasswordMenu = {NULL}; -const Window gUnknown_80E71E4 = { +const WindowTemplate gUnknown_80E71E4 = { 0, 0x03, 0x00, 0x00, @@ -35,7 +35,7 @@ const Window gUnknown_80E71E4 = { NULL }; -const Window gUnknown_80E71FC = { +const WindowTemplate gUnknown_80E71FC = { 0, 0x03, 0x03, 0x09, @@ -59,7 +59,7 @@ ALIGNED(4) const u8 CheckAgain_80E7234[] = _("{CENTER_ALIGN}Please check it agai ALIGNED(4) const u8 IncorrectPassword_80E7250[] = _("{CENTER_ALIGN}Incorrect password!"); ALIGNED(4) const u8 Error_80E7268[] = _("{CENTER_ALIGN}{COLOR RED}Error!{RESET} "); -const Window gUnknown_80E7278 = { +const WindowTemplate gUnknown_80E7278 = { 0, 0x03, 0x03, 0x09, @@ -83,7 +83,7 @@ ALIGNED(4) const u8 DATA_80E72B0[] = " "; ALIGNED(4) const u8 PasswordAccept_80E72B4[] = _("{CENTER_ALIGN}The password has been accepted."); ALIGNED(4) const u8 Success_80E72D8[] = _("{CENTER_ALIGN}{COLOR CYAN_G}Success!{RESET} "); -const Window gUnknown_80E72EC = { +const WindowTemplate gUnknown_80E72EC = { 0, 0x03, 0x03, 0x09, @@ -103,7 +103,7 @@ const MenuItem gUnknown_80E7304[4] = { ALIGNED(4) const u8 NotSOSMail_80E7324[] = _("{CENTER_ALIGN}This is not an {COLOR CYAN_G}SOS Mail{RESET}."); -const Window gUnknown_80E7344 = { +const WindowTemplate gUnknown_80E7344 = { 0, 0x03, 0x03, 0x09, @@ -123,7 +123,7 @@ const MenuItem gUnknown_80E735C[4] = { ALIGNED(4) const u8 ReceiveSOSMail_80E737C[] = _("{CENTER_ALIGN}This {COLOR CYAN_G}SOS Mail{RESET} has been received already."); -const Window gUnknown_80E73AC = { +const WindowTemplate gUnknown_80E73AC = { 0, 0x03, 0x03, 0x09, @@ -143,7 +143,7 @@ const MenuItem gUnknown_80E73C4[4] = { ALIGNED(4) const u8 sUnknown_80E73E4[] = _("{CENTER_ALIGN}This is not an {COLOR CYAN_G}A-OK Mail{RESET}."); -const Window gUnknown_80E7408 = { +const WindowTemplate gUnknown_80E7408 = { 0, 0x03, 0x03, 0x09, @@ -163,7 +163,7 @@ const MenuItem gUnknown_80E7420[4] = { ALIGNED(4) const u8 sUnknown_80E7440[] = _("{CENTER_ALIGN}This {COLOR CYAN_G}A-OK Mail{RESET} cannot be used."); -const Window gUnknown_80E7468 = { +const WindowTemplate gUnknown_80E7468 = { 0, 0x03, 0x03, 0x09, @@ -182,7 +182,7 @@ const MenuItem gUnknown_80E7480[4] = { }; ALIGNED(4) const u8 sUnknown_80E74A0[] = _("{CENTER_ALIGN}This is not a {COLOR CYAN_G}Thank-You Mail{RESET}."); -const Window gUnknown_80E74C8 = { +const WindowTemplate gUnknown_80E74C8 = { 0, 0x03, 0x03, 0x09, @@ -202,7 +202,7 @@ const MenuItem gUnknown_80E74E0[4] = { ALIGNED(4) const u8 sUnknown_80E7500[] = _("{CENTER_ALIGN}This {COLOR CYAN_G}Thank-You Mail{RESET} cannot be used."); -const Window gUnknown_80E752C = { +const WindowTemplate gUnknown_80E752C = { 0, 0x03, 0x03, 0x09, @@ -221,7 +221,7 @@ const MenuItem gUnknown_80E7544[4] = { }; ALIGNED(4) const u8 sUnknown_80E7564[] = _("{CENTER_ALIGN}This is not a {COLOR CYAN_G}Wonder Mail{RESET}."); -const Window gUnknown_80E7588 = { +const WindowTemplate gUnknown_80E7588 = { 0, 0x03, 0x03, 0x09, diff --git a/src/save_menu.c b/src/save_menu.c index 3ff3fb918..74e5a7c2f 100644 --- a/src/save_menu.c +++ b/src/save_menu.c @@ -12,7 +12,7 @@ static EWRAM_INIT SaveMenuWork *sUnknown_203B364 = {NULL}; -const Window gUnknown_80E6F20 = +const WindowTemplate gUnknown_80E6F20 = { 0, 0x03, @@ -22,7 +22,7 @@ const Window gUnknown_80E6F20 = NULL }; -const Window gUnknown_80E6F38 = +const WindowTemplate gUnknown_80E6F38 = { 0, 0x03, diff --git a/src/status.c b/src/status.c index b0581100c..22b92fe9a 100644 --- a/src/status.c +++ b/src/status.c @@ -984,7 +984,7 @@ void sub_80783C4(Entity * pokemon, Entity * target, bool8 param_3) if ((((EntityIsValid(entity)) && (target != entity)) && (u8)(GetEntInfo(entity)->curseClassStatus.status - 2U) < 2)) { EndCurseClassStatus(pokemon,entity,STATUS_NONE); - sub_803E46C(0x2a); + DungeonRunFrameActions(0x2a); } } sub_8041D38(target); diff --git a/src/string_format.c b/src/string_format.c index 21130c246..03197d8c1 100644 --- a/src/string_format.c +++ b/src/string_format.c @@ -60,7 +60,7 @@ u32 sub_8014140(void) // This kinda looks like the 'true' beginning of the file static const u32 gUnknown_80D48A0[] = {0x7, 0x2, 0x2}; -static const struct Window gUnknown_80D48AC = { +static const struct WindowTemplate gUnknown_80D48AC = { 0x00, 0x03, 0x00, 0x00, @@ -68,7 +68,7 @@ static const struct Window gUnknown_80D48AC = { 0x00, 0x00, 0x00 }; -static const Window gUnknown_80D48C4 = { +static const WindowTemplate gUnknown_80D48C4 = { 0x00, 0x00, 0x02, 0x0F, @@ -77,7 +77,7 @@ static const Window gUnknown_80D48C4 = { NULL }; -static const Window gUnknown_80D48DC = { +static const WindowTemplate gUnknown_80D48DC = { 0x00, 0x02, 0x02, 0x08, @@ -148,7 +148,7 @@ static EWRAM_DATA s32 gUnknown_202EC1C = 0; // Only read, but never written to. Possibly used in Blue? struct NeverWrittenToStruct202EC20 { - struct Window unk0; + struct WindowTemplate unk0; const u8 *unk18; }; static EWRAM_DATA struct NeverWrittenToStruct202EC20 *sNeverWrittenToUnknownStructPtr = NULL; @@ -156,7 +156,7 @@ static UNUSED EWRAM_DATA u8 sUnusedEwram1[4] = {0}; static EWRAM_DATA MenuInputStructSub gUnknown_202EC28 = {0}; -static EWRAM_INIT Windows sUnknown_203B198 = { +static EWRAM_INIT WindowTemplates sUnknown_203B198 = { .id = { [0] = { .pos = {2, 15}, @@ -260,7 +260,7 @@ void CreateMenuDialogueBoxAndPortrait(const u8 *text, void *a1, u32 r9, const Me gUnknown_202E748.unk0 = 4; gUnknown_202E748.unk2 = 4; gUnknown_202E748.unk8 = 0x70; - gUnknown_202E748.unkA = (gUnknown_2027370[0].unk2 * 8) + 34; + gUnknown_202E748.unkA = (gWindows[0].y * 8) + 34; gUnknown_202E748.unk10 = 7; gUnknown_202E748.unk1C = 0; gUnknown_202E748.unk20 = 0; @@ -541,7 +541,7 @@ void DrawDialogueBoxString(void) } gUnknown_202E748.unk8 = 0x70; - gUnknown_202E748.unkA = (gUnknown_2027370[0].unk2 * 8) + 34; + gUnknown_202E748.unkA = (gWindows[0].y * 8) + 34; } keepLooping = FALSE; } diff --git a/src/text.c b/src/text.c index cf7aa1c23..b14c37e19 100644 --- a/src/text.c +++ b/src/text.c @@ -23,7 +23,7 @@ extern const char gUnknown_80B88C0[]; // "fontsppa" // system_sbin.s extern const struct FileArchive gSystemFileArchive; -EWRAM_DATA UnkTextStruct1 gUnknown_2027370[4] = {0}; +EWRAM_DATA Window gWindows[MAX_WINDOWS] = {0}; EWRAM_DATA static struct CharMapStruct *sCharmaps[2] = {NULL}; EWRAM_DATA static s16 sCharacterSpacing = 0; EWRAM_DATA u8 gUnknown_202749A[11] = {0}; @@ -33,7 +33,7 @@ EWRAM_DATA static s32 sCurrentCharmap = 0; EWRAM_DATA static vu32 sUnknown_20274B0 = 0; EWRAM_DATA static u32 sUnknown_20274B4[0xEC0] = {0}; EWRAM_DATA static OpenedFile *sCharmapFiles[3] = {NULL}; -EWRAM_DATA static Windows sUnknown_202AFC0 = {0}; +EWRAM_DATA static WindowTemplates sSavedWindows = {0}; EWRAM_DATA static s32 sUnknown_202B020 = 0; EWRAM_DATA static s32 sUnknown_202B024 = 0; EWRAM_DATA static s32 sCharHeight[2] = {0}; @@ -41,52 +41,52 @@ EWRAM_DATA static u32 sTextShadowMask = 0; // Some text color info is stored; re EWRAM_DATA static u8 sDrawTextShadow = 0; EWRAM_DATA ALIGNED(4) u16 gBgTilemaps[4][32][32] = {0}; -IWRAM_DATA static s16 gUnknown_3000E94[161] = {0}; +IWRAM_DATA ALIGNED(4) static s16 gUnknown_3000E94[161] = {0}; // These text-related functions were deemed important as they're copied and run from IWRAM for improved performance. -static void sub_8272774(UnkTextStruct1 *txtStructs, s32 id); -static void sub_8272884(UnkTextStruct1 *txtStructs, s32 id); -static void sub_82729B8(UnkTextStruct1 *txtStructs, s32 id); -static void sub_8272A8C(UnkTextStruct1 *txtStructs, s32 id); -void sub_8272760(s32 id); -void sub_8272870(s32 id); +static void ScrollDownWindowInternal(Window *txtStructs, s32 id); +static void ScrollUpWindowInternal(Window *txtStructs, s32 id); +static void sub_82729B8(Window *txtStructs, s32 id); +static void sub_8272A8C(Window *txtStructs, s32 id); +void ScrollDownWindow(s32 windowId); +void ScrollUpWindow(s32 windowId); void sub_82729A4(s32 id); void sub_8272A78(s32 id); -EWRAM_INIT void (*gIwramTextFunc1)(s32 a0) = sub_8272760; -EWRAM_INIT void (*gIwramTextFunc2)(s32 a0) = sub_8272870; +EWRAM_INIT void (*ScrollDownWindowFunc)(s32 windowId) = ScrollDownWindow; +EWRAM_INIT void (*ScrollUpWindowFunc)(s32 windowId) = ScrollUpWindow; EWRAM_INIT void (*gIwramTextFunc3)(s32 a0) = sub_82729A4; EWRAM_INIT void (*gIwramTextFunc4)(s32 a0) = sub_8272A78; // This variable is only used in InitGraphics function, which may or may not belong to text.c EWRAM_INIT u8 gUnknown_203B090 = 0; -static void SaveUnkTextStructAndXXX_8006438(const Windows *a0, bool8 a1, bool8 a2, DungeonPos *a3); -static void sub_8006554(UnkTextStruct1 *a0, u32 *a1, u32 *a2, u16 *a3, u32 a4, const Window *a5, bool8 a6, u32 a7, DungeonPos *a8, u8 a9); -static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3); -static void sub_80069CC(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4); -static void sub_8006AC4(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4); -static void sub_8006B70(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4); -static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3); -static void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 *a4); -static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5); +static void ShowWindowsInternal(const WindowTemplates *a0, bool8 a1, bool8 a2, DungeonPos *a3); +static void AddWindow(Window *windows, u32 *vram, u32 *a2, u16 *a3, u32 windowId, const WindowTemplate *winTemplate, bool8 a6, s32 firstBlockId, DungeonPos *positionModifier, u8 a9); +static void sub_800677C(Window *a0, s32 a1, u16 *a2, u8 a3); +static void sub_80069CC(Window *a0, s32 a1, s32 a2, s32 a3, u16 *a4); +static void sub_8006AC4(Window *a0, s32 a1, s32 a2, s32 a3, u16 *a4); +static void sub_8006B70(Window *a0, s32 a1, s32 a2, s32 a3, u16 *a4); +static void sub_8006C44(Window *a0, s32 a1, u16 *a2, u8 a3); +static void sub_8006E94(Window *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 *a4); +static u32 xxx_draw_char(struct Window *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5); static void nullsub_129(u32 a0, s32 x, s32 y, s32 a3, u32 color); -static void sub_8007958(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color); -static void sub_8007AA4(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color); -static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color); -static void sub_8007D00(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color); -static void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8); -static void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8); -static void DisplayMonPortrait(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4); -static void DisplayMonPortraitFlipped(UnkTextStruct1 *a0, s32 a1, const u8 *compressedData, s32 a3); -static void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8); -static void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -static bool8 xxx_update_bg_vram(UnkTextStruct1 *a0); -static void sub_800898C(void); -static void sub_80089AC(const Window *r4, DungeonPos *r5_Str); -static void PrepareTextbox_8008C6C(UnkTextStruct1 *strArr, u32 strId); -static void xxx_draw_string(UnkTextStruct1 *strArr, s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 characterSpacing, s32 lineSpacing); -static const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct UnkDrawStringStruct *sp); +static void AddUnderScoreHighlightInternal(Window *windows, u32 windowId, s32 x, s32 y, s32 width, u32 color); +static void sub_8007AA4(struct Window *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color); +static void sub_8007BA8(Window *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color); +static void sub_8007D00(Window *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color); +static void sub_8007E64(Window *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8); +static void sub_8008030(Window *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8); +static void DisplayMonPortrait(Window *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4); +static void DisplayMonPortraitFlipped(Window *a0, s32 a1, const u8 *compressedData, s32 a3); +static void sub_80084A4(Window *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8); +static void sub_8008818(Window *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +static bool8 xxx_update_bg_vram(Window *a0); +static void ResetWindowBgData(void); +static void sub_80089AC(const WindowTemplate *r4, DungeonPos *r5_Str); +static void PrepareTextbox_8008C6C(Window *strArr, u32 strId); +static void xxx_draw_string(Window *strArr, s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 characterSpacing, s32 lineSpacing); +static const u8 *HandleTextFormat(Window *strArr, const u8 *str, struct UnkDrawStringStruct *sp); static void sub_8009388(void); static s32 InterpretColorChar(u8 a0); @@ -110,7 +110,7 @@ static const u32 gUnknown_80B853C[16] = 0xEEEEEEEE, }; -static const Windows sDummyWindows = +static const WindowTemplates sDummyWindows = { .id = { [0] = WINDOW_DUMMY, @@ -182,20 +182,20 @@ void LoadCharmaps(void) sCharHeight[1] = 12; for (k = 0; k < 4; k++) { - gUnknown_2027370[k].unk4 = 0; - gUnknown_2027370[k].unk8 = 0; - gUnknown_2027370[k].unk46 = 0; + gWindows[k].width = 0; + gWindows[k].unk8 = 0; + gWindows[k].unk46 = 0; } sCharacterSpacing = 0; for (i = 0; i < 20; i++) { - gBgTilemaps[0][i][0] = 0xf279; - gBgTilemaps[1][i][0] = 0xf27a; + gBgTilemaps[0][i][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x279); + gBgTilemaps[1][i][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); for (j = 1; j < 32; j++) { gBgTilemaps[0][i][j] = 0; - gBgTilemaps[1][i][j] = 0xf27a; + gBgTilemaps[1][i][j] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); } } @@ -272,34 +272,32 @@ void SetCharacterMask(int a0) sTextShadowMask = retval; } -void ShowWindows(const Windows *windows, bool8 a1, bool8 a2) +void ShowWindows(const WindowTemplates *winTemplates, bool8 a1, bool8 a2) { DungeonPos positionModifier = {0, 0}; - SaveUnkTextStructAndXXX_8006438(windows, a1, a2, &positionModifier); + ShowWindowsInternal(winTemplates, a1, a2, &positionModifier); } // https://decomp.me/scratch/xF5Y1 -static void SaveUnkTextStructAndXXX_8006438(const Windows *a0, bool8 a1, bool8 a2, DungeonPos *a3) +static void ShowWindowsInternal(const WindowTemplates *winTemplates, bool8 a1, bool8 a2, DungeonPos *positionModifier) { s32 i; - u32 r9; + s32 area = 2; - r9 = 2; - - if (a0 == NULL) - a0 = &sDummyWindows; + if (winTemplates == NULL) + winTemplates = &sDummyWindows; if (a2) sub_8009388(); - sub_800898C(); + ResetWindowBgData(); - for (i = 0; i < 4; i++) { - sUnknown_202AFC0.id[i] = a0->id[i]; + for (i = 0; i < MAX_WINDOWS; i++) { + sSavedWindows.id[i] = winTemplates->id[i]; - if (a0->id[i].width) { - sub_8006554(gUnknown_2027370, (u32 *)VRAM, sUnknown_20274B4, &gBgTilemaps[0][0][0], gUnknown_80B8804[i], &a0->id[i], a1, r9, a3, 0); - sub_80089AC(&a0->id[i], a3); - r9 += a0->id[i].width * a0->id[i].unk10; + if (winTemplates->id[i].width != 0) { + AddWindow(gWindows, (u32 *)VRAM, sUnknown_20274B4, &gBgTilemaps[0][0][0], gUnknown_80B8804[i], &winTemplates->id[i], a1, area, positionModifier, 0); + sub_80089AC(&winTemplates->id[i], positionModifier); + area += winTemplates->id[i].width * winTemplates->id[i].unk10; } } @@ -316,11 +314,11 @@ UNUSED static void nullsub_152(void) { } -void RestoreUnkTextStruct_8006518(Windows *unkData) +void RestoreUnkTextStruct_8006518(WindowTemplates *unkData) { s32 i; - for (i = 0; i < 4; i++) - unkData->id[i] = sUnknown_202AFC0.id[i]; + for (i = 0; i < MAX_WINDOWS; i++) + unkData->id[i] = sSavedWindows.id[i]; } UNUSED static void nullsub_153(void) @@ -332,126 +330,120 @@ u32 sub_8006544(u32 index) return gUnknown_80B8814[index]; } -// a1 is a VRAM pointer -static void sub_8006554(UnkTextStruct1 *a0, u32 *a1, u32 *a2, u16 *a3, u32 a4, const Window *a5, bool8 a6, u32 a7, DungeonPos *a8, u8 a9) +static void AddWindow(Window *windows, u32 *vram, u32 *a2, u16 *a3, u32 windowId, const WindowTemplate *winTemplate, bool8 a6, s32 firstBlockId, DungeonPos *positionModifier, u8 a9) { - UnkTextStruct1 *t1; - s32 iVar3; - s32 iVar5; - s32 iVar6; + Window *newWindow; + s32 x, y; s32 numI; u32 uVar1; - s32 temp; - s32 i; - s32 j; + newWindow = &windows[windowId]; + x = winTemplate->pos.x + positionModifier->x; + y = winTemplate->pos.y + positionModifier->y; + newWindow->x = x; + newWindow->y = y; + newWindow->width = winTemplate->width; + newWindow->unk8 = winTemplate->unk10; + newWindow->height = winTemplate->height; + newWindow->type = winTemplate->type; + newWindow->unk10 = firstBlockId; - t1 = &a0[a4]; - iVar3 = a5->pos.x + a8->x; - iVar5 = a5->pos.y + a8->y; - t1->unk0 = iVar3; - t1->unk2 = iVar5; - t1->unk4 = a5->width; - t1->unk8 = a5->unk10; - t1->unk6 = a5->height; - t1->unkC = a5->type; - t1->unk10 = a7; - - if (t1->unkC == 6) - t1->unk14 = a7; + if (newWindow->type == WINDOW_TYPE_WITH_HEADER) + newWindow->unk14 = firstBlockId; else - t1->unk14 = a7 + a5->unk12 * t1->unk4; + newWindow->unk14 = firstBlockId + winTemplate->unk12 * newWindow->width; - t1->unk18 = &a2[t1->unk10 * 8]; - t1->unk1C = &a2[t1->unk14 * 8]; - t1->unk24 = a5->unk12; - t1->unk28 = &a1[t1->unk14 * 8]; + newWindow->unk18 = &a2[newWindow->unk10 * 8]; + newWindow->unk1C = &a2[newWindow->unk14 * 8]; + newWindow->unk24 = winTemplate->unk12; + newWindow->unk28 = &vram[newWindow->unk14 * 8]; - if (t1->unkC == 6) - t1->unk2C = t1->unk4 * (t1->unk6 + a5->unk12) * 32; + if (newWindow->type == WINDOW_TYPE_WITH_HEADER) + newWindow->unk2C = newWindow->width * (newWindow->height + winTemplate->unk12) * 32; else - t1->unk2C = t1->unk4 * t1->unk6 * 32; + newWindow->unk2C = newWindow->width * newWindow->height * 32; - t1->unk30 = 0; - t1->unk34 = 0; - t1->unk38 = 0; - t1->unk20 = (t1->unk4 * 8) - 8; - t1->unk45 = t1->unkC == 0; + newWindow->unk30 = 0; + newWindow->unk34 = 0; + newWindow->unk38 = 0; + newWindow->unk20 = (newWindow->width * 8) - 8; + newWindow->unk45 = newWindow->type == WINDOW_TYPE_0; - if (t1->unk8 == 0) + if (newWindow->unk8 == 0) return; - if ((a5->unk0 & 0xA0) != 0x80) { - temp = iVar5 - 1; + if ((winTemplate->unk0 & 0xA0) != 0x80) { + s32 newY = y - 1; + s32 i, j; - if (t1->unkC == 6) { - uVar1 = a6 ? t1->unk14 : 0; + if (newWindow->type == WINDOW_TYPE_WITH_HEADER) { + uVar1 = a6 ? newWindow->unk14 : 0; - sub_8006E94(t1, temp, uVar1, a5->unk14, a3); + sub_8006E94(newWindow, newY, uVar1, winTemplate->header, a3); - temp = iVar5 + 2; - uVar1 = a6 ? t1->unk14 + t1->unk4 * (a5->unk12 + 2) : 0; - numI = t1->unk6 - 2; + newY = y + 2; + uVar1 = a6 ? newWindow->unk14 + newWindow->width * (winTemplate->unk12 + 2) : 0; + numI = newWindow->height - 2; } else { - sub_800677C(t1, temp, a3, a9); + sub_800677C(newWindow, newY, a3, a9); - temp = iVar5; - uVar1 = a6 ? t1->unk14 : 0; - numI = t1->unk6; + newY = y; + uVar1 = a6 ? newWindow->unk14 : 0; + numI = newWindow->height; } for (i = 0; i < numI; i++) { - iVar6 = iVar3 - 1; - sub_80069CC(t1, iVar6, temp, i, a3); - iVar6 = iVar3; + s32 newX = x - 1; + sub_80069CC(newWindow, newX, newY, i, a3); + newX = x; - for (j = 0; j < t1->unk4; j++) { - sub_8006AC4(t1, iVar6, temp, uVar1, a3); + for (j = 0; j < newWindow->width; j++) { + sub_8006AC4(newWindow, newX, newY, uVar1, a3); - iVar6++; + newX++; if (a6) uVar1++; } - sub_8006B70(t1, iVar6, temp, i, a3); - temp++; + sub_8006B70(newWindow, newX, newY, i, a3); + newY++; } - sub_8006C44(t1, temp, a3, a9); + sub_8006C44(newWindow, newY, a3, a9); } - if ((a5->unk0 & 0x80) == 0) - PrepareTextbox_8008C6C(a0, a4); + if ((winTemplate->unk0 & 0x80) == 0) + PrepareTextbox_8008C6C(windows, windowId); - t1->unk46 = 0; + newWindow->unk46 = 0; } -static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) +static void sub_800677C(Window *window, s32 a1, u16 *a2, u8 a3) { s32 iVar5; s32 i; - iVar5 = a0->unk0 - 1; + iVar5 = window->x - 1; if (a1 > 28) return; if (a1 < 0) return; - switch (a0->unkC) { - case 0: - case 1: - case 2: - case 6: + switch (window->type) { + case WINDOW_TYPE_0: + case WINDOW_TYPE_WITHOUT_BORDER: + case WINDOW_TYPE_2: + case WINDOW_TYPE_WITH_HEADER: break; - case 3: + case WINDOW_TYPE_NORMAL: (a2 + a1 * 0x20)[iVar5] = 0xF2D8; if (a3 != 0) (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF293; else (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xF2D9; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; @@ -463,11 +455,11 @@ static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) else (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; break; - case 4: + case WINDOW_TYPE_4: (a2 + a1 * 0x20)[iVar5] = 0xF2E8; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xF2E9; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; @@ -476,20 +468,20 @@ static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) (a2 + a1 * 0x20)[iVar5] = 0xF6E8; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; break; - case 5: + case WINDOW_TYPE_FILL_TRANSPARENT: (a2 + a1 * 0x20)[iVar5] = 0xF2DC; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xF2DD; iVar5++; } (a2 + a1 * 0x20)[iVar5] = 0xF6DC; break; - case 7: + case WINDOW_TYPE_7: (a2 + a1 * 0x20)[iVar5] = 0xF293; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xF297; iVar5++; } @@ -499,141 +491,141 @@ static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) } } -static void sub_80069CC(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4) +static void sub_80069CC(Window *window, s32 a1, s32 a2, s32 a3, u16 *a4) { if (a2 > 28) return; if (a2 < 0) return; - switch (a0->unkC) { - case 1: - case 2: + switch (window->type) { + case WINDOW_TYPE_WITHOUT_BORDER: + case WINDOW_TYPE_2: break; - case 0: + case WINDOW_TYPE_0: if (a3 == 0) { (a4 + a2 * 0x20)[a1] = 0xF297; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; } - if (a3 == a0->unk6 - 1) { + if (a3 == window->height - 1) { (a4 + a2 * 0x20)[a1] = 0xFA97; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; } // Fallthrough - case 3: - case 6: + case WINDOW_TYPE_NORMAL: + case WINDOW_TYPE_WITH_HEADER: (a4 + a2 * 0x20)[a1] = 0xF2DA; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; - case 4: + case WINDOW_TYPE_4: (a4 + a2 * 0x20)[a1] = 0xF2EA; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; - case 5: + case WINDOW_TYPE_FILL_TRANSPARENT: (a4 + a2 * 0x20)[a1] = 0xF2DE; break; - case 7: + case WINDOW_TYPE_7: (a4 + a2 * 0x20)[a1] = 0xF2B6; break; } } -static void sub_8006AC4(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4) +static void sub_8006AC4(Window *window, s32 a1, s32 a2, s32 a3, u16 *a4) { if (a2 > 28) return; if (a2 < 0) return; - switch (a0->unkC) { - case 2: + switch (window->type) { + case WINDOW_TYPE_2: (a4 + a2 * 0x20)[a1] = a3 | 0xF000; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF278; break; - case 0: - case 1: - case 3: - case 4: - case 6: + case WINDOW_TYPE_0: + case WINDOW_TYPE_WITHOUT_BORDER: + case WINDOW_TYPE_NORMAL: + case WINDOW_TYPE_4: + case WINDOW_TYPE_WITH_HEADER: (a4 + a2 * 0x20)[a1] = a3 | 0xF000; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; - case 5: - case 7: + case WINDOW_TYPE_FILL_TRANSPARENT: + case WINDOW_TYPE_7: (a4 + a2 * 0x20)[a1] = a3 | 0xF000; break; } } -static void sub_8006B70(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4) +static void sub_8006B70(Window *window, s32 a1, s32 a2, s32 a3, u16 *a4) { if (a2 > 28) return; if (a2 < 0) return; - switch (a0->unkC) { - case 1: - case 2: + switch (window->type) { + case WINDOW_TYPE_WITHOUT_BORDER: + case WINDOW_TYPE_2: break; - case 0: + case WINDOW_TYPE_0: if (a3 == 0) { (a4 + a2 * 0x20)[a1] = 0xF697; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; } - if (a3 == a0->unk6 - 1) { + if (a3 == window->height - 1) { (a4 + a2 * 0x20)[a1] = 0xFE97; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; } // Fallthrough - case 3: - case 6: + case WINDOW_TYPE_NORMAL: + case WINDOW_TYPE_WITH_HEADER: (a4 + a2 * 0x20)[a1] = 0xF6DA; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; - case 4: + case WINDOW_TYPE_4: (a4 + a2 * 0x20)[a1] = 0xF6EA; (a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB; break; - case 5: + case WINDOW_TYPE_FILL_TRANSPARENT: (a4 + a2 * 0x20)[a1] = 0xF6DE; break; - case 7: + case WINDOW_TYPE_7: (a4 + a2 * 0x20)[a1] = 0xF6B6; break; } } -static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) +static void sub_8006C44(Window *window, s32 a1, u16 *a2, u8 a3) { s32 iVar5; s32 i; - iVar5 = a0->unk0 - 1; + iVar5 = window->x - 1; if (a1 > 28) return; if (a1 < 0) return; - switch (a0->unkC) { - case 0: - case 1: - case 2: + switch (window->type) { + case WINDOW_TYPE_0: + case WINDOW_TYPE_WITHOUT_BORDER: + case WINDOW_TYPE_2: break; - case 3: - case 6: + case WINDOW_TYPE_NORMAL: + case WINDOW_TYPE_WITH_HEADER: (a2 + a1 * 0x20)[iVar5] = 0xFAD8; if (a3 != 0) (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xFA93; else (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xFAD9; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; @@ -645,11 +637,11 @@ static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) else (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; break; - case 4: + case WINDOW_TYPE_4: (a2 + a1 * 0x20)[iVar5] = 0xFAE8; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xFAE9; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; iVar5++; @@ -658,20 +650,20 @@ static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) (a2 + a1 * 0x20)[iVar5] = 0xFEE8; (a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB; break; - case 5: + case WINDOW_TYPE_FILL_TRANSPARENT: (a2 + a1 * 0x20)[iVar5] = 0xFADC; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xFADD; iVar5++; } (a2 + a1 * 0x20)[iVar5] = 0xFEDC; break; - case 7: + case WINDOW_TYPE_7: (a2 + a1 * 0x20)[iVar5] = 0xFA93; iVar5++; - for (i = 0; i < a0->unk4; i++) { + for (i = 0; i < window->width; i++) { (a2 + a1 * 0x20)[iVar5] = 0xFA97; iVar5++; } @@ -683,7 +675,7 @@ static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3) // Not even close but I don't feel like continuing atm https://decomp.me/scratch/F58jg /* -void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 *a4) +void sub_8006E94(Window *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 *a4) { s32 bVar1; s32 iVar2; @@ -867,7 +859,7 @@ void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 } */ NAKED -static void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 *a4) +static void sub_8006E94(Window *a0, s32 a1, u32 a2, const WindowHeader *a3, u16 *a4) { asm_unified( "\tpush {r4-r7,lr}\n" @@ -1462,16 +1454,16 @@ static void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const WindowHeader * "_08007330: .4byte 0x0000f6d8"); } -void sub_8007334(s32 a0) +void sub_8007334(s32 windowId) { s32 i, j; - struct UnkTextStruct1 *textStructPtr = &gUnknown_2027370[a0]; - s32 r5 = textStructPtr->unk14; - s32 r6 = textStructPtr->unk2; - for (i = 0; i < textStructPtr->unk6; i++) { - s32 id = textStructPtr->unk0; - for (j = 0; j < textStructPtr->unk4; j++) { - gBgTilemaps[0][r6][id] &= ~0x3ff; + struct Window *window = &gWindows[windowId]; + s32 r5 = window->unk14; + s32 r6 = window->y; + for (i = 0; i < window->height; i++) { + s32 id = window->x; + for (j = 0; j < window->width; j++) { + gBgTilemaps[0][r6][id] &= ~(TILEMAP_TILE_NUM(0x3FF)); gBgTilemaps[0][r6][id] |= r5; id++; r5++; @@ -1484,40 +1476,36 @@ UNUSED static void nullsub_154(void) { } -void sub_80073B8(s32 a0) +void sub_80073B8(s32 windowId) { - UnkTextStruct1 *r1; + Window *window = &gWindows[windowId]; - r1 = &gUnknown_2027370[a0]; - - r1->unk3C = &r1->unk1C[(u32)r1->unk2C >> 2]; - r1->unk40 = r1->unk1C; - r1->unk46 = 1; + window->unk3C = &window->unk1C[(u32)window->unk2C >> 2]; + window->unk40 = window->unk1C; + window->unk46 = 1; } UNUSED static void nullsub_155(void) { } -void sub_80073E0(s32 a0) +void sub_80073E0(s32 windowId) { - UnkTextStruct1 *r1; + Window *window = &gWindows[windowId]; - r1 = &gUnknown_2027370[a0]; + if (window->unk44 == 0) { + window->unk30 = &window->unk28[window->unk3C - window->unk1C]; + window->unk34 = window->unk3C; + window->unk38 = (window->unk40 - window->unk3C + 1) * 4; - if (r1->unk44 == 0) { - r1->unk30 = &r1->unk28[r1->unk3C - r1->unk1C]; - r1->unk34 = r1->unk3C; - r1->unk38 = (r1->unk40 - r1->unk3C + 1) * 4; + if (window->unk38 >= window->unk2C) + window->unk38 = window->unk2C; - if (r1->unk38 >= r1->unk2C) - r1->unk38 = r1->unk2C; - - if (r1->unk38 < 0) - r1->unk38 = 0; + if (window->unk38 < 0) + window->unk38 = 0; } - r1->unk46 = 0; + window->unk46 = 0; } UNUSED static void nullsub_156(void) @@ -1526,7 +1514,7 @@ UNUSED static void nullsub_156(void) u32 xxx_call_draw_char(s32 x, s32 y, u32 a2, u32 color, u32 a4) { - return xxx_draw_char(gUnknown_2027370, x, y, a2, color, a4); + return xxx_draw_char(gWindows, x, y, a2, color, a4); } UNUSED static bool8 sub_8007464(void) @@ -1534,7 +1522,7 @@ UNUSED static bool8 sub_8007464(void) return FALSE; } -static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5) +static u32 xxx_draw_char(struct Window *windows, s32 x, s32 y, u32 a3, u32 color, u32 windowId) { u32 *r3; const struct unkShiftData *shiftData; @@ -1544,7 +1532,7 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co const u16 *local_3c; s32 i; s32 xDiv8, yDiv8; - struct UnkTextStruct1 *r5 = &a0[a5]; + struct Window *window = &windows[windowId]; s32 sp18 = gUnknown_80B853C[color & 0xF]; u8 var_2C; u32 r4; @@ -1571,47 +1559,47 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co } if (sp0->unkA & 1) { - r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8); + r3 = window->unk18 + ((((y / 8) * window->width) + (x / 8)) * 8); r3 += y - (y / 8 * 8); shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)]; xDiv8 = x / 8; yDiv8 = y / 8; - if (yDiv8 < r5->unk8) { + if (yDiv8 < window->unk8) { for (i = 0; i < sCharHeight[sCurrentCharmap]; i++) { r2 = (local_44[1] << 0x10) | (local_44[0]); if (r2 != 0) { - if (xDiv8 < r5->unk4) { + if (xDiv8 < window->width) { *r3 |= (shiftData->bytesA & r2) << shiftData->shift_left; - if (r5->unk3C > r3) - r5->unk3C = r3; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk3C > r3) + window->unk3C = r3; + if (window->unk40 < r3) + window->unk40 = r3; } - if (xDiv8 < r5->unk4 - 1) { + if (xDiv8 < window->width - 1) { r3 += 8; r2 &= shiftData->bytesB; *r3 |= (r2) >> shiftData->shift_right; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk40 < r3) + window->unk40 = r3; r3 -= 8; } } r2 = local_44[2]; if (r2 != 0) { - if (xDiv8 < r5->unk4 - 1) { + if (xDiv8 < window->width - 1) { r3 += 8; *r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk40 < r3) + window->unk40 = r3; r3 -= 8; } - if (xDiv8 < r5->unk4 - 2) { + if (xDiv8 < window->width - 2) { r3 += 16; *r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk40 < r3) + window->unk40 = r3; r3 -= 16; } } @@ -1620,9 +1608,9 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co r3++; y++; if (y % 8 == 0) { - r3 += r5->unk20; + r3 += window->unk20; yDiv8++; - if (yDiv8 >= r5->unk8) + if (yDiv8 >= window->unk8) break; } } @@ -1632,13 +1620,13 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co bool8 notFirstIteration = FALSE; u32 r1; - r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8); + r3 = window->unk18 + ((((y / 8) * window->width) + (x / 8)) * 8); r3 += y - (y / 8 * 8); shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)]; xDiv8 = x / 8; yDiv8 = y / 8; - if (yDiv8 < r5->unk8) { + if (yDiv8 < window->unk8) { for (i = 0; i < sCharHeight[sCurrentCharmap]; i++) { r4 = (local_44[1] << 0x10) | (local_44[0]); r2 = (0x11111111 & r4) + (sp18 & r4); @@ -1657,18 +1645,18 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co } if (r2 != 0) { - if (xDiv8 < r5->unk4) { + if (xDiv8 < window->width) { *r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left; - if (r5->unk3C > r3) - r5->unk3C = r3; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk3C > r3) + window->unk3C = r3; + if (window->unk40 < r3) + window->unk40 = r3; } - if (xDiv8 < r5->unk4 - 1) { + if (xDiv8 < window->width - 1) { r3 += 8; *r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk40 < r3) + window->unk40 = r3; r3 -= 8; } } @@ -1690,18 +1678,18 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co } if (r2 != 0) { - if (xDiv8 < r5->unk4 - 1) { + if (xDiv8 < window->width - 1) { r3 += 8; *r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk40 < r3) + window->unk40 = r3; r3 -= 8; } - if (xDiv8 < r5->unk4 - 2) { + if (xDiv8 < window->width - 2) { r3 += 16; *r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right; - if (r5->unk40 < r3) - r5->unk40 = r3; + if (window->unk40 < r3) + window->unk40 = r3; r3 -= 16; } } @@ -1713,9 +1701,9 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co r3++; y++; if (y % 8 == 0) { - r3 += r5->unk20; + r3 += window->unk20; yDiv8++; - if (yDiv8 >= r5->unk8) + if (yDiv8 >= window->unk8) break; } } @@ -1725,10 +1713,10 @@ static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 co return sp0->unk6 + sCharacterSpacing; } -void sub_80078A4(u32 a0, s32 x, s32 y, s32 a3, u32 color) +void AddDoubleUnderScoreHighlight(u32 windowId, s32 x, s32 y, s32 width, u32 color) { - sub_800792C(a0, x, y, a3, color); - sub_800792C(a0, x, y + 1, a3, sTextShadowMask & 0xF); + AddUnderScoreHighlight(windowId, x, y, width, color); + AddUnderScoreHighlight(windowId, x, y + 1, width, sTextShadowMask & 0xF); } UNUSED static void sub_80078E8(u32 a0, s32 x, s32 y, s32 a3, u32 color) @@ -1737,67 +1725,66 @@ UNUSED static void sub_80078E8(u32 a0, s32 x, s32 y, s32 a3, u32 color) nullsub_129(a0, x, y + 1, a3, sTextShadowMask & 0xF); } -void sub_800792C(u32 a0, s32 x, s32 y, s32 a3, u32 color) +void AddUnderScoreHighlight(u32 windowId, s32 x, s32 y, s32 width, u32 color) { - sub_8007958(gUnknown_2027370, a0, x, y, a3, color); + AddUnderScoreHighlightInternal(gWindows, windowId, x, y, width, color); } -static void nullsub_129(u32 a0, s32 x, s32 y, s32 a3, u32 color) +static void nullsub_129(u32 windowId, s32 x, s32 y, s32 width, u32 color) { } -static void sub_8007958(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color) +static void AddUnderScoreHighlightInternal(Window *windows, u32 windowId, s32 x, s32 y, s32 width, u32 color) { u32 uVar4; u32 *dest; s32 r4; const struct unkShiftData *shiftData; - UnkTextStruct1 *r5; + Window *window; s32 r6; u32 r9; - s32 lol; - r5 = &a0[a1]; + window = &windows[windowId]; r9 = gUnknown_80B853C[color & 0xF]; r4 = y / 8; - dest = r5->unk18 + (((r5->unk4 * r4) + (x / 8)) * 8); + dest = window->unk18 + (((window->width * r4) + (x / 8)) * 8); dest += (r4 * -8) + y; r6 = x / 8; - if (y / 8 >= r5->unk8) { + if (y / 8 >= window->unk8) { return; } else { const u32 unkBits[] = {0, 0xF, 0xFF, 0xFFF, 0xFFFF, 0xFFFFF, 0xFFFFFF, 0xFFFFFFF, 0xFFFFFFFF}; - for (; a4 > 0; a4 -= 8) { - lol = a4; - if (lol > 7) - lol = 8; + for (; width > 0; width -= 8) { + s32 currWidth = width; + if (currWidth > 7) + currWidth = 8; shiftData = &gCharMasksOffsets[x + (x / 8 * -8)]; - uVar4 = unkBits[lol]; + uVar4 = unkBits[currWidth]; uVar4 = (uVar4 & 0x11111111) + (uVar4 & r9); if (uVar4 != 0) { - if (r6 < r5->unk4) { + if (r6 < window->width) { dest[0] |= (shiftData->bytesA & uVar4) << shiftData->shift_left; - if (r5->unk3C > dest) - r5->unk3C = dest; - if (r5->unk40 < dest) - r5->unk40 = dest; + if (window->unk3C > dest) + window->unk3C = dest; + if (window->unk40 < dest) + window->unk40 = dest; } - if (r6 < r5->unk4 - 1) { + if (r6 < window->width - 1) { dest += 8; dest[0] |= (uVar4 & shiftData->bytesB) >> shiftData->shift_right; - if (r5->unk40 < dest) - r5->unk40 = dest; + if (window->unk40 < dest) + window->unk40 = dest; dest -= 8; } } @@ -1810,73 +1797,73 @@ static void sub_8007958(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 co void sub_8007A78(u32 a0, s32 x, s32 y, s32 a3, u32 color) { - sub_8007AA4(gUnknown_2027370, a0, x, y, a3, color); + sub_8007AA4(gWindows, a0, x, y, a3, color); } UNUSED static void nullsub_157(void) { } -static void sub_8007AA4(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color) +static void sub_8007AA4(struct Window *windows, u32 windowId, s32 x, s32 y, s32 a4, u32 color) { - struct UnkTextStruct1 *r4 = &a0[a1]; + struct Window *window = &windows[windowId]; u32 ip = gUnknown_80B853C[color & 0xF] + 0x11111111; const u32 unkBits[] = {0xF, 0xF0, 0xF00, 0xF000, 0xF0000, 0xF00000, 0xF000000, 0xF0000000}; s32 r3 = y / 8; - u32 *dest = r4->unk18 + ((r4->unk4 * r3 + x / 8) * 8); + u32 *dest = window->unk18 + ((window->width * r3 + x / 8) * 8); s32 r2 = x / 8; dest += r3 * -8 + y; ip &= unkBits[x & 7]; - if (r2 < r4->unk4) { + if (r2 < window->width) { // This goto looks like a fakematch, but I couldn't get it to work otherwise. goto LOOP_MIDDLE; while (1) { y++; dest++; if ((y % 8) == 0) - dest += r4->unk20; + dest += window->unk20; a4--; LOOP_MIDDLE: if (a4 <= 0) return; - if (r3 >= r4->unk8) + if (r3 >= window->unk8) return; dest[0] |= ip; - if (r4->unk3C > dest) - r4->unk3C = dest; - if (r4->unk40 < dest) - r4->unk40 = dest; + if (window->unk3C > dest) + window->unk3C = dest; + if (window->unk40 < dest) + window->unk40 = dest; } } } void sub_8007B7C(u32 a0, s32 x, s32 y, s32 a3, u32 color) { - sub_8007BA8(gUnknown_2027370, a0, x, y, a3, color); + sub_8007BA8(gWindows, a0, x, y, a3, color); } UNUSED static void nullsub_158(void) { } -void sub_8007BA8(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color) +void sub_8007BA8(struct Window *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color) { u32 *dst; s32 i; s32 xDiv8, yDiv8; s32 j, k; - struct UnkTextStruct1 *window = &windows[windowId]; + struct Window *window = &windows[windowId]; yDiv8 = y / 8; if (yDiv8 >= window->unk8) return; - dst = window->unk18 + (((yDiv8 * window->unk4) + x / 8) * 8); + dst = window->unk18 + (((yDiv8 * window->width) + x / 8) * 8); dst += y - (yDiv8 * 8); for (i = 0; i < color; i++) { @@ -1884,7 +1871,7 @@ void sub_8007BA8(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 xDiv8 = x / 8; for (j = 0; j < a4; j += 8) { - if (xDiv8 < window->unk4) { + if (xDiv8 < window->width) { u32 andBits = 0xF0000000; u32 orBits = 0xE0000000; u32 bits = 0; @@ -1925,7 +1912,7 @@ void sub_8007BA8(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 UNUSED static void sub_8007CD4(u32 a0, s32 a1, s32 a2, s32 a3, s32 a4) { - sub_8007D00(gUnknown_2027370, a0, a1, a2, a3, a4); + sub_8007D00(gWindows, a0, a1, a2, a3, a4); } UNUSED static void nullsub_159(void) @@ -1933,19 +1920,19 @@ UNUSED static void nullsub_159(void) } // Very similar to sub_8007BA8. It clears bits instead of setting them. -void sub_8007D00(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color) +void sub_8007D00(struct Window *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color) { u32 *dst; s32 i; s32 xDiv8, yDiv8; s32 j, k; - struct UnkTextStruct1 *window = &windows[windowId]; + struct Window *window = &windows[windowId]; yDiv8 = y / 8; if (yDiv8 >= window->unk8) return; - dst = window->unk18 + (((yDiv8 * window->unk4) + x / 8) * 8); + dst = window->unk18 + (((yDiv8 * window->width) + x / 8) * 8); dst += y - (yDiv8 * 8); for (i = 0; i < color; i++) { @@ -1953,7 +1940,7 @@ void sub_8007D00(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 xDiv8 = x / 8; for (j = 0; j < a4; j += 8) { - if (xDiv8 < window->unk4) { + if (xDiv8 < window->width) { u32 andBits = 0xF0000000; u32 equalBits = 0xE0000000; u32 bits = 0; @@ -1994,34 +1981,34 @@ void sub_8007D00(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6) { - sub_8007E64(gUnknown_2027370, gBgTilemaps[0], a0, a1, a2, a3, a4, a5, a6); + sub_8007E64(gWindows, gBgTilemaps[0], a0, a1, a2, a3, a4, a5, a6); } UNUSED static void nullsub_160(void) { } -static void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8) +static void sub_8007E64(Window *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8) { s32 i, j; - UnkTextStruct1 *strPtr = &a0[a2]; + Window *window = &a0[a2]; a3 /= 8; a4 /= 8; a5 /= 8; a6 /= 8; a8 *= 4096; - if (a4 < strPtr->unk8) { - s32 id = (strPtr->unk4 * a4) + a3; - u32 *unk18Ptr = &strPtr->unk18[id * 8]; + if (a4 < window->unk8) { + s32 id = (window->width * a4) + a3; + u32 *unk18Ptr = &window->unk18[id * 8]; for (i = 0; i < a6; i++) { s32 xMaybe = a3; u32 *loopUnk18Ptr = unk18Ptr; for (j = 0; j < a5; j++) { - if (xMaybe < strPtr->unk4) { - if (strPtr->unk3C > loopUnk18Ptr) { - strPtr->unk3C = loopUnk18Ptr; + if (xMaybe < window->width) { + if (window->unk3C > loopUnk18Ptr) { + window->unk3C = loopUnk18Ptr; } *(loopUnk18Ptr++) = *(a7++); *(loopUnk18Ptr++) = *(a7++); @@ -2031,12 +2018,12 @@ static void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 *(loopUnk18Ptr++) = *(a7++); *(loopUnk18Ptr++) = *(a7++); *(loopUnk18Ptr++) = *a7; - if (strPtr->unk40 < loopUnk18Ptr) { - strPtr->unk40 = loopUnk18Ptr; + if (window->unk40 < loopUnk18Ptr) { + window->unk40 = loopUnk18Ptr; } a7++; - a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF; - a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8; + a1[window->y + a4][window->x + xMaybe] &= 0xFFF; + a1[window->y + a4][window->x + xMaybe] |= a8; } else { loopUnk18Ptr += 8; @@ -2045,9 +2032,9 @@ static void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 xMaybe++; } a4++; - unk18Ptr += strPtr->unk20; + unk18Ptr += window->unk20; unk18Ptr += 8; - if (a4 >= strPtr->unk8) + if (a4 >= window->unk8) break; } } @@ -2071,7 +2058,7 @@ static u32 FlipPixelsHorizontally(u32 a0) UNUSED static void sub_8007FEC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6) { - sub_8008030(gUnknown_2027370, gBgTilemaps[0], a0, a1, a2, a3, a4, a5, a6); + sub_8008030(gWindows, gBgTilemaps[0], a0, a1, a2, a3, a4, a5, a6); } UNUSED static void nullsub_161(void) @@ -2079,27 +2066,27 @@ UNUSED static void nullsub_161(void) } // Similar to sub_8007E64 -static void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8) +static void sub_8008030(Window *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8) { s32 i, j; - UnkTextStruct1 *strPtr = &a0[a2]; + Window *window = &a0[a2]; a3 /= 8; a4 /= 8; a5 /= 8; a6 /= 8; a8 *= 4096; - if (a4 < strPtr->unk8) { - u32 *unk18Ptr = &strPtr->unk18[((strPtr->unk4 * a4) + (a3 + a5)) * 8]; + if (a4 < window->unk8) { + u32 *unk18Ptr = &window->unk18[((window->width * a4) + (a3 + a5)) * 8]; for (i = 0; i < a6; i++) { s32 xMaybe = a3 + a5; u32 *loopUnk18Ptr = unk18Ptr; for (j = 0; j < a5; j++) { xMaybe--; loopUnk18Ptr -= 8; - if (xMaybe < strPtr->unk4) { - if (strPtr->unk3C > loopUnk18Ptr) { - strPtr->unk3C = loopUnk18Ptr; + if (xMaybe < window->width) { + if (window->unk3C > loopUnk18Ptr) { + window->unk3C = loopUnk18Ptr; } loopUnk18Ptr[0] = FlipPixelsHorizontally(*(a7++)); loopUnk18Ptr[1] = FlipPixelsHorizontally(*(a7++)); @@ -2109,20 +2096,20 @@ static void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 loopUnk18Ptr[5] = FlipPixelsHorizontally(*(a7++)); loopUnk18Ptr[6] = FlipPixelsHorizontally(*(a7++)); loopUnk18Ptr[7] = FlipPixelsHorizontally(*(a7++)); - if (strPtr->unk40 < loopUnk18Ptr + 8) { - strPtr->unk40 = loopUnk18Ptr + 8; + if (window->unk40 < loopUnk18Ptr + 8) { + window->unk40 = loopUnk18Ptr + 8; } - a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF; - a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8; + a1[window->y + a4][window->x + xMaybe] &= 0xFFF; + a1[window->y + a4][window->x + xMaybe] |= a8; } else { a7 += 8; } } a4++; - unk18Ptr += strPtr->unk20; + unk18Ptr += window->unk20; unk18Ptr += 8; - if (a4 >= strPtr->unk8) + if (a4 >= window->unk8) break; } } @@ -2132,22 +2119,22 @@ static void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 UNUSED static void sub_80081A4(s32 a0, s32 a3, s32 a4, s32 a7Id) { s32 i, j, a5, a6; - UnkTextStruct1 *strPtr = &gUnknown_2027370[a0]; + Window *window = &gWindows[a0]; const u32 *a7 = gUnknown_80B86B4[a7Id]; a3 /= 8; a4 /= 8; a5 = 2; a6 = 2; - if (a4 < strPtr->unk8) { - s32 id = (strPtr->unk4 * a4) + a3; - u32 *unk18Ptr = &strPtr->unk28[id * 8]; + if (a4 < window->unk8) { + s32 id = (window->width * a4) + a3; + u32 *unk18Ptr = &window->unk28[id * 8]; for (i = 0; i < a6; i++) { s32 xMaybe = a3; u32 *loopUnk18Ptr = unk18Ptr; for (j = 0; j < a5; j++) { - if (xMaybe < strPtr->unk4) { + if (xMaybe < window->width) { *(loopUnk18Ptr++) = *(a7++); *(loopUnk18Ptr++) = *(a7++); *(loopUnk18Ptr++) = *(a7++); @@ -2165,9 +2152,9 @@ UNUSED static void sub_80081A4(s32 a0, s32 a3, s32 a4, s32 a7Id) xMaybe++; } a4++; - unk18Ptr += strPtr->unk20; + unk18Ptr += window->unk20; unk18Ptr += 8; - if (a4 >= strPtr->unk8) + if (a4 >= window->unk8) break; } } @@ -2175,30 +2162,30 @@ UNUSED static void sub_80081A4(s32 a0, s32 a3, s32 a4, s32 a7Id) void DisplayMonPortraitSprite(s32 a0, const u8 *compressedData, s32 a2) { - DisplayMonPortrait(gUnknown_2027370, gBgTilemaps[0], a0, compressedData, a2); + DisplayMonPortrait(gWindows, gBgTilemaps[0], a0, compressedData, a2); } UNUSED static void nullsub_162(void) { } -static void DisplayMonPortrait(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4) +static void DisplayMonPortrait(Window *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4) { s32 i, j; - UnkTextStruct1 *strPtr = &a0[a2]; + Window *window = &a0[a2]; a4 *= 4096; - DecompressAT((u8 *)strPtr->unk18, (strPtr->unk4 * 32) * strPtr->unk8, compressedData); - for (i = 0; i < strPtr->unk8; i++) { - for (j = 0; j < strPtr->unk4; j++) { - a1[strPtr->unk2 + i][strPtr->unk0 + j] &= 0xFFF; - a1[strPtr->unk2 + i][strPtr->unk0 + j] |= a4; + DecompressAT((u8 *)window->unk18, (window->width * 32) * window->unk8, compressedData); + for (i = 0; i < window->unk8; i++) { + for (j = 0; j < window->width; j++) { + a1[window->y + i][window->x + j] &= 0xFFF; + a1[window->y + i][window->x + j] |= a4; } } - strPtr->unk30 = strPtr->unk28; - strPtr->unk34 = strPtr->unk1C; - strPtr->unk38 = strPtr->unk2C; - strPtr->unk44 = 1; + window->unk30 = window->unk28; + window->unk34 = window->unk1C; + window->unk38 = window->unk2C; + window->unk44 = 1; } static void sub_8008334(u32 *r7, u32 *r12) @@ -2227,30 +2214,30 @@ static void sub_8008334(u32 *r7, u32 *r12) void DisplayMonPortraitSpriteFlipped(s32 a0, const u8 *compressedData, s32 a1) { - DisplayMonPortraitFlipped(gUnknown_2027370, a0, compressedData, a1); + DisplayMonPortraitFlipped(gWindows, a0, compressedData, a1); } UNUSED static void nullsub_163(void) { } -static void DisplayMonPortraitFlipped(UnkTextStruct1 *a0, s32 a1, const u8 *compressedData, s32 a3) +static void DisplayMonPortraitFlipped(Window *windows, s32 windowId, const u8 *compressedData, s32 a3) { s32 i, j; - UnkTextStruct1 *strPtr = &a0[a1]; + Window *window = &windows[windowId]; - DisplayMonPortraitSprite(a1, compressedData, a3); - for (i = 0; i < strPtr->unk8; i++) { - s32 r8 = strPtr->unk4 / 2; - if (strPtr->unk4 & 1) + DisplayMonPortraitSprite(windowId, compressedData, a3); + for (i = 0; i < window->unk8; i++) { + s32 r8 = window->width / 2; + if (window->width & 1) r8++; for (j = 0; j < r8; j++) { u32 *r4, *r5; - s32 unk4Mul = strPtr->unk4 * i; + s32 unk4Mul = window->width * i; - r4 = &strPtr->unk18[(unk4Mul + j) * 8]; + r4 = &window->unk18[(unk4Mul + j) * 8]; unk4Mul--; - r5 = &strPtr->unk18[(unk4Mul + (strPtr->unk4 - j)) * 8]; + r5 = &window->unk18[(unk4Mul + (window->width - j)) * 8]; sub_8008334(r4++, r5++); sub_8008334(r4++, r5++); @@ -2266,7 +2253,7 @@ static void DisplayMonPortraitFlipped(UnkTextStruct1 *a0, s32 a1, const u8 *comp UNUSED static void sub_8008468(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a6) { - sub_80084A4(gUnknown_2027370, gBgTilemaps[0], a0, a1, a2, a3, a4, a6); + sub_80084A4(gWindows, gBgTilemaps[0], a0, a1, a2, a3, a4, a6); } UNUSED static void nullsub_164(void) @@ -2274,28 +2261,28 @@ UNUSED static void nullsub_164(void) } // Effectively unused -static void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8) +static void sub_80084A4(Window *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8) { s32 i, j; - UnkTextStruct1 *strPtr = &a0[a2]; + Window *window = &a0[a2]; a3 /= 8; a4 /= 8; a5 /= 8; a6 /= 8; a8 *= 4096; - if (a4 < strPtr->unk8) { + if (a4 < window->unk8) { for (i = 0; i < a6; i++) { s32 xMaybe = a3; for (j = 0; j < a5; j++) { - if (xMaybe < strPtr->unk4) { - a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF; - a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8; + if (xMaybe < window->width) { + a1[window->y + a4][window->x + xMaybe] &= 0xFFF; + a1[window->y + a4][window->x + xMaybe] |= a8; } xMaybe++; } a4++; - if (a4 >= strPtr->unk8) + if (a4 >= window->unk8) break; } } @@ -2402,11 +2389,11 @@ static const u32 gUnknown_80B8868[] = 0xFFF00000, 0xFF000000, 0xF0000000 }; -UNUSED static void sub_80086C8(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5) +UNUSED static void sub_80086C8(Window *windows, s32 windowId, s32 a2, s32 a3, s32 a4, s32 a5) { u32 *r5; s32 r2, r0, r1; - UnkTextStruct1 *strPtr = &a0[a1]; + Window *window = &windows[windowId]; if (a2 < 0) { a4 += a2; @@ -2417,17 +2404,17 @@ UNUSED static void sub_80086C8(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a a3 = 0; } - if (a4 + a2 > strPtr->unk4 * 8) { - a4 = (strPtr->unk4 * 8) - a2; + if (a4 + a2 > window->width * 8) { + a4 = (window->width * 8) - a2; } - if (a3 + a5 > strPtr->unk8 * 8) { - a5 = (strPtr->unk8 * 8) - a3; + if (a3 + a5 > window->unk8 * 8) { + a5 = (window->unk8 * 8) - a3; } - r2 = strPtr->unk4 * (a3 / 8); + r2 = window->width * (a3 / 8); r0 = 8 * (r2 + (a2 / 8)); r1 = a3 - ((a3 / 8) * 8); - r5 = &strPtr->unk18[r0 + r1]; + r5 = &window->unk18[r0 + r1]; while (a5 > 0) { u32 *loopPtr; s32 r4, r6; @@ -2435,8 +2422,8 @@ UNUSED static void sub_80086C8(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a loopPtr = r5; r4 = a4; r6 = a2; - if (strPtr->unk3C > r5) { - strPtr->unk3C = r5; + if (window->unk3C > r5) { + window->unk3C = r5; } while (r4 > 0) { @@ -2460,37 +2447,37 @@ UNUSED static void sub_80086C8(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a } a5--; a3++; - if (strPtr->unk40 < r5) { - strPtr->unk40 = r5; + if (window->unk40 < r5) { + window->unk40 = r5; } r5++; if (!(a3 & 7)) { - r5 = &r5[strPtr->unk20]; + r5 = &r5[window->unk20]; } } } void sub_80087EC(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4) { - sub_8008818(gUnknown_2027370, a0, a1, a2, a3, a4); + sub_8008818(gWindows, a0, a1, a2, a3, a4); } UNUSED static void nullsub_176(void) { } -static void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5) +static void sub_8008818(Window *windows, s32 windowId, s32 a2, s32 a3, s32 a4, s32 a5) { s32 i, j; - UnkTextStruct1 *strPtr = &a0[a1]; + Window *window = &windows[windowId]; s32 a2Div = a2 / 8; s32 a3Div = a3 / 8; for (i = 0; i < a5; i += 8) { - u32 *ptr = &strPtr->unk18[((strPtr->unk4 * a3Div) + a2Div) * 8]; + u32 *ptr = &window->unk18[((window->width * a3Div) + a2Div) * 8]; for (j = 0; j < a4; j += 8) { - if (strPtr->unk3C > ptr) { - strPtr->unk3C = ptr; + if (window->unk3C > ptr) { + window->unk3C = ptr; } *(ptr++) = 0; *(ptr++) = 0; @@ -2500,8 +2487,8 @@ static void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 *(ptr++) = 0; *(ptr++) = 0; *ptr = 0; - if (strPtr->unk40 < ptr) { - strPtr->unk40 = ptr; + if (window->unk40 < ptr) { + window->unk40 = ptr; } ptr++; } @@ -2516,32 +2503,32 @@ bool8 xxx_call_update_bg_vram(void) gUnknown_20274A5 = FALSE; sub_80099C0(); } - ret = xxx_update_bg_vram(gUnknown_2027370); + ret = xxx_update_bg_vram(gWindows); return ret; } -static bool8 xxx_update_bg_vram(UnkTextStruct1 *a0) +static bool8 xxx_update_bg_vram(Window *windows) { s32 i, j; u32 r5; bool8 ret = FALSE; - for (i = 0; i < 4; i++) { - UnkTextStruct1 *strPtr = &a0[i]; - if (strPtr->unk4 == 0) + for (i = 0; i < MAX_WINDOWS; i++) { + Window *window = &windows[i]; + if (window->width == 0) continue; - r5 = strPtr->unk38; + r5 = window->unk38; if (r5 == 0) continue; - if (strPtr->unk45) { + if (window->unk45) { u32 *r2, *r1; - CpuCopy(strPtr->unk28, strPtr->unk18, 0xD00); + CpuCopy(window->unk28, window->unk18, 0xD00); // The reason for void casts is because we want to add 0xD00/r5 directly to pointers. Because pointers are u32, without the casts, it would multiply the value by 4. - r2 = (void *)(strPtr->unk18) + 0xD00; - r1 = (void *)(strPtr->unk28) + 0xD00; - for (j = 0; j < strPtr->unk4; j++) { + r2 = (void *)(window->unk18) + 0xD00; + r1 = (void *)(window->unk28) + 0xD00; + for (j = 0; j < window->width; j++) { *(r1++) = *(r2++); *(r1++) = *(r2++); *(r1++) = *(r2++); @@ -2552,17 +2539,17 @@ static bool8 xxx_update_bg_vram(UnkTextStruct1 *a0) *(r1++) = 0xFFFFFFFF; r2 += 3; } - strPtr->unk38 = 0; + window->unk38 = 0; } else { - CpuCopy(strPtr->unk30, strPtr->unk34, r5); - strPtr->unk34 += (r5 / 4); - strPtr->unk30 = (void *)(strPtr->unk30) + r5; - strPtr->unk38 -= r5; + CpuCopy(window->unk30, window->unk34, r5); + window->unk34 += (r5 / 4); + window->unk30 = (void *)(window->unk30) + r5; + window->unk38 -= r5; } - if (strPtr->unk38 == 0) { - strPtr->unk44 = 0; + if (window->unk38 == 0) { + window->unk44 = 0; } ret = TRUE; } @@ -2570,7 +2557,7 @@ static bool8 xxx_update_bg_vram(UnkTextStruct1 *a0) return ret; } -static void sub_800898C(void) +static void ResetWindowBgData(void) { s32 i; @@ -2579,7 +2566,7 @@ static void sub_800898C(void) } } -static void sub_80089AC(const Window *r4, DungeonPos *r5_Str) +static void sub_80089AC(const WindowTemplate *r4, DungeonPos *r5_Str) { u8 *r6; @@ -2627,11 +2614,11 @@ static void sub_80089AC(const Window *r4, DungeonPos *r5_Str) s32 var_24 = ((r4->pos.x + r5_Str->x + r4->width) * 8) + 5; s32 r8 = ((r4->pos.y + r5_Str->y + r4->height) * 8) + 5; s32 r12 = ((r4->pos.x + r5_Str->x) * 8) + 3; - const WindowHeader *r2 = r4->unk14; - s32 tmp = r2->f2 - 1; - s32 r10 = (((tmp + r2->f0 + 2) * 8) + r12) - 4; - s32 r4 = r9 + ((r2->f1 + 1) * 8); - s32 r7 = (r4 + ((r2->f2 + 2) * 8)) - 4; + const WindowHeader *r2 = r4->header; + s32 tmp = r2->width - 1; + s32 r10 = (((tmp + r2->count + 2) * 8) + r12) - 4; + s32 r4 = r9 + ((r2->currId + 1) * 8); + s32 r7 = (r4 + ((r2->width + 2) * 8)) - 4; if (r5 < 0) r5 = 0; @@ -2736,28 +2723,28 @@ static void sub_80089AC(const Window *r4, DungeonPos *r5_Str) void CallPrepareTextbox_8008C54(u32 strId) { - PrepareTextbox_8008C6C(gUnknown_2027370, strId); + PrepareTextbox_8008C6C(gWindows, strId); } UNUSED static void nullsub_169(void) { } -static void PrepareTextbox_8008C6C(UnkTextStruct1 *strArr, u32 strId) +static void PrepareTextbox_8008C6C(Window *windows, u32 windowId) { s32 i; - UnkTextStruct1 *strPtr = &strArr[strId]; + Window *window = &windows[windowId]; - if (!strPtr->unk45) { - s32 count = (strPtr->unk4 * strPtr->unk8) * 32; + if (!window->unk45) { + s32 count = (window->width * window->unk8) * 32; for (i = 0; i < count; i += 32) { - CpuClear(&strPtr->unk18[i / 4u], 32); + CpuClear(&window->unk18[i / 4u], 32); } } else { - s32 count = (strPtr->unk4 * (strPtr->unk8 - 1)) * 32; - u32 *ptr = strPtr->unk18; - for (i = 0; i < strPtr->unk4; i++) { + s32 count = (window->width * (window->unk8 - 1)) * 32; + u32 *ptr = window->unk18; + for (i = 0; i < window->width; i++) { *(ptr++) = 0xFFFFFFFF; *(ptr++) = 0xEEEEEEEE; *(ptr++) = 0xDDDDDDDD; @@ -2773,22 +2760,22 @@ static void PrepareTextbox_8008C6C(UnkTextStruct1 *strArr, u32 strId) } } - if (strPtr->unkC == 6) { - strPtr->unk46 = 1; - sub_8007958(strArr, strId, 0, 10, strPtr->unk4 * 8, 0xE); - sub_8007958(strArr, strId, 0, 11, strPtr->unk4 * 8, 0xD); - strPtr->unk46 = 0; + if (window->type == WINDOW_TYPE_WITH_HEADER) { + window->unk46 = 1; + AddUnderScoreHighlightInternal(windows, windowId, 0, 10, window->width * 8, 0xE); + AddUnderScoreHighlightInternal(windows, windowId, 0, 11, window->width * 8, 0xD); + window->unk46 = 0; } - strPtr->unk30 = strPtr->unk28; - strPtr->unk34 = strPtr->unk1C; - strPtr->unk38 = strPtr->unk2C; - strPtr->unk44 = 1; + window->unk30 = window->unk28; + window->unk34 = window->unk1C; + window->unk38 = window->unk2C; + window->unk44 = 1; } bool8 sub_8008D8C(u32 strId) { - UnkTextStruct1 *strPtr = &gUnknown_2027370[strId]; + Window *strPtr = &gWindows[strId]; return (strPtr->unk38 != 0); } @@ -2822,7 +2809,7 @@ UNUSED static void sub_8008DF4(s32 a0, s32 a1, u8 *a2) if (r1 >= 97 && r1 <= 122) { r1 -= 32; } - gBgTilemaps[0][a1][a0] = 0xF000 | (r1 + 0x258); + gBgTilemaps[0][a1][a0] = TILEMAP_PAL(15) | (r1 + 0x258); a2++; a0++; } @@ -2844,7 +2831,7 @@ UNUSED static void sub_8008E58(s32 a0, s32 a1, u8 *a2, s32 a3) if (r1 >= 97 && r1 <= 122) { r1 -= 32; } - gBgTilemaps[0][a1][a0] = 0xF000 | (r1 + 0x258); + gBgTilemaps[0][a1][a0] = TILEMAP_PAL(15) | (r1 + 0x258); a2++; a0++; a3--; @@ -2909,12 +2896,12 @@ s32 sub_8008ED0(const u8 *str) void PrintStringOnWindow2(s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 lineSpacing) { - xxx_draw_string(gUnknown_2027370, x, y, str, windowId, terminatingChr, 0, lineSpacing); + xxx_draw_string(gWindows, x, y, str, windowId, terminatingChr, 0, lineSpacing); } void PrintStringOnWindow(s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr) { - xxx_draw_string(gUnknown_2027370, x, y, str, windowId, terminatingChr, 0, 13); + xxx_draw_string(gWindows, x, y, str, windowId, terminatingChr, 0, 13); } UNUSED static void nullsub_170(void) @@ -2924,14 +2911,14 @@ UNUSED static void nullsub_170(void) // Identical to PrintStringOnWindow UNUSED static void UnusedPrintStringOnWindow(s32 x, u32 y, const u8 *str, u32 windowId, u32 terminatingChr) { - xxx_draw_string(gUnknown_2027370, x, y, str, windowId, terminatingChr, 0, 13); + xxx_draw_string(gWindows, x, y, str, windowId, terminatingChr, 0, 13); } UNUSED static void nullsub_171(void) { } -static void xxx_draw_string(UnkTextStruct1 *strArr, s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 characterSpacing, s32 lineSpacing) +static void xxx_draw_string(Window *strArr, s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 characterSpacing, s32 lineSpacing) { struct UnkDrawStringStruct sp; u32 currChr; @@ -3008,7 +2995,7 @@ static const u8 *sub_800915C(s16 *a0, const u8 *str) const u8 *xxx_handle_format_global(const u8 *str, struct UnkDrawStringStruct *unkStrPtr) { - return HandleTextFormat(gUnknown_2027370, str, unkStrPtr); + return HandleTextFormat(gWindows, str, unkStrPtr); } UNUSED static s32 sub_80091A8(s32 a0) @@ -3016,7 +3003,7 @@ UNUSED static s32 sub_80091A8(s32 a0) return a0 + 1; } -static const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct UnkDrawStringStruct *sp) +static const u8 *HandleTextFormat(Window *windows, const u8 *str, struct UnkDrawStringStruct *sp) { while (1) { if (str[0] == '#') { @@ -3074,7 +3061,7 @@ static const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct } else if (str[1] == '+') { str += 2; - sp->unk0 = (strArr[0].unk4 * 8) - sub_8008ED0(str); + sp->unk0 = (windows[0].width * 8) - sub_8008ED0(str); sp->unk0 /= 2; } else if (str[1] == 'C') { @@ -3108,8 +3095,8 @@ static const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct } else if (str[1] == 'W') { str += 2; - sp->unk8 = ((strArr[0].unk0 * 8) + sp->unk0) - 2; - sp->unkA = ((strArr[0].unk2 * 8) + sp->unk2) + 3; + sp->unk8 = ((windows[0].x * 8) + sp->unk0) - 2; + sp->unkA = ((windows[0].y * 8) + sp->unk2) + 3; sp->unk20 = 1; break; } @@ -3148,14 +3135,14 @@ static void sub_8009388(void) { s32 i, j; - gBgTilemaps[0][0][0] = 0xF279; - gBgTilemaps[1][0][0] = 0xF27A; + gBgTilemaps[0][0][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x279); + gBgTilemaps[1][0][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); for (i = sUnknown_202B020; i < sUnknown_202B024; i++) { - gBgTilemaps[0][i][0] = 0xF279; - gBgTilemaps[1][i][0] = 0xF27A; + gBgTilemaps[0][i][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x279); + gBgTilemaps[1][i][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); for (j = 1; j < 32; j++) { gBgTilemaps[0][i][j] = 0; - gBgTilemaps[1][i][j] = 0xF27A; + gBgTilemaps[1][i][j] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); } } } @@ -3164,34 +3151,34 @@ void sub_8009408(s32 from, s32 to) { s32 i, j; - gBgTilemaps[0][0][0] = 0xF279; - gBgTilemaps[1][0][0] = 0xF27A; + gBgTilemaps[0][0][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x279); + gBgTilemaps[1][0][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); for (i = from; i < to; i++) { - gBgTilemaps[0][i][0] = 0xF279; - gBgTilemaps[1][i][0] = 0xF27A; + gBgTilemaps[0][i][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x279); + gBgTilemaps[1][i][0] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); for (j = 1; j < 32; j++) { gBgTilemaps[0][i][j] = 0; - gBgTilemaps[1][i][j] = 0xF27A; + gBgTilemaps[1][i][j] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); } } gUnknown_20274A5 = TRUE; } -UNUSED static void sub_8009488(s32 strArrId) +UNUSED static void sub_8009488(s32 windowId) { s32 i, j; - s32 id0, id1; - UnkTextStruct1 *strPtr = &gUnknown_2027370[strArrId]; + s32 y, x; + Window *window = &gWindows[windowId]; - id0 = strPtr->unk2; - for (i = 0; i < strPtr->unk6; i++) { - id1 = strPtr->unk0; - for (j = 0; j < strPtr->unk4; j++) { - gBgTilemaps[0][id0][id1] &= 0xFC00; - gBgTilemaps[1][id0][id1] = 0xF27A; - id1++; + y = window->y; + for (i = 0; i < window->height; i++) { + x = window->x; + for (j = 0; j < window->width; j++) { + gBgTilemaps[0][y][x] &= TILEMAP_PAL(15) | TILEMAP_FLIP_HORIZONTAL(1) | TILEMAP_FLIP_VERTICAL(1); + gBgTilemaps[1][y][x] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); + x++; } - id0++; + y++; } } @@ -3199,20 +3186,20 @@ UNUSED static void nullsub_172(void) { } -void sub_8009524(s32 strArrId) +void sub_8009524(s32 windowId) { s32 i, j; - UnkTextStruct1 *strPtr = &gUnknown_2027370[strArrId]; - s32 id0 = strPtr->unk2 - 1; + Window *window = &gWindows[windowId]; + s32 y = window->y - 1; - for (i = 0; i < strPtr->unk6 + 2; i++) { - s32 id1 = strPtr->unk0 - 1; - for (j = 0; j < strPtr->unk4 + 2; j++) { - gBgTilemaps[0][id0][id1] &= 0xFC00; - gBgTilemaps[1][id0][id1] = 0xF27A; - id1++; + for (i = 0; i < window->height + 2; i++) { + s32 x = window->x - 1; + for (j = 0; j < window->width + 2; j++) { + gBgTilemaps[0][y][x] &= TILEMAP_PAL(15) | TILEMAP_FLIP_HORIZONTAL(1) | TILEMAP_FLIP_VERTICAL(1); + gBgTilemaps[1][y][x] = TILEMAP_PAL(15) | TILEMAP_TILE_NUM(0x27A); + x++; } - id0++; + y++; } } @@ -3359,36 +3346,36 @@ void InitGraphics(void) } // These functions run from IWRAM for improved performance. -IWRAM_INIT void sub_8272760(s32 id) +IWRAM_INIT void ScrollDownWindow(s32 windowId) { - sub_8272774(gUnknown_2027370, id); + ScrollDownWindowInternal(gWindows, windowId); } -IWRAM_INIT static void sub_8272774(UnkTextStruct1 *txtStructs, s32 id) +IWRAM_INIT static void ScrollDownWindowInternal(Window *windows, s32 windowId) { - UnkTextStruct1 *txtStructPtr = &txtStructs[id]; + Window *window = &windows[windowId]; - if (txtStructPtr->unk8 > 0) { + if (window->unk8 > 0) { s32 i, j; u32 *dstPtr; s32 n; s32 id8, id9; - if (txtStructPtr->unkC == 6) { - s32 unk4 = txtStructPtr->unk4; - s32 dstAdd = ((txtStructPtr->unk24 + 2) * 8); + if (window->type == WINDOW_TYPE_WITH_HEADER) { + s32 unk4 = window->width; + s32 dstAdd = ((window->unk24 + 2) * 8); dstAdd *= unk4; - dstPtr = txtStructPtr->unk18 + dstAdd; - n = txtStructPtr->unk8 - 2; + dstPtr = window->unk18 + dstAdd; + n = window->unk8 - 2; } else { - dstPtr = txtStructPtr->unk18; - n = txtStructPtr->unk8; + dstPtr = window->unk18; + n = window->unk8; } - id8 = txtStructPtr->unk20 + 8; - id9 = txtStructPtr->unk20 + 9; - for (i = 0; i < txtStructPtr->unk4; i++) { + id8 = window->unk20 + 8; + id9 = window->unk20 + 9; + for (i = 0; i < window->width; i++) { s32 to = n - 1; u32 *loopPtr = dstPtr; for (j = 0; j < to; j++) { @@ -3415,43 +3402,43 @@ IWRAM_INIT static void sub_8272774(UnkTextStruct1 *txtStructs, s32 id) dstPtr += 8; } - txtStructPtr->unk30 = txtStructPtr->unk28; - txtStructPtr->unk34 = txtStructPtr->unk1C; - txtStructPtr->unk38 = txtStructPtr->unk2C; - txtStructPtr->unk44 = 1; + window->unk30 = window->unk28; + window->unk34 = window->unk1C; + window->unk38 = window->unk2C; + window->unk44 = 1; } } -IWRAM_INIT void sub_8272870(s32 id) +IWRAM_INIT void ScrollUpWindow(s32 windowId) { - sub_8272884(gUnknown_2027370, id); + ScrollUpWindowInternal(gWindows, windowId); } -IWRAM_INIT static void sub_8272884(UnkTextStruct1 *txtStructs, s32 id) +IWRAM_INIT static void ScrollUpWindowInternal(Window *windows, s32 windowId) { - UnkTextStruct1 *txtStructPtr = &txtStructs[id]; + Window *window = &windows[windowId]; - if (txtStructPtr->unk8 > 0) { + if (window->unk8 > 0) { s32 i, j; u32 *dstPtr; s32 n; s32 id8; s32 unk4, unk8, dstAdd; - if (txtStructPtr->unkC == 6) { - n = txtStructPtr->unk8 - 2; + if (window->type == WINDOW_TYPE_WITH_HEADER) { + n = window->unk8 - 2; } else { - n = txtStructPtr->unk8; + n = window->unk8; } - unk8 = txtStructPtr->unk8 - 1; - unk4 =txtStructPtr->unk4; + unk8 = window->unk8 - 1; + unk4 = window->width; dstAdd = (unk8 * unk4) * 8; - dstPtr = txtStructPtr->unk18 + dstAdd; + dstPtr = window->unk18 + dstAdd; - id8 = txtStructPtr->unk20 + 8; - for (i = 0; i < txtStructPtr->unk4; i++) { + id8 = window->unk20 + 8; + for (i = 0; i < window->width; i++) { u32 lastTwo = 0; s32 to = n - 1; u32 *loopPtr = dstPtr; @@ -3494,27 +3481,27 @@ IWRAM_INIT static void sub_8272884(UnkTextStruct1 *txtStructs, s32 id) dstPtr += 8; } - txtStructPtr->unk30 = txtStructPtr->unk28; - txtStructPtr->unk34 = txtStructPtr->unk1C; - txtStructPtr->unk38 = txtStructPtr->unk2C; - txtStructPtr->unk44 = 1; + window->unk30 = window->unk28; + window->unk34 = window->unk1C; + window->unk38 = window->unk2C; + window->unk44 = 1; } } IWRAM_INIT void sub_82729A4(s32 id) { - sub_82729B8(gUnknown_2027370, id); + sub_82729B8(gWindows, id); } -IWRAM_INIT static void sub_82729B8(UnkTextStruct1 *txtStructs, s32 id) +IWRAM_INIT static void sub_82729B8(Window *windows, s32 id) { s32 i, j; - UnkTextStruct1 *txtStructPtr = &txtStructs[id]; - u32 *dstPtr = txtStructPtr->unk18; - s32 id8 = txtStructPtr->unk20 + 8; - s32 id9 = txtStructPtr->unk20 + 9; + Window *window = &windows[id]; + u32 *dstPtr = window->unk18; + s32 id8 = window->unk20 + 8; + s32 id9 = window->unk20 + 9; - for (i = 0; i < txtStructPtr->unk4; i++) { + for (i = 0; i < window->width; i++) { u32 *loopPtr; dstPtr[3] = dstPtr[5]; @@ -3549,25 +3536,25 @@ IWRAM_INIT static void sub_82729B8(UnkTextStruct1 *txtStructs, s32 id) dstPtr += 8; } - txtStructPtr->unk30 = txtStructPtr->unk28; - txtStructPtr->unk34 = txtStructPtr->unk1C; - txtStructPtr->unk38 = txtStructPtr->unk2C; - txtStructPtr->unk44 = 1; + window->unk30 = window->unk28; + window->unk34 = window->unk1C; + window->unk38 = window->unk2C; + window->unk44 = 1; } IWRAM_INIT void sub_8272A78(s32 id) { - sub_8272A8C(gUnknown_2027370, id); + sub_8272A8C(gWindows, id); } -IWRAM_INIT static void sub_8272A8C(UnkTextStruct1 *txtStructs, s32 id) +IWRAM_INIT static void sub_8272A8C(Window *windows, s32 id) { s32 i, j; - UnkTextStruct1 *txtStructPtr = &txtStructs[id]; - u32 *dstPtr = txtStructPtr->unk18; - s32 id8 = txtStructPtr->unk20 + 8; + Window *window = &windows[id]; + u32 *dstPtr = window->unk18; + s32 id8 = window->unk20 + 8; - for (i = 0; i < txtStructPtr->unk4; i++) { + for (i = 0; i < window->width; i++) { u32 *loopPtr; dstPtr[3] = 0; @@ -3602,10 +3589,10 @@ IWRAM_INIT static void sub_8272A8C(UnkTextStruct1 *txtStructs, s32 id) dstPtr += 8; } - txtStructPtr->unk30 = txtStructPtr->unk28; - txtStructPtr->unk34 = txtStructPtr->unk1C; - txtStructPtr->unk38 = txtStructPtr->unk2C; - txtStructPtr->unk44 = 1; + window->unk30 = window->unk28; + window->unk34 = window->unk1C; + window->unk38 = window->unk2C; + window->unk44 = 1; } // Needed to match, because without it the alignment is different. diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 6b784017e..a3daad4eb 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -75,7 +75,7 @@ const Item gUnknown_80DED44 = ITEM_FLAG_EXISTS, 0, ITEM_NOTHING }; -const Window gUnknown_80DED48 = +const WindowTemplate gUnknown_80DED48 = { 0, 0x03, @@ -85,7 +85,7 @@ const Window gUnknown_80DED48 = NULL }; -const Window gUnknown_80DED60 = +const WindowTemplate gUnknown_80DED60 = { 0, 0x03, @@ -103,7 +103,7 @@ const MenuItem gUnknown_80DED78[] = }; // Unused -const Window gUnknown_80DEDA0 = +const WindowTemplate gUnknown_80DEDA0 = { 0, 0x03, diff --git a/src/unk_menu_203B360.c b/src/unk_menu_203B360.c index 84262722d..2ecf24159 100644 --- a/src/unk_menu_203B360.c +++ b/src/unk_menu_203B360.c @@ -15,14 +15,14 @@ typedef struct unkStruct_203B360 /* 0x0 */ u32 currMenu; u32 unk4; // state MenuStruct unk8[4]; - Windows unk148; + WindowTemplates unk148; SpriteOAM unk1A8; u32 unk1B0; // sprite count? } unkStruct_203B360; static EWRAM_INIT unkStruct_203B360 *sUnknown_203B360 = {NULL}; -const Window gUnknown_80E6E7C = { +const WindowTemplate gUnknown_80E6E7C = { 0, 0x03, 0x00, 0x00, @@ -31,7 +31,7 @@ const Window gUnknown_80E6E7C = { NULL }; -const Window gUnknown_80E6E94 = { +const WindowTemplate gUnknown_80E6E94 = { 0, 0x03, 0x05, 0x09, diff --git a/src/wigglytuff_shop1.c b/src/wigglytuff_shop1.c index bf89f2253..858cbd1b1 100644 --- a/src/wigglytuff_shop1.c +++ b/src/wigglytuff_shop1.c @@ -33,7 +33,7 @@ bool8 sub_80211AC(u32 mode, u32 a1) sWigglytuffShop1Work->s40.s0.unk38 = &sWigglytuffShop1Work->s40.s0.windows.id[sWigglytuffShop1Work->s40.s0.unk34]; RestoreUnkTextStruct_8006518(&sWigglytuffShop1Work->s40.s0.windows); sWigglytuffShop1Work->s40.s0.windows.id[sWigglytuffShop1Work->s40.s0.unk34] = sUnknown_80DC47C; - sWigglytuffShop1Work->s40.s0.unk38->unk14 = &sWigglytuffShop1Work->s40.unk9C; + sWigglytuffShop1Work->s40.s0.unk38->header = &sWigglytuffShop1Work->s40.unk9C; ResetUnusedInputStruct(); ShowWindows(&sWigglytuffShop1Work->s40.s0.windows, TRUE, TRUE); sub_8013818(&sWigglytuffShop1Work->s40.s0.input, sub_8021664(), 10, a1); @@ -113,9 +113,9 @@ void sub_80213A0(void) static void sub_8021410(void) { - sWigglytuffShop1Work->s40.unk9C.f0 = 1; - sWigglytuffShop1Work->s40.unk9C.f1 = 0; - sWigglytuffShop1Work->s40.unk9C.f2 = 12; + sWigglytuffShop1Work->s40.unk9C.count = 1; + sWigglytuffShop1Work->s40.unk9C.currId = 0; + sWigglytuffShop1Work->s40.unk9C.width = 12; sWigglytuffShop1Work->s40.unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&sWigglytuffShop1Work->s40.s0.windows, TRUE, TRUE); @@ -134,7 +134,7 @@ void sub_8021494(void) sub_80073B8(sWigglytuffShop1Work->s40.s0.unk34); PrintStringOnWindow(10, 0, sFriendAreas, sWigglytuffShop1Work->s40.s0.unk34, 0); - sub_8012BC4((sWigglytuffShop1Work->s40.unk9C.f2 * 8) + 4, 0, sWigglytuffShop1Work->s40.s0.input.unk1E + 1, 1, 7, sWigglytuffShop1Work->s40.s0.unk34); + sub_8012BC4((sWigglytuffShop1Work->s40.unk9C.width * 8) + 4, 0, sWigglytuffShop1Work->s40.s0.input.unk1E + 1, 1, 7, sWigglytuffShop1Work->s40.s0.unk34); for (i = 0; i < sWigglytuffShop1Work->s40.s0.input.unk1A; i++) { friendAreaIndex = sWigglytuffShop1Work->friendAreas[(sWigglytuffShop1Work->s40.s0.input.unk1E * sWigglytuffShop1Work->s40.s0.input.unk1C) + i]; diff --git a/src/wigglytuff_shop2.c b/src/wigglytuff_shop2.c index 446519a94..db1635cfa 100644 --- a/src/wigglytuff_shop2.c +++ b/src/wigglytuff_shop2.c @@ -96,14 +96,14 @@ static void PopulateWigglytuffShopFriendAreaInfoScreen(void) else PrintStringOnWindow(32, 60, sInhabitants, sWigglytuffShop2Work->unk74, 0); - sub_800792C(sWigglytuffShop2Work->unk74, 4, 64, 20, 4); + AddUnderScoreHighlight(sWigglytuffShop2Work->unk74, 4, 64, 20, 4); if (sWigglytuffShop2Work->unkD != 0) - sub_800792C(sWigglytuffShop2Work->unk74, 184, 64, 20, 4); + AddUnderScoreHighlight(sWigglytuffShop2Work->unk74, 184, 64, 20, 4); else - sub_800792C(sWigglytuffShop2Work->unk74, 94, 64, 110, 4); + AddUnderScoreHighlight(sWigglytuffShop2Work->unk74, 94, 64, 110, 4); - sub_800792C(sWigglytuffShop2Work->unk74, 4, 130, 200, 4); + AddUnderScoreHighlight(sWigglytuffShop2Work->unk74, 4, 130, 200, 4); sub_8007A78(sWigglytuffShop2Work->unk74, 3, 64, 67, 4); sub_8007A78(sWigglytuffShop2Work->unk74, 204, 64, 67, 4); diff --git a/src/wonder_mail_3_mid.c b/src/wonder_mail_3_mid.c index 545d90dbd..f9b848b27 100644 --- a/src/wonder_mail_3_mid.c +++ b/src/wonder_mail_3_mid.c @@ -19,7 +19,7 @@ struct unkStruct_203B30C unkStruct_802C39C unk8; MenuStruct unk60; MenuItem unkB0[8]; - Windows unkF0; + WindowTemplates unkF0; }; static EWRAM_INIT struct unkStruct_203B30C *gUnknown_203B30C = {NULL}; @@ -31,7 +31,7 @@ extern void sub_802F004(); extern void sub_802F088(); extern void sub_802F108(void); -const Window gUnknown_80E03C4 = { +const WindowTemplate gUnknown_80E03C4 = { 0, 0x03, 0x00, 0x00, @@ -39,7 +39,7 @@ const Window gUnknown_80E03C4 = { 0x00, 0x00, NULL }; -const Window gUnknown_80E03DC = { +const WindowTemplate gUnknown_80E03DC = { 0, 0x03, 0x03, 0x03, @@ -47,7 +47,7 @@ const Window gUnknown_80E03DC = { 0x03, 0x00, NULL }; -const Window gUnknown_80E03F4 = { +const WindowTemplate gUnknown_80E03F4 = { 0, 0x03, 0x15, 0x06, diff --git a/src/wonder_mail_4.c b/src/wonder_mail_4.c index c0f71b37f..e5e8af37e 100644 --- a/src/wonder_mail_4.c +++ b/src/wonder_mail_4.c @@ -26,7 +26,7 @@ static EWRAM_INIT struct unkStruct_203B320 *gUnknown_203B320 = {NULL}; extern unkStruct_203B480 *gUnknown_203B480; -const Window gUnknown_80E083C = { +const WindowTemplate gUnknown_80E083C = { 0, 0x03, 0x00, 0x00, @@ -35,7 +35,7 @@ const Window gUnknown_80E083C = { NULL }; -const Window gUnknown_80E0854 = { +const WindowTemplate gUnknown_80E0854 = { 0, 0x06, 0x02, 0x02, @@ -90,7 +90,7 @@ u32 sub_80306A8(u32 wonderMailType, u32 r1, DungeonPos *r2, u32 r3) RestoreUnkTextStruct_8006518(&gUnknown_203B320->s28.s0.windows); gUnknown_203B320->s28.s0.windows.id[gUnknown_203B320->s28.s0.unk34] = gUnknown_80E0854; - gUnknown_203B320->s28.s0.unk38->unk14 = &gUnknown_203B320->s28.unk9C; + gUnknown_203B320->s28.s0.unk38->header = &gUnknown_203B320->s28.unk9C; if (r2 != 0) gUnknown_203B320->s28.s0.windows.id[gUnknown_203B320->s28.s0.unk34].pos = *r2; @@ -169,9 +169,9 @@ u8 *sub_8030894(void) void sub_80308A0(void) { - gUnknown_203B320->s28.unk9C.f0 = gUnknown_203B320->s28.s0.input.unk20; - gUnknown_203B320->s28.unk9C.f1 = gUnknown_203B320->s28.s0.input.unk1E; - gUnknown_203B320->s28.unk9C.f2 = 12; + gUnknown_203B320->s28.unk9C.count = gUnknown_203B320->s28.s0.input.unk20; + gUnknown_203B320->s28.unk9C.currId = gUnknown_203B320->s28.s0.input.unk1E; + gUnknown_203B320->s28.unk9C.width = 12; gUnknown_203B320->s28.unk9C.f3 = 0; ResetUnusedInputStruct(); ShowWindows(&gUnknown_203B320->s28.s0.windows, TRUE, TRUE); @@ -194,7 +194,7 @@ void sub_803092C(void) r5 += 10; PrintStringOnWindow(r5,0,gUnknown_80E086C[gUnknown_203B320->wonderMailType],gUnknown_203B320->s28.s0.unk34,0); r4 += 4; - r5 = r4 + gUnknown_203B320->s28.unk9C.f2 * 8; + r5 = r4 + gUnknown_203B320->s28.unk9C.width * 8; sub_8012BC4(r5,0,gUnknown_203B320->s28.s0.input.unk1E + 1,1,7,gUnknown_203B320->s28.s0.unk34); for (index = 0; index < gUnknown_203B320->s28.s0.input.unk1A; index++) { diff --git a/src/wonder_mail_5.c b/src/wonder_mail_5.c index ec366a25e..6ff971b1b 100644 --- a/src/wonder_mail_5.c +++ b/src/wonder_mail_5.c @@ -20,8 +20,8 @@ struct unkStruct_203B324 MenuInputStructSub unk0; u8 mailIndex; u32 windowID; - Window *unk14; - Windows unk18; + WindowTemplate *unk14; + WindowTemplates unk18; }; static EWRAM_INIT struct unkStruct_203B324 *gUnknown_203B324 = {NULL}; @@ -29,7 +29,7 @@ static EWRAM_INIT struct unkStruct_203B324 *gUnknown_203B324 = {NULL}; extern unkStruct_203B480 *gUnknown_203B480; -const Window gUnknown_80E0900 = { +const WindowTemplate gUnknown_80E0900 = { 0, 0x03, 0x00, 0x00, @@ -40,7 +40,7 @@ const Window gUnknown_80E0900 = { const WindowHeader gUnknown_80E0918 = {0x01, 0x00, 0x12, 0x00}; -const Window gUnknown_80E091C = { +const WindowTemplate gUnknown_80E091C = { 0, 0x06, 0x02, 0x02, diff --git a/src/wonder_mail_6.c b/src/wonder_mail_6.c index 7ffa730c0..2a834a5bb 100644 --- a/src/wonder_mail_6.c +++ b/src/wonder_mail_6.c @@ -17,7 +17,7 @@ struct unkStruct_203B328 u8 mailIndex; MenuStruct unk8; MenuStruct unk58; - Windows unkA8; + WindowTemplates unkA8; /* 0x108 */ struct MonPortraitMsg monPortrait; u32 wonderMailType; }; @@ -48,7 +48,7 @@ const MenuItem gUnknown_80E0968[] = {NULL, CANCEL_ACTION} }; -const Window gUnknown_80E0990 = { +const WindowTemplate gUnknown_80E0990 = { 0, 0x03, 0x00, 0x00, @@ -56,7 +56,7 @@ const Window gUnknown_80E0990 = { 0x00, 0x00, NULL }; -const Window gUnknown_80E09A8 = { +const WindowTemplate gUnknown_80E09A8 = { 0, 0x03, 0x13, 0x0B, @@ -64,7 +64,7 @@ const Window gUnknown_80E09A8 = { 0x03, 0x00, NULL }; -const Window gUnknown_80E09C0 = { +const WindowTemplate gUnknown_80E09C0 = { 0, 0x03, 0x11, 0x0F, diff --git a/src/wonder_mail_802C10C.c b/src/wonder_mail_802C10C.c index b37dec5bf..fa8e3b35d 100644 --- a/src/wonder_mail_802C10C.c +++ b/src/wonder_mail_802C10C.c @@ -33,7 +33,7 @@ bool8 sub_802C10C(s32 a0, DungeonPos *a1, s32 a2) RestoreUnkTextStruct_8006518(&gUnknown_203B2E0->unk8.s0.windows); gUnknown_203B2E0->unk8.s0.windows.id[gUnknown_203B2E0->unk8.s0.unk34] = sUnknown_80DFCB4; - gUnknown_203B2E0->unk8.s0.unk38->unk14 = &gUnknown_203B2E0->unk8.unk9C; + gUnknown_203B2E0->unk8.s0.unk38->header = &gUnknown_203B2E0->unk8.unk9C; if (a1 != NULL) gUnknown_203B2E0->unk8.s0.windows.id[gUnknown_203B2E0->unk8.s0.unk34].pos = *a1; @@ -108,9 +108,9 @@ void sub_802C2D4(void) static void sub_802C328(void) { - gUnknown_203B2E0->unk8.unk9C.f0 = gUnknown_203B2E0->unk8.s0.input.unk20; - gUnknown_203B2E0->unk8.unk9C.f1 = gUnknown_203B2E0->unk8.s0.input.unk1E; - gUnknown_203B2E0->unk8.unk9C.f2 = 12; + gUnknown_203B2E0->unk8.unk9C.count = gUnknown_203B2E0->unk8.s0.input.unk20; + gUnknown_203B2E0->unk8.unk9C.currId = gUnknown_203B2E0->unk8.s0.input.unk1E; + gUnknown_203B2E0->unk8.unk9C.width = 12; gUnknown_203B2E0->unk8.unk9C.f3 = 0; SUB_8009614_CALL(gUnknown_203B2E0->unk8.s0); @@ -133,7 +133,7 @@ void DrawPelipperBoardJobMenu(void) PrintStringOnWindow(x, 0, sBulletinBoard, gUnknown_203B2E0->unk8.s0.unk34, 0); iVar4 += 4; - x = iVar4 + (gUnknown_203B2E0->unk8.unk9C.f2 * 8); + x = iVar4 + (gUnknown_203B2E0->unk8.unk9C.width * 8); sub_8012BC4(x, 0, gUnknown_203B2E0->unk8.s0.input.unk1E + 1, 2, 7, gUnknown_203B2E0->unk8.s0.unk34); for (i = 0; i < gUnknown_203B2E0->unk8.s0.input.unk1A; i++) { diff --git a/src/wonder_mail_802C4C8.c b/src/wonder_mail_802C4C8.c index 66d4b380a..ff2627f21 100644 --- a/src/wonder_mail_802C4C8.c +++ b/src/wonder_mail_802C4C8.c @@ -34,7 +34,7 @@ bool8 sub_802C4C8(s32 a0, DungeonPos *a1, u32 a2) RestoreUnkTextStruct_8006518(&gUnknown_203B2E8->unk8.s0.windows); gUnknown_203B2E8->unk8.s0.windows.id[gUnknown_203B2E8->unk8.s0.unk34] = sUnknown_80DFCFC; - gUnknown_203B2E8->unk8.s0.unk38->unk14 = &gUnknown_203B2E8->unk8.unk9C; + gUnknown_203B2E8->unk8.s0.unk38->header = &gUnknown_203B2E8->unk8.unk9C; if (a1 != NULL) gUnknown_203B2E8->unk8.s0.windows.id[gUnknown_203B2E8->unk8.s0.unk34].pos = *a1; @@ -109,9 +109,9 @@ void sub_802C688(void) static void sub_802C6DC(void) { - gUnknown_203B2E8->unk8.unk9C.f0 = gUnknown_203B2E8->unk8.s0.input.unk20; - gUnknown_203B2E8->unk8.unk9C.f1 = gUnknown_203B2E8->unk8.s0.input.unk1E; - gUnknown_203B2E8->unk8.unk9C.f2 = 12; + gUnknown_203B2E8->unk8.unk9C.count = gUnknown_203B2E8->unk8.s0.input.unk20; + gUnknown_203B2E8->unk8.unk9C.currId = gUnknown_203B2E8->unk8.s0.input.unk1E; + gUnknown_203B2E8->unk8.unk9C.width = 12; gUnknown_203B2E8->unk8.unk9C.f3 = 0; SUB_8009614_CALL(gUnknown_203B2E8->unk8.s0); @@ -133,7 +133,7 @@ void DrawJobListMenu(void) PrintStringOnWindow(x, 0, sJobList, gUnknown_203B2E8->unk8.s0.unk34, 0); r4 += 4; - x = r4 + (gUnknown_203B2E8->unk8.unk9C.f2 * 8); + x = r4 + (gUnknown_203B2E8->unk8.unk9C.width * 8); sub_8012BC4(x, 0, gUnknown_203B2E8->unk8.s0.input.unk1E + 1, 2, 7, gUnknown_203B2E8->unk8.s0.unk34); for (i = 0; i < gUnknown_203B2E8->unk8.s0.input.unk1A; i++) { diff --git a/src/wonder_mail_802CDD4.c b/src/wonder_mail_802CDD4.c index ce6a6d4d2..57b794396 100644 --- a/src/wonder_mail_802CDD4.c +++ b/src/wonder_mail_802CDD4.c @@ -28,7 +28,7 @@ bool8 sub_802CDD4(u32 a0) sUnknown_203B2F4->s0.unk38 = &sUnknown_203B2F4->s0.windows.id[sUnknown_203B2F4->s0.unk34]; RestoreUnkTextStruct_8006518(&sUnknown_203B2F4->s0.windows); sUnknown_203B2F4->s0.windows.id[sUnknown_203B2F4->s0.unk34] = sUnknown_80DFDA4; - sUnknown_203B2F4->s0.unk38->unk14 = &sUnknown_203B2F4->unk9C; + sUnknown_203B2F4->s0.unk38->header = &sUnknown_203B2F4->unk9C; sub_8012D34(sUnknown_203B2F4->s0.unk38, 4); ResetUnusedInputStruct(); ShowWindows(&sUnknown_203B2F4->s0.windows, TRUE, TRUE); @@ -91,9 +91,9 @@ void sub_802CF14(void) static void sub_802CF5C(void) { - sUnknown_203B2F4->unk9C.f0 = sUnknown_203B2F4->s0.input.unk20; - sUnknown_203B2F4->unk9C.f1 = sUnknown_203B2F4->s0.input.unk1E; - sUnknown_203B2F4->unk9C.f2 = 12; + sUnknown_203B2F4->unk9C.count = sUnknown_203B2F4->s0.input.unk20; + sUnknown_203B2F4->unk9C.currId = sUnknown_203B2F4->s0.input.unk1E; + sUnknown_203B2F4->unk9C.width = 12; sUnknown_203B2F4->unk9C.f3 = 0; SUB_8009614_CALL(sUnknown_203B2F4->s0); @@ -113,7 +113,7 @@ void sub_802CFD0(void) PrintStringOnWindow(r5, 0, sRescueEvent, sUnknown_203B2F4->s0.unk34, 0); r4 -= 6; - r5 = r4 + (sUnknown_203B2F4->unk9C.f2 * 8); + r5 = r4 + (sUnknown_203B2F4->unk9C.width * 8); sub_8012BC4(r5, 0, sUnknown_203B2F4->s0.input.unk1E + 1, 2, 7, sUnknown_203B2F4->s0.unk34); for (r5 = 0; r5 < sUnknown_203B2F4->s0.input.unk1A; r5++) { diff --git a/src/wonder_mail_main_menu.c b/src/wonder_mail_main_menu.c index 6c2598492..5cec3e8e2 100644 --- a/src/wonder_mail_main_menu.c +++ b/src/wonder_mail_main_menu.c @@ -49,7 +49,7 @@ struct unkStruct_203B3E8 u8 unk38_u8[0x30]; // idk why it fills to 0x30 instead... } UNK38; u8 fill68[0x1EC - 0x68]; - Windows unk1EC; + WindowTemplates unk1EC; u32 unk24C; /* 0x250 */ u32 wonderMailStatus; unkStruct_803B344 unk254; diff --git a/src/world_map.c b/src/world_map.c index c47ca543a..710e6d0ae 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -38,7 +38,7 @@ extern void sub_80117AC(void); extern void sub_8011760(void); static EWRAM_INIT struct WorldMap *sWorldMapPtr = NULL; -static EWRAM_INIT Windows sWorldMapWindows = { +static EWRAM_INIT WindowTemplates sWorldMapWindows = { .id = { [0] = { .type = WINDOW_TYPE_NORMAL, @@ -54,8 +54,8 @@ static EWRAM_INIT Windows sWorldMapWindows = { .height = 3, .unk10 = 3, }, - [2] = { .type = WINDOW_TYPE_NORMAL,}, - [3] = { .type = WINDOW_TYPE_NORMAL,}, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, } }; @@ -483,19 +483,18 @@ static void AnimateSprites(bool8 a0) static void PrintDungeonName(DungeonLocation *dungLocation) { - const s32 x = 12; - Windows windows = { + WindowTemplates windows = { .id = { [0] = { .type = WINDOW_TYPE_NORMAL, - .pos = {x, 2}, + .pos = {12, 2}, .width = 16, .height = 2, .unk10 = 2, }, - [1] = {.type = WINDOW_TYPE_NORMAL}, - [2] = {.type = WINDOW_TYPE_NORMAL}, - [3] = {.type = WINDOW_TYPE_NORMAL}, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, } }; diff --git a/sym_ewram.txt b/sym_ewram.txt index a34c394cd..cc007b725 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -94,7 +94,7 @@ gUnknown_202EDC0: /* 202EDC0 (sub_803E250 - sub_80462AC) */ .space 0x8 gDungeonBrightness: /* 202EDC8 (sub_803E250 - sub_8086794) */ .space 0x4 -gUnknown_202EDCC: /* 202EDCC (sub_803E490 - sub_807D148) */ +gDungeonFramesCounter: /* 202EDCC (sub_803E490 - sub_807D148) */ .space 0x4 gUnknown_202EDD0: /* 202EDD0 (sub_803E250 - sub_8052210) */ .space 0x4 @@ -114,7 +114,7 @@ gUnknown_202EDFC: /* 202EDFC (sub_803F27C - sub_803F878) */ gUnknown_202EE0C: /* 202EE0C (sub_80694C0 - sub_806B8CC) */ .space 0x4 -gUnknown_202EE10: /* 202EE10 (sub_803EC94 - sub_8083CE0) */ +gDungeonMenu: /* 202EE10 (sub_803EC94 - sub_8083CE0) */ .space 0x28 gUnknown_202EE38: /* 202EE38 (sub_8063834) */ @@ -125,9 +125,9 @@ gUnknown_202EE39: /* 202EE39 (sub_8060E38) */ gUnknown_202EE3A: /* 202EE3A (sub_8060E38 - sub_8065DBC) */ .space 0xA -gUnknown_202EE44: /* 202EE44 (sub_8044EC8 - sub_80647F0) */ +gDungeonSubMenu: /* 202EE44 (sub_8044EC8 - sub_80647F0) */ .space 0x28 -gUnknown_202EE6C: /* 202EE6C (sub_8044F5C - sub_8067A80) */ +gDungeonSubMenuItemsCount: /* 202EE6C (sub_8044F5C - sub_8067A80) */ .space 0x4 gUnknown_202EE70: /* 202EE70 (sub_804513C - sub_80828E0) */ @@ -139,33 +139,16 @@ gUnknown_202EE76: /* 202EE76 (sub_804513C - sub_8082A08) */ .include "src/dungeon_generation.o" .include "src/dungeon_message.o" .include "src/dungeon_move.o" - .include "src/code_805D8C8_1.o" - -gUnknown_202F268: /* 202F268 (sub_8062500) */ - .space 0x8 -gUnknown_202F270: /* 202F270 (sub_8060E38 - sub_8061A38) */ - .space 0x8 - -gUnknown_202F278: /* 202F278 (sub_80639E4) */ - .space 0x60 - -gUnknown_202F2D8: /* 202F2D8 (sub_8062F90 - sub_8064310) */ - .space 0x8 - -gUnknown_202F2E0: /* 202F2E0 (sub_8064BE0 - sub_8065250) */ - .space 0x8 - -gUnknown_202F2E8: /* 202F2E8 (sub_8064D74 - sub_8065B3C) */ - .space 0x10 - -gUnknown_202F2F8: /* 202F2F8 (sub_8065FB4 - sub_8066358) */ + .include "src/dungeon_main.o" .space 0x4 -gUnknown_202F2FC: /* 202F2FC (sub_8065FB4 - sub_8066358) */ + .include "src/dungeon_menu_items.o" .space 0x4 - -gUnknown_202F300: /* 202F300 (sub_8066434) */ - .space 0x8 - + .include "src/dungeon_menu_team.o" + .space 0x4 + .include "src/dungeon_menu_moves.o" + .space 0x4 + .include "src/dungeon_menu_others.o" + .include "src/dungeon_menu_recruitment.o" .include "src/code_8066D04.o" .include "src/dungeon_movement.o" .include "src/code_80718D8.o" diff --git a/sym_ewram_init.txt b/sym_ewram_init.txt index 39685f199..23cd1a349 100644 --- a/sym_ewram_init.txt +++ b/sym_ewram_init.txt @@ -114,7 +114,8 @@ .include "src/dungeon_map_access.o" .include "src/dungeon_message.o" .include "src/dungeon_move.o" -.include "src/code_805D8C8_1.o" +.include "src/dungeon_main.o" +.include "src/dungeon_menu_recruitment.o" .include "src/dungeon_ai_items.o" .include "src/code_807CD9C.o" .include "src/dungeon_leader.o"