diff --git a/asm/boss_8.s b/asm/boss_8.s deleted file mode 100644 index 6d8b89282..000000000 --- a/asm/boss_8.s +++ /dev/null @@ -1,4885 +0,0 @@ -.include "asm/macros.inc" -.include "constants/constants.inc" - -.section .rodata - - .global gUnknown_080D8888 -gUnknown_080D8888: - .incbin "baserom.gba", 0x000D8888, 0x2 - - .global gUnknown_080D888A -gUnknown_080D888A: - .incbin "baserom.gba", 0x000D888A, 0x6 - - .global gUnknown_080D8890 -gUnknown_080D8890: - .incbin "baserom.gba", 0x000D8890, 0x20 - - .global gUnknown_080D88B0 -gUnknown_080D88B0: - .incbin "baserom.gba", 0x000D88B0, 0x40 - -.text -.syntax unified -.arm - - thumb_func_start CreateSuperEggRoboZ -CreateSuperEggRoboZ: @ 0x0804A6C8 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x50 - ldr r1, _0804A764 @ =gBgCntRegs - movs r2, #0 - movs r3, #0 - ldr r0, _0804A768 @ =0x0000D40E - strh r0, [r1] - ldr r0, _0804A76C @ =0x00001F01 - strh r0, [r1, #4] - ldr r0, _0804A770 @ =gBgScrollRegs - strh r3, [r0] - strh r3, [r0, #2] - ldr r0, _0804A774 @ =gUnknown_03004D80 - strb r2, [r0] - ldr r1, _0804A778 @ =gUnknown_03002280 - strb r2, [r1] - strb r2, [r1, #1] - movs r0, #0xff - strb r0, [r1, #2] - movs r0, #0x40 - strb r0, [r1, #3] - ldr r2, _0804A77C @ =gPlayer - ldr r0, [r2, #0x20] - movs r1, #0x80 - lsls r1, r1, #0xe - orrs r0, r1 - str r0, [r2, #0x20] - bl sub_8039ED4 - ldr r1, _0804A780 @ =gPseudoRandom - ldr r0, _0804A784 @ =gStageTime - ldr r0, [r0] - str r0, [r1] - ldr r1, _0804A788 @ =gUnknown_03005AF0 - ldr r0, [r1, #0x1c] - ldr r3, _0804A78C @ =0xFFFFCFFF - ands r0, r3 - movs r2, #0x80 - lsls r2, r2, #5 - orrs r0, r2 - str r0, [r1, #0x1c] - ldr r1, _0804A790 @ =gUnknown_03005AA0 - ldr r0, [r1, #0x1c] - ands r0, r3 - orrs r0, r2 - str r0, [r1, #0x1c] - ldr r0, _0804A794 @ =Task_SuperEggRoboZMain - movs r1, #0xa4 - lsls r1, r1, #1 - movs r2, #0x80 - lsls r2, r2, #7 - ldr r3, _0804A798 @ =TaskDestructor_SuperEggRoboZMain - str r3, [sp] - movs r3, #0 - bl TaskCreate - ldr r1, _0804A79C @ =gActiveBossTask - str r0, [r1] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r7, r1, r0 - adds r0, #0x48 - adds r0, r0, r1 - mov sb, r0 - ldr r0, _0804A7A0 @ =gDifficultyLevel - ldrb r0, [r0] - cmp r0, #0 - beq _0804A7A4 - movs r0, #6 - strb r0, [r7, #8] - movs r0, #4 - b _0804A7AA - .align 2, 0 -_0804A764: .4byte gBgCntRegs -_0804A768: .4byte 0x0000D40E -_0804A76C: .4byte 0x00001F01 -_0804A770: .4byte gBgScrollRegs -_0804A774: .4byte gUnknown_03004D80 -_0804A778: .4byte gUnknown_03002280 -_0804A77C: .4byte gPlayer -_0804A780: .4byte gPseudoRandom -_0804A784: .4byte gStageTime -_0804A788: .4byte gUnknown_03005AF0 -_0804A78C: .4byte 0xFFFFCFFF -_0804A790: .4byte gUnknown_03005AA0 -_0804A794: .4byte Task_SuperEggRoboZMain -_0804A798: .4byte TaskDestructor_SuperEggRoboZMain -_0804A79C: .4byte gActiveBossTask -_0804A7A0: .4byte gDifficultyLevel -_0804A7A4: - movs r0, #8 - strb r0, [r7, #8] - movs r0, #6 -_0804A7AA: - strb r0, [r7, #9] - strb r0, [r7, #0xa] - ldr r0, _0804A8B0 @ =0x00A77C00 - str r0, [r7] - movs r0, #0xb9 - lsls r0, r0, #9 - str r0, [r7, #4] - movs r1, #0 - movs r0, #0xb4 - lsls r0, r0, #1 - strh r0, [r7, #0xe] - adds r0, #0x98 - strh r0, [r7, #0x10] - strb r1, [r7, #0xb] - strb r1, [r7, #0xc] - movs r0, #0x1e - str r0, [r7, #0x14] - movs r0, #0x20 - bl VramMalloc - str r0, [r7, #0x44] - adds r1, r7, #0 - bl sub_8049D20 - movs r4, #0 - adds r1, r7, #0 - adds r1, #0x28 - str r1, [sp, #0x24] - adds r2, r7, #0 - adds r2, #0x2c - str r2, [sp, #0x28] - adds r6, r7, #0 - adds r6, #0x18 - str r6, [sp, #0x18] - adds r0, r7, #0 - adds r0, #0x1c - str r0, [sp, #0x1c] - adds r1, #0x14 - str r1, [sp, #0x38] - adds r2, #4 - str r2, [sp, #0x2c] - adds r6, #0x26 - str r6, [sp, #0x3c] - adds r0, #0x24 - str r0, [sp, #0x40] - adds r1, #6 - str r1, [sp, #0x44] - adds r2, #4 - str r2, [sp, #0x30] - subs r6, #8 - str r6, [sp, #0x34] - movs r0, #0x99 - lsls r0, r0, #1 - adds r0, r7, r0 - str r0, [sp, #0x20] - adds r1, #0x12 - str r1, [sp, #0x48] - adds r2, #0x40 - str r2, [sp, #8] - adds r6, #0x3f - str r6, [sp, #0xc] - adds r0, r7, #0 - adds r0, #0x76 - str r0, [sp, #0x10] - adds r1, #0x25 - str r1, [sp, #0x14] - movs r3, #0 - movs r5, #0 -_0804A832: - lsls r2, r4, #1 - ldr r6, [sp, #0x24] - adds r0, r6, r2 - movs r1, #0x80 - lsls r1, r1, #2 - strh r1, [r0] - ldr r6, [sp, #0x28] - adds r0, r6, r2 - strh r1, [r0] - lsls r1, r4, #3 - ldr r6, [sp, #0x18] - adds r0, r6, r1 - str r5, [r0] - ldr r0, [sp, #0x1c] - adds r1, r0, r1 - str r5, [r1] - ldr r1, [sp, #0x38] - adds r0, r1, r4 - strb r3, [r0] - ldr r6, [sp, #0x2c] - adds r1, r6, r2 - adds r2, r2, r4 - lsls r0, r2, #4 - subs r0, r0, r2 - lsls r0, r0, #3 - movs r2, #0xb4 - lsls r2, r2, #1 - adds r0, r0, r2 - strh r0, [r1] - ldr r6, [sp, #0x3c] - adds r0, r6, r4 - strb r3, [r0] - ldr r1, [sp, #0x40] - adds r0, r1, r4 - strb r3, [r0] - ldr r2, [sp, #0x44] - adds r0, r2, r4 - strb r3, [r0] - lsls r1, r4, #2 - ldr r6, [sp, #0x30] - adds r0, r6, r1 - strh r5, [r0] - ldr r2, [sp, #0x34] - adds r0, r2, r1 - strh r5, [r0] - lsls r0, r4, #4 - subs r0, r0, r4 - lsls r0, r0, #2 - adds r0, #0x90 - adds r6, r7, r0 - strh r5, [r6, #0x16] - strh r5, [r6, #0x18] - mov r8, r1 - cmp r4, #0 - beq _0804A8B4 - movs r0, #0x40 - str r3, [sp, #0x4c] - bl VramMalloc - str r0, [r6, #4] - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804A8C0 - .align 2, 0 -_0804A8B0: .4byte 0x00A77C00 -_0804A8B4: - movs r0, #0x40 - str r3, [sp, #0x4c] - bl VramMalloc - str r0, [r6, #4] - ldr r0, _0804A9BC @ =0x000002BF -_0804A8C0: - strh r0, [r6, #0xa] - adds r0, r6, #0 - adds r0, #0x20 - ldr r3, [sp, #0x4c] - strb r3, [r0] - mov r0, r8 - adds r0, #0x1b - lsls r0, r0, #6 - strh r0, [r6, #0x1a] - strh r5, [r6, #8] - strh r5, [r6, #0x14] - strh r5, [r6, #0x1c] - adds r1, r6, #0 - adds r1, #0x21 - movs r2, #1 - rsbs r2, r2, #0 - mov r0, sp - strb r2, [r0, #4] - movs r0, #0xff - strb r0, [r1] - adds r0, r6, #0 - adds r0, #0x22 - movs r1, #0x10 - mov sl, r1 - mov r2, sl - strb r2, [r0] - adds r0, #3 - strb r3, [r0] - movs r0, #1 - rsbs r0, r0, #0 - mov r8, r0 - str r0, [r6, #0x28] - movs r0, #0x80 - lsls r0, r0, #5 - str r0, [r6, #0x10] - adds r0, r4, #1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - cmp r4, #1 - bls _0804A832 - movs r5, #0 - movs r4, #0 - mov r1, sb - strh r4, [r1] - strh r4, [r1, #4] - movs r0, #2 - strh r0, [r1, #2] - strh r4, [r1, #6] - ldr r0, _0804A9C0 @ =0x000037BF - strh r0, [r1, #8] - strh r4, [r1, #0xa] - movs r2, #0x84 - lsls r2, r2, #1 - adds r0, r7, r2 - ldr r1, _0804A9C4 @ =0x0600C000 - str r1, [r0, #4] - strh r4, [r0, #0xa] - ldr r1, _0804A9C8 @ =0x0600A000 - str r1, [r0, #0xc] - strh r4, [r0, #0x18] - strh r4, [r0, #0x1a] - movs r1, #0xb8 - lsls r1, r1, #1 - strh r1, [r0, #0x1c] - strh r4, [r0, #0x1e] - strh r4, [r0, #0x20] - strh r4, [r0, #0x22] - strh r4, [r0, #0x24] - movs r1, #0x1e - strh r1, [r0, #0x26] - movs r1, #0x14 - strh r1, [r0, #0x28] - ldr r6, [sp, #0x20] - strb r5, [r6] - strh r4, [r0, #0x2e] - bl DrawBackground - ldr r6, [sp, #0x48] - strh r4, [r6, #0x16] - strh r4, [r6, #0x18] - movs r0, #0x40 - bl VramMalloc - str r0, [r6, #4] - ldr r0, _0804A9CC @ =0x000002C1 - strh r0, [r6, #0xa] - ldr r0, [sp, #8] - strb r5, [r0] - movs r0, #0xf8 - lsls r0, r0, #3 - strh r0, [r6, #0x1a] - strh r4, [r6, #8] - strh r4, [r6, #0x14] - strh r4, [r6, #0x1c] - ldr r1, [sp, #0xc] - ldrb r0, [r1] - mov r2, sp - ldrb r2, [r2, #4] - orrs r0, r2 - strb r0, [r1] - mov r1, sl - ldr r0, [sp, #0x10] - strb r1, [r0] - ldr r2, [sp, #0x14] - strb r5, [r2] - mov r0, r8 - str r0, [r6, #0x28] - movs r0, #0xc0 - lsls r0, r0, #6 - str r0, [r6, #0x10] - ldr r1, _0804A9D0 @ =gUnknown_030054A8 - movs r0, #0xc8 - strh r0, [r1, #6] - ldr r2, _0804A9D4 @ =gStageFlags - ldrh r0, [r2] - movs r1, #0x20 - orrs r0, r1 - strh r0, [r2] - add sp, #0x50 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804A9BC: .4byte 0x000002BF -_0804A9C0: .4byte 0x000037BF -_0804A9C4: .4byte 0x0600C000 -_0804A9C8: .4byte 0x0600A000 -_0804A9CC: .4byte 0x000002C1 -_0804A9D0: .4byte gUnknown_030054A8 -_0804A9D4: .4byte gStageFlags - - thumb_func_start sub_804A9D8 -sub_804A9D8: @ 0x0804A9D8 - push {r4, r5, r6, lr} - sub sp, #4 - ldr r0, _0804AAE4 @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r5, r1, r0 - ldr r0, [r5, #0x14] - cmp r0, #0x3c - bls _0804AA68 - ldr r0, [r5, #4] - ldr r1, _0804AAE8 @ =0xFFFFFF00 - adds r0, r0, r1 - str r0, [r5, #4] - ldr r4, _0804AAEC @ =gStageTime - ldr r0, [r4] - movs r1, #0x1f - ands r0, r1 - cmp r0, #0 - bne _0804AA0A - movs r0, #0x82 - lsls r0, r0, #1 - bl m4aSongNumStart -_0804AA0A: - ldr r0, [r4] - movs r1, #7 - ands r0, r1 - cmp r0, #0 - bne _0804AA26 - movs r0, #0x80 - lsls r0, r0, #1 - movs r1, #0x83 - str r1, [sp] - movs r1, #0x10 - movs r2, #0x80 - movs r3, #0x14 - bl CreateScreenShake -_0804AA26: - ldr r0, [r5, #0x14] - movs r1, #0x1e - bl Mod - cmp r0, #0 - bne _0804AA68 - ldr r4, _0804AAF0 @ =gPlayer - str r0, [r4, #0x20] - ldr r0, [r5, #0x14] - subs r0, #0x3c - movs r1, #0x1e - bl __udivsi3 - subs r0, #2 - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #3 - ble _0804AA4E - movs r1, #3 -_0804AA4E: - lsls r1, r1, #0x18 - lsrs r0, r1, #0x18 - cmp r0, #3 - bhi _0804AA68 - asrs r1, r1, #0x18 - movs r0, #0x46 - subs r0, r0, r1 - adds r1, r4, #0 - adds r1, #0x64 - strh r0, [r1] - adds r1, #2 - ldr r0, _0804AAF4 @ =0x0000FFFF - strh r0, [r1] -_0804AA68: - movs r0, #1 - strb r0, [r5, #0xb] - adds r0, r5, #0 - bl sub_804C3AC - ldr r6, _0804AAF0 @ =gPlayer - ldr r0, [r6, #0x20] - movs r1, #0xc0 - lsls r1, r1, #0xf - orrs r0, r1 - str r0, [r6, #0x20] - ldr r0, [r5, #0x14] - subs r4, r0, #1 - str r4, [r5, #0x14] - cmp r4, #0 - bne _0804AADC - ldr r2, _0804AAF8 @ =gStageFlags - ldrh r1, [r2] - ldr r0, _0804AAFC @ =0x0000FFDF - ands r0, r1 - strh r0, [r2] - ldr r0, [r6, #0x20] - ldr r1, _0804AB00 @ =0xFF9FFFFF - ands r0, r1 - str r0, [r6, #0x20] - movs r0, #0x82 - lsls r0, r0, #1 - bl m4aSongNumStart - ldr r1, _0804AB04 @ =gUnknown_030054A8 - strb r4, [r1] - movs r0, #0x12 - strb r0, [r1, #1] - ldr r1, _0804AB08 @ =gCamera - ldr r0, _0804AB0C @ =0x0000A744 - str r0, [r1, #0x30] - strb r4, [r5, #0xb] - ldr r0, [r6, #0x20] - ldr r1, _0804AB10 @ =0xFFDFFFFF - ands r0, r1 - str r0, [r6, #0x20] - ldr r1, _0804AB14 @ =gUnknown_03005AF0 - ldr r0, [r1, #0x1c] - ldr r3, _0804AB18 @ =0xFFFFCFFF - ands r0, r3 - movs r2, #0x80 - lsls r2, r2, #5 - orrs r0, r2 - str r0, [r1, #0x1c] - ldr r1, _0804AB1C @ =gUnknown_03005AA0 - ldr r0, [r1, #0x1c] - ands r0, r3 - orrs r0, r2 - str r0, [r1, #0x1c] - ldr r0, _0804AAE4 @ =gCurTask - ldr r1, [r0] - ldr r0, _0804AB20 @ =sub_804AB24 - str r0, [r1, #8] -_0804AADC: - add sp, #4 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_0804AAE4: .4byte gCurTask -_0804AAE8: .4byte 0xFFFFFF00 -_0804AAEC: .4byte gStageTime -_0804AAF0: .4byte gPlayer -_0804AAF4: .4byte 0x0000FFFF -_0804AAF8: .4byte gStageFlags -_0804AAFC: .4byte 0x0000FFDF -_0804AB00: .4byte 0xFF9FFFFF -_0804AB04: .4byte gUnknown_030054A8 -_0804AB08: .4byte gCamera -_0804AB0C: .4byte 0x0000A744 -_0804AB10: .4byte 0xFFDFFFFF -_0804AB14: .4byte gUnknown_03005AF0 -_0804AB18: .4byte 0xFFFFCFFF -_0804AB1C: .4byte gUnknown_03005AA0 -_0804AB20: .4byte sub_804AB24 - - thumb_func_start sub_804AB24 -sub_804AB24: @ 0x0804AB24 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x14 - ldr r0, _0804AC44 @ =gCurTask - ldr r0, [r0] - ldrh r4, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r7, r4, r0 - adds r0, #0x48 - adds r6, r4, r0 - adds r0, r7, #0 - bl sub_804CC98 - adds r0, r7, #0 - bl sub_804CA08 - adds r0, r7, #0 - bl sub_804AE40 - ldr r5, _0804AC48 @ =gUnknown_080D8890 - ldr r1, _0804AC4C @ =IWRAM_START + 0x3C - adds r0, r4, r1 - ldrb r0, [r0] - lsls r0, r0, #2 - adds r0, r0, r5 - ldr r2, [r0] - adds r0, r7, #0 - movs r1, #0 - bl _call_via_r2 - ldr r2, _0804AC50 @ =IWRAM_START + 0x3D - adds r4, r4, r2 - ldrb r0, [r4] - lsls r0, r0, #2 - adds r0, r0, r5 - ldr r2, [r0] - adds r0, r7, #0 - movs r1, #1 - bl _call_via_r2 - adds r0, r7, #0 - bl sub_804C5B8 - adds r0, r7, #0 - bl sub_804C830 - adds r0, r7, #0 - bl sub_804CA70 - ldr r4, _0804AC54 @ =gPlayer - ldr r0, [r4, #0xc] - asrs r0, r0, #8 - cmp r0, #0xb8 - ble _0804ABC0 - ldr r0, [r4, #8] - asrs r0, r0, #8 - ldr r1, _0804AC58 @ =0x0000A819 - cmp r0, r1 - ble _0804ABC0 - adds r0, r4, #0 - bl sub_800CBA4 - movs r1, #0x10 - ldrsh r0, [r4, r1] - cmp r0, #0 - ble _0804ABB4 - rsbs r0, r0, #0 - strh r0, [r4, #0x10] -_0804ABB4: - movs r1, #0x14 - ldrsh r0, [r4, r1] - cmp r0, #0 - ble _0804ABC0 - rsbs r0, r0, #0 - strh r0, [r4, #0x14] -_0804ABC0: - ldr r4, _0804AC54 @ =gPlayer - ldr r0, [r4, #8] - asrs r0, r0, #8 - ldr r1, _0804AC5C @ =0x0000A84F - cmp r0, r1 - ble _0804ABEA - adds r0, r4, #0 - bl sub_800CBA4 - movs r1, #0x10 - ldrsh r0, [r4, r1] - cmp r0, #0 - ble _0804ABDE - rsbs r0, r0, #0 - strh r0, [r4, #0x10] -_0804ABDE: - movs r1, #0x14 - ldrsh r0, [r4, r1] - cmp r0, #0 - ble _0804ABEA - rsbs r0, r0, #0 - strh r0, [r4, #0x14] -_0804ABEA: - ldrb r4, [r7, #8] - cmp r4, #0 - beq _0804ABF2 - b _0804AD54 -_0804ABF2: - ldr r2, _0804AC60 @ =gFlags - ldr r0, [r2] - movs r1, #5 - rsbs r1, r1, #0 - ands r0, r1 - str r0, [r2] - ldr r0, _0804AC44 @ =gCurTask - ldr r1, [r0] - ldr r0, _0804AC64 @ =sub_804AD68 - str r0, [r1, #8] - movs r0, #0xff - str r0, [r7, #0x14] - bl Player_DisableInputAndBossTimer_FinalBoss - ldr r2, _0804AC54 @ =gPlayer - ldr r1, [r2, #0x20] - movs r0, #0x80 - lsls r0, r0, #0xe - orrs r1, r0 - str r1, [r2, #0x20] - adds r0, r2, #0 - adds r0, #0x5c - strh r4, [r0] - adds r0, #2 - strh r4, [r0] - movs r0, #0xa - ands r0, r1 - cmp r0, #0 - beq _0804AC68 - adds r1, r2, #0 - adds r1, #0x64 - movs r0, #0x32 - strh r0, [r1] - movs r0, #0xfe - lsls r0, r0, #8 - strh r0, [r2, #0x10] - strh r4, [r2, #0x12] - adds r1, #9 - movs r0, #5 - strb r0, [r1] - b _0804AC6E - .align 2, 0 -_0804AC44: .4byte gCurTask -_0804AC48: .4byte gUnknown_080D8890 -_0804AC4C: .4byte IWRAM_START + 0x3C -_0804AC50: .4byte IWRAM_START + 0x3D -_0804AC54: .4byte gPlayer -_0804AC58: .4byte 0x0000A819 -_0804AC5C: .4byte 0x0000A84F -_0804AC60: .4byte gFlags -_0804AC64: .4byte sub_804AD68 -_0804AC68: - strh r0, [r2, #0x14] - strh r0, [r2, #0x10] - strh r0, [r2, #0x12] -_0804AC6E: - movs r1, #0 - strh r1, [r6] - strh r1, [r6, #4] - movs r0, #1 - strh r0, [r6, #2] - movs r0, #0x10 - strh r0, [r6, #6] - ldr r0, _0804AD2C @ =0x00003FBF - strh r0, [r6, #8] - strh r1, [r6, #0xa] - movs r6, #0 - adds r0, r7, #0 - adds r0, #0x18 - str r0, [sp] - adds r1, r7, #0 - adds r1, #0x28 - str r1, [sp, #8] - adds r2, r7, #0 - adds r2, #0x1c - str r2, [sp, #4] - adds r0, #0x1c - str r0, [sp, #0xc] - adds r1, #0xe - str r1, [sp, #0x10] - movs r2, #0x3c - adds r2, r2, r7 - mov sl, r2 - movs r0, #0x30 - adds r0, r0, r7 - mov sb, r0 - ldr r1, _0804AD30 @ =gSineTable - mov r8, r1 - movs r2, #2 - mov ip, r2 -_0804ACB2: - lsls r2, r6, #3 - ldr r0, [sp] - adds r3, r0, r2 - lsls r5, r6, #1 - ldr r1, [sp, #8] - adds r4, r1, r5 - ldrh r0, [r4] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - add r0, r8 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r3] - adds r0, r0, r1 - str r0, [r3] - ldr r0, [sp, #4] - adds r2, r0, r2 - ldrh r0, [r4] - lsls r0, r0, #1 - add r0, r8 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - lsls r1, r6, #2 - ldr r2, [sp, #0xc] - adds r0, r2, r1 - ldr r2, _0804AD34 @ =0xFFFFFE80 - strh r2, [r0] - ldr r0, [sp, #0x10] - adds r1, r0, r1 - movs r0, #0xfd - lsls r0, r0, #8 - strh r0, [r1] - mov r2, sl - adds r1, r2, r6 - movs r0, #7 - strb r0, [r1] - add r5, sb - movs r0, #0x3c - strh r0, [r5] - lsls r0, r6, #4 - subs r0, r0, r6 - lsls r0, r0, #2 - adds r0, #0x90 - adds r1, r7, r0 - cmp r6, #0 - beq _0804AD38 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804AD3A - .align 2, 0 -_0804AD2C: .4byte 0x00003FBF -_0804AD30: .4byte gSineTable -_0804AD34: .4byte 0xFFFFFE80 -_0804AD38: - ldr r0, _0804AD64 @ =0x000002BF -_0804AD3A: - strh r0, [r1, #0xa] - adds r0, r1, #0 - adds r0, #0x20 - mov r2, ip - strb r2, [r0] - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] - adds r0, r6, #1 - lsls r0, r0, #0x18 - lsrs r6, r0, #0x18 - cmp r6, #1 - bls _0804ACB2 -_0804AD54: - add sp, #0x14 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804AD64: .4byte 0x000002BF - - thumb_func_start sub_804AD68 -sub_804AD68: @ 0x0804AD68 - push {r4, r5, r6, lr} - ldr r4, _0804ADC0 @ =gCurTask - ldr r0, [r4] - ldrh r6, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r5, r6, r0 - ldr r1, _0804ADC4 @ =IWRAM_START + 0x48 - adds r0, r6, r1 - bl UpdateScreenFade - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bne _0804ADE4 - ldr r0, _0804ADC8 @ =0x00005010 - ldr r1, _0804ADCC @ =0x00005011 - bl TasksDestroyInPriorityRange - ldr r0, _0804ADD0 @ =0x00005431 - ldr r1, _0804ADD4 @ =0x00005434 - bl TasksDestroyInPriorityRange - ldr r2, _0804ADD8 @ =gStageFlags - ldrh r0, [r2] - movs r3, #0x80 - lsls r3, r3, #3 - adds r1, r3, #0 - orrs r0, r1 - strh r0, [r2] - ldr r2, _0804ADDC @ =gPlayer - ldr r0, [r2, #0x20] - movs r1, #0x80 - lsls r1, r1, #0xd - orrs r0, r1 - movs r1, #0x80 - lsls r1, r1, #0xf - orrs r0, r1 - str r0, [r2, #0x20] - ldr r1, [r4] - ldr r0, _0804ADE0 @ =sub_804CC30 - str r0, [r1, #8] - b _0804AE2C - .align 2, 0 -_0804ADC0: .4byte gCurTask -_0804ADC4: .4byte IWRAM_START + 0x48 -_0804ADC8: .4byte 0x00005010 -_0804ADCC: .4byte 0x00005011 -_0804ADD0: .4byte 0x00005431 -_0804ADD4: .4byte 0x00005434 -_0804ADD8: .4byte gStageFlags -_0804ADDC: .4byte gPlayer -_0804ADE0: .4byte sub_804CC30 -_0804ADE4: - adds r0, r5, #0 - bl sub_804CC98 - adds r0, r5, #0 - bl sub_804CA08 - ldr r4, _0804AE34 @ =gUnknown_080D8890 - ldr r1, _0804AE38 @ =IWRAM_START + 0x3C - adds r0, r6, r1 - ldrb r0, [r0] - lsls r0, r0, #2 - adds r0, r0, r4 - ldr r2, [r0] - adds r0, r5, #0 - movs r1, #0 - bl _call_via_r2 - ldr r3, _0804AE3C @ =IWRAM_START + 0x3D - adds r0, r6, r3 - ldrb r0, [r0] - lsls r0, r0, #2 - adds r0, r0, r4 - ldr r2, [r0] - adds r0, r5, #0 - movs r1, #1 - bl _call_via_r2 - adds r0, r5, #0 - bl sub_804C5B8 - adds r0, r5, #0 - bl sub_804CA70 - adds r0, r5, #0 - bl sub_804C080 -_0804AE2C: - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_0804AE34: .4byte gUnknown_080D8890 -_0804AE38: .4byte IWRAM_START + 0x3C -_0804AE3C: .4byte IWRAM_START + 0x3D - - thumb_func_start sub_804AE40 -sub_804AE40: @ 0x0804AE40 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #8 - adds r5, r0, #0 - ldr r0, _0804AE94 @ =gPlayer - ldr r0, [r0, #0x20] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0804AE7A - ldrh r1, [r5, #0xe] - cmp r1, #0 - bne _0804AE76 - ldr r0, _0804AE98 @ =gBldRegs - strh r1, [r0, #4] - adds r0, r5, #0 - adds r0, #0x4c - strh r1, [r0] - ldr r2, _0804AE9C @ =gFlags - ldr r0, [r2] - movs r1, #5 - rsbs r1, r1, #0 - ands r0, r1 - str r0, [r2] -_0804AE76: - movs r0, #2 - strh r0, [r5, #0xe] -_0804AE7A: - ldrh r0, [r5, #0xe] - cmp r0, #0 - beq _0804AEA0 - subs r0, #1 - strh r0, [r5, #0xe] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0804AE8C - b _0804B0CE -_0804AE8C: - movs r0, #0x78 - strb r0, [r5, #0x12] - b _0804B0CE - .align 2, 0 -_0804AE94: .4byte gPlayer -_0804AE98: .4byte gBldRegs -_0804AE9C: .4byte gFlags -_0804AEA0: - ldrb r0, [r5, #0xb] - cmp r0, #0 - beq _0804AED4 - ldrb r0, [r5, #0x12] - cmp r0, #0 - beq _0804AEC2 - movs r0, #0x78 - strb r0, [r5, #0x12] - adds r1, r5, #0 - adds r1, #0x4c - movs r0, #0x80 - lsls r0, r0, #6 - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x48 - bl UpdateScreenFade -_0804AEC2: - ldr r0, _0804AED0 @ =gFlags - ldr r1, [r0] - movs r2, #5 - rsbs r2, r2, #0 - ands r1, r2 - str r1, [r0] - b _0804B0CE - .align 2, 0 -_0804AED0: .4byte gFlags -_0804AED4: - ldrb r0, [r5, #0x12] - subs r4, r0, #1 - strb r4, [r5, #0x12] - movs r0, #0xff - mov sb, r0 - lsls r0, r4, #0x18 - cmp r0, #0 - bne _0804AF34 - ldr r2, _0804AF2C @ =gFlags - ldr r0, [r2] - movs r1, #5 - rsbs r1, r1, #0 - ands r0, r1 - str r0, [r2] - adds r1, r5, #0 - adds r1, #0x4c - movs r0, #0x80 - lsls r0, r0, #6 - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x48 - bl UpdateScreenFade - ldrb r0, [r5, #8] - movs r2, #0xb4 - lsls r2, r2, #1 - adds r1, r2, #0 - cmp r0, #4 - bhi _0804AF10 - movs r1, #0x8c -_0804AF10: - strh r1, [r5, #0xe] - adds r1, r5, #0 - adds r1, #0x54 - ldr r0, _0804AF30 @ =0x000002C1 - strh r0, [r1, #0xa] - adds r1, #0x20 - movs r0, #0 - strb r0, [r1] - adds r1, #1 - ldrb r0, [r1] - mov r6, sb - orrs r0, r6 - strb r0, [r1] - b _0804B0CE - .align 2, 0 -_0804AF2C: .4byte gFlags -_0804AF30: .4byte 0x000002C1 -_0804AF34: - ldr r0, [r5] - movs r7, #0xbe - lsls r7, r7, #8 - adds r0, r0, r7 - asrs r0, r0, #8 - mov r8, r0 - ldr r0, _0804AFF4 @ =gSineTable - mov sl, r0 - ldrh r1, [r5, #0x10] - movs r2, #0x80 - lsls r2, r2, #1 - adds r0, r1, r2 - lsls r0, r0, #1 - add r0, sl - movs r6, #0 - ldrsh r0, [r0, r6] - movs r3, #0xb - muls r0, r3, r0 - asrs r0, r0, #0xe - add r8, r0 - ldr r2, _0804AFF8 @ =gCamera - ldr r0, [r2] - mov r7, r8 - subs r7, r7, r0 - mov r8, r7 - ldr r0, [r5, #4] - movs r6, #0xa0 - lsls r6, r6, #6 - adds r0, r0, r6 - asrs r6, r0, #8 - lsls r1, r1, #1 - add r1, sl - movs r7, #0 - ldrsh r0, [r1, r7] - muls r0, r3, r0 - asrs r0, r0, #0xe - adds r6, r6, r0 - ldr r0, [r2, #4] - subs r6, r6, r0 - lsls r0, r4, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x5a - bls _0804B008 - movs r0, #0 - bl InitHBlankBgOffsets - mov r0, r8 - lsls r3, r0, #0x10 - asrs r3, r3, #0x10 - lsls r0, r6, #0x10 - asrs r0, r0, #0x10 - str r0, [sp] - ldr r4, _0804AFFC @ =gPseudoRandom - ldr r1, [r4] - ldr r0, _0804B000 @ =0x00196225 - adds r2, r1, #0 - muls r2, r0, r2 - ldr r1, _0804B004 @ =0x3C6EF35F - adds r2, r2, r1 - str r2, [r4] - ldrb r0, [r5, #0x12] - subs r0, #0x5a - lsls r0, r0, #3 - movs r1, #0xff - ands r0, r1 - lsls r0, r0, #1 - add r0, sl - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x18 - movs r1, #7 - ands r2, r1 - adds r0, r0, r2 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #4] - movs r0, #0 - movs r1, #0 - movs r2, #0xa0 - bl sub_80075D0 - ldrb r1, [r5, #0x12] - subs r1, #0x5a - lsls r0, r1, #4 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r0, r0, r1 - adds r1, r5, #0 - adds r1, #0x4c - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x48 - bl UpdateScreenFade - b _0804B0CE - .align 2, 0 -_0804AFF4: .4byte gSineTable -_0804AFF8: .4byte gCamera -_0804AFFC: .4byte gPseudoRandom -_0804B000: .4byte 0x00196225 -_0804B004: .4byte 0x3C6EF35F -_0804B008: - cmp r0, #0x5a - bne _0804B02A - adds r1, r5, #0 - adds r1, #0x54 - ldr r0, _0804B060 @ =0x000002C1 - strh r0, [r1, #0xa] - adds r1, #0x20 - movs r0, #1 - strb r0, [r1] - adds r1, #1 - ldrb r0, [r1] - mov r2, sb - orrs r0, r2 - strb r0, [r1] - ldr r0, _0804B064 @ =0x00000105 - bl m4aSongNumStart -_0804B02A: - ldrb r0, [r5, #0x12] - lsls r3, r0, #0x18 - lsrs r7, r3, #0x18 - cmp r7, #0x45 - bhi _0804B074 - ldr r2, _0804B068 @ =gPseudoRandom - ldr r1, [r2] - ldr r0, _0804B06C @ =0x00196225 - muls r0, r1, r0 - ldr r1, _0804B070 @ =0x3C6EF35F - adds r0, r0, r1 - str r0, [r2] - lsrs r2, r3, #0x19 - movs r1, #7 - ands r0, r1 - adds r0, #8 - adds r4, r2, r0 - cmp r7, #0x3c - bls _0804B096 - adds r1, r4, #0 - subs r1, #0xa - lsls r1, r1, #8 - adds r0, r5, #0 - bl sub_804CCD0 - b _0804B096 - .align 2, 0 -_0804B060: .4byte 0x000002C1 -_0804B064: .4byte 0x00000105 -_0804B068: .4byte gPseudoRandom -_0804B06C: .4byte 0x00196225 -_0804B070: .4byte 0x3C6EF35F -_0804B074: - ldr r2, _0804B0E0 @ =gPseudoRandom - ldr r1, [r2] - ldr r0, _0804B0E4 @ =0x00196225 - muls r1, r0, r1 - ldr r7, _0804B0E8 @ =0x3C6EF35F - adds r1, r1, r7 - str r1, [r2] - ldrb r2, [r5, #0x12] - movs r0, #0x74 - subs r0, r0, r2 - asrs r0, r0, #2 - movs r2, #7 - ands r1, r2 - adds r1, #0x1e - adds r0, r0, r1 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 -_0804B096: - ldrh r0, [r5, #0x10] - mov r1, r8 - lsls r3, r1, #0x10 - asrs r3, r3, #0x10 - adds r1, r6, #1 - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - str r1, [sp] - movs r1, #0x20 - str r1, [sp, #4] - adds r1, r4, #0 - movs r2, #6 - bl sub_802E784 - ldrb r1, [r5, #0x12] - movs r0, #0x5b - muls r1, r0, r1 - movs r2, #0x80 - lsls r2, r2, #6 - adds r0, r2, #0 - subs r0, r0, r1 - adds r1, r5, #0 - adds r1, #0x4c - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x48 - bl UpdateScreenFade -_0804B0CE: - add sp, #8 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804B0E0: .4byte gPseudoRandom -_0804B0E4: .4byte 0x00196225 -_0804B0E8: .4byte 0x3C6EF35F - - thumb_func_start sub_804B0EC -sub_804B0EC: @ 0x0804B0EC - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x10 - mov r8, r0 - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - mov sb, r1 - movs r0, #0 - str r0, [sp] - mov r0, r8 - adds r0, #0x3e - add r0, sb - ldrb r0, [r0] - cmp r0, #0 - beq _0804B114 -_0804B110: - movs r0, #0 - b _0804B2CE -_0804B114: - mov r1, sb - lsls r4, r1, #3 - mov r0, r8 - adds r0, #0x18 - adds r0, r0, r4 - mov r2, r8 - ldr r1, [r2] - ldr r0, [r0] - adds r1, r1, r0 - str r1, [sp, #4] - ldr r2, _0804B1CC @ =gUnknown_080D8888 - mov r0, sb - lsls r3, r0, #2 - adds r0, r3, r2 - ldrh r0, [r0] - mov sl, r0 - adds r5, r1, #0 - add r5, sl - mov r0, r8 - adds r0, #0x1c - adds r0, r0, r4 - mov r4, r8 - ldr r1, [r4, #4] - ldr r0, [r0] - adds r1, r1, r0 - mov ip, r1 - adds r2, #2 - adds r3, r3, r2 - ldrh r7, [r3] - adds r4, r1, r7 - ldr r3, _0804B1D0 @ =gSineTable - mov r0, sb - lsls r1, r0, #1 - mov r0, r8 - adds r0, #0x28 - adds r0, r0, r1 - ldrh r1, [r0] - movs r2, #0x80 - lsls r2, r2, #1 - adds r0, r1, r2 - lsls r0, r0, #1 - adds r0, r0, r3 - movs r2, #0 - ldrsh r6, [r0, r2] - movs r2, #0xbe - adds r0, r6, #0 - muls r0, r2, r0 - asrs r0, r0, #9 - adds r5, r5, r0 - lsls r1, r1, #1 - adds r1, r1, r3 - movs r0, #0 - ldrsh r3, [r1, r0] - adds r0, r3, #0 - muls r0, r2, r0 - asrs r0, r0, #9 - adds r4, r4, r0 - ldr r2, _0804B1D4 @ =gPlayer - ldr r0, [r2, #8] - subs r0, r0, r5 - asrs r5, r0, #8 - ldr r0, [r2, #0xc] - subs r0, r0, r4 - asrs r4, r0, #8 - adds r1, r5, #0 - muls r1, r5, r1 - adds r5, r1, #0 - adds r0, r4, #0 - muls r0, r4, r0 - adds r4, r0, #0 - adds r0, r5, r4 - cmp r0, #0xc7 - bgt _0804B1DC - adds r0, r2, #0 - bl sub_800CBA4 - mov r0, r8 - adds r0, #0x40 - add r0, sb - movs r1, #1 - strb r1, [r0] - mov r0, r8 - adds r0, #0x3c - add r0, sb - ldrb r0, [r0] - cmp r0, #3 - bne _0804B110 - ldr r0, _0804B1D8 @ =0x00000107 - bl m4aSongNumStart - b _0804B110 - .align 2, 0 -_0804B1CC: .4byte gUnknown_080D8888 -_0804B1D0: .4byte gSineTable -_0804B1D4: .4byte gPlayer -_0804B1D8: .4byte 0x00000107 -_0804B1DC: - adds r0, r2, #0 - adds r0, #0x90 - ldr r0, [r0] - adds r0, #0xc - str r0, [sp, #8] - ldr r5, [sp, #4] - add r5, sl - mov r1, ip - adds r4, r1, r7 - lsls r1, r6, #1 - adds r1, r1, r6 - lsls r1, r1, #5 - subs r1, r1, r6 - asrs r1, r1, #9 - lsls r0, r3, #1 - adds r0, r0, r3 - lsls r0, r0, #5 - subs r0, r0, r3 - asrs r0, r0, #9 - adds r6, r5, r1 - adds r7, r4, r0 - ldr r0, _0804B280 @ =gSelectedCharacter - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _0804B21E - adds r0, r6, #0 - adds r1, r7, #0 - str r2, [sp, #0xc] - bl Player_UpdateHomingPosition - ldr r2, [sp, #0xc] -_0804B21E: - ldr r0, [r2, #0x20] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0804B288 - ldr r4, [sp, #8] - ldr r1, [r4, #0x30] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - beq _0804B288 - ldr r0, [r2, #8] - subs r0, r0, r6 - asrs r5, r0, #8 - ldr r0, [r2, #0xc] - subs r0, r0, r7 - asrs r4, r0, #8 - adds r0, r5, #0 - muls r0, r5, r0 - adds r5, r0, #0 - adds r1, r4, #0 - muls r1, r4, r1 - adds r4, r1, #0 - adds r1, r5, r4 - ldr r0, _0804B284 @ =0x00000177 - cmp r1, r0 - bgt _0804B288 - mov r0, r8 - mov r1, sb - str r2, [sp, #0xc] - bl sub_804C9B4 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp] - ldr r2, [sp, #0xc] - movs r4, #0x10 - ldrsh r0, [r2, r4] - rsbs r0, r0, #0 - strh r0, [r2, #0x10] - movs r1, #0x12 - ldrsh r0, [r2, r1] - rsbs r0, r0, #0 - strh r0, [r2, #0x12] - movs r4, #0x14 - ldrsh r0, [r2, r4] - rsbs r0, r0, #0 - strh r0, [r2, #0x14] - b _0804B2CC - .align 2, 0 -_0804B280: .4byte gSelectedCharacter -_0804B284: .4byte 0x00000177 -_0804B288: - ldr r0, _0804B2E0 @ =gCheese - ldr r2, [r0] - cmp r2, #0 - beq _0804B2CC - ldr r1, [r2, #0x4c] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - beq _0804B2CC - ldr r0, [r2] - subs r6, r6, r0 - asrs r6, r6, #8 - ldr r0, [r2, #4] - subs r7, r7, r0 - asrs r7, r7, #8 - adds r0, r6, #0 - muls r0, r6, r0 - adds r1, r7, #0 - muls r1, r7, r1 - adds r0, r0, r1 - ldr r1, _0804B2E4 @ =0x00000177 - cmp r0, r1 - bgt _0804B2CC - mov r0, r8 - mov r1, sb - bl sub_804C9B4 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp] - ldr r0, _0804B2E8 @ =gUnknown_03005498 - ldr r1, [r0, #4] - movs r0, #0 - strb r0, [r1, #0x15] -_0804B2CC: - ldr r0, [sp] -_0804B2CE: - add sp, #0x10 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - .align 2, 0 -_0804B2E0: .4byte gCheese -_0804B2E4: .4byte 0x00000177 -_0804B2E8: .4byte gUnknown_03005498 - - thumb_func_start sub_804B2EC -sub_804B2EC: @ 0x0804B2EC - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #4 - adds r7, r0, #0 - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - mov sb, r1 - movs r0, #0 - str r0, [sp] - adds r0, r7, #0 - adds r0, #0x3e - add r0, sb - ldrb r0, [r0] - cmp r0, #0 - beq _0804B314 - movs r0, #0 - b _0804B41E -_0804B314: - ldr r1, _0804B3C8 @ =gPlayer - mov r8, r1 - mov r0, r8 - adds r0, #0x90 - ldr r0, [r0] - adds r0, #0xc - mov sl, r0 - mov r2, sb - lsls r4, r2, #3 - adds r0, r7, #0 - adds r0, #0x18 - adds r0, r0, r4 - ldr r3, [r7] - ldr r0, [r0] - ldr r1, _0804B3CC @ =gUnknown_080D8888 - lsls r2, r2, #2 - adds r5, r2, r1 - adds r6, r3, r0 - adds r0, r7, #0 - adds r0, #0x1c - adds r0, r0, r4 - ldr r3, [r7, #4] - ldr r0, [r0] - adds r1, #2 - adds r2, r2, r1 - adds r0, r3, r0 - ldrh r5, [r5] - adds r4, r6, r5 - ldrh r2, [r2] - adds r5, r0, r2 - ldr r0, _0804B3D0 @ =gSelectedCharacter - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _0804B364 - adds r0, r4, #0 - adds r1, r5, #0 - bl Player_UpdateHomingPosition -_0804B364: - mov r1, r8 - ldr r0, [r1, #0x20] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0804B3D8 - mov r2, sl - ldr r1, [r2, #0x30] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - beq _0804B3D8 - mov r1, r8 - ldr r0, [r1, #8] - subs r0, r0, r4 - asrs r6, r0, #8 - ldr r0, [r1, #0xc] - subs r0, r0, r5 - asrs r0, r0, #8 - adds r2, r6, #0 - muls r2, r6, r2 - adds r6, r2, #0 - adds r1, r0, #0 - muls r1, r0, r1 - adds r0, r1, #0 - adds r1, r6, r0 - ldr r0, _0804B3D4 @ =0x00000177 - cmp r1, r0 - bgt _0804B3D8 - adds r0, r7, #0 - mov r1, sb - bl sub_804C9B4 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp] - mov r2, r8 - movs r5, #0x10 - ldrsh r0, [r2, r5] - rsbs r0, r0, #0 - strh r0, [r2, #0x10] - movs r1, #0x12 - ldrsh r0, [r2, r1] - rsbs r0, r0, #0 - strh r0, [r2, #0x12] - movs r5, #0x14 - ldrsh r0, [r2, r5] - rsbs r0, r0, #0 - strh r0, [r2, #0x14] - b _0804B41C - .align 2, 0 -_0804B3C8: .4byte gPlayer -_0804B3CC: .4byte gUnknown_080D8888 -_0804B3D0: .4byte gSelectedCharacter -_0804B3D4: .4byte 0x00000177 -_0804B3D8: - ldr r0, _0804B430 @ =gCheese - ldr r2, [r0] - cmp r2, #0 - beq _0804B41C - ldr r1, [r2, #0x4c] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - beq _0804B41C - ldr r0, [r2] - subs r4, r4, r0 - asrs r4, r4, #8 - ldr r0, [r2, #4] - subs r5, r5, r0 - asrs r5, r5, #8 - adds r0, r4, #0 - muls r0, r4, r0 - adds r1, r5, #0 - muls r1, r5, r1 - adds r0, r0, r1 - ldr r1, _0804B434 @ =0x00000177 - cmp r0, r1 - bgt _0804B41C - adds r0, r7, #0 - mov r1, sb - bl sub_804C9B4 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp] - ldr r0, _0804B438 @ =gUnknown_03005498 - ldr r1, [r0, #4] - movs r0, #0 - strb r0, [r1, #0x15] -_0804B41C: - ldr r0, [sp] -_0804B41E: - add sp, #4 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - .align 2, 0 -_0804B430: .4byte gCheese -_0804B434: .4byte 0x00000177 -_0804B438: .4byte gUnknown_03005498 - - thumb_func_start sub_804B43C -sub_804B43C: @ 0x0804B43C - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r7, r0, #0 - lsls r1, r1, #0x18 - lsrs r6, r1, #0x18 - lsls r2, r6, #3 - adds r0, #0x18 - adds r0, r0, r2 - movs r1, #0 - str r1, [r0] - adds r0, r7, #0 - adds r0, #0x1c - adds r0, r0, r2 - str r1, [r0] - lsls r1, r6, #1 - adds r0, r7, #0 - adds r0, #0x30 - adds r0, r0, r1 - ldrh r1, [r0] - movs r0, #0x96 - lsls r0, r0, #1 - cmp r1, r0 - bne _0804B498 - lsls r0, r6, #4 - subs r0, r0, r6 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r7, r0 - cmp r6, #0 - beq _0804B484 - movs r0, #0 - movs r1, #0xb0 - lsls r1, r1, #2 - b _0804B488 -_0804B484: - movs r0, #0 - ldr r1, _0804B564 @ =0x000002BF -_0804B488: - strh r1, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804B498: - lsls r5, r6, #1 - adds r0, r7, #0 - adds r0, #0x30 - adds r0, r0, r5 - mov r8, r0 - ldrh r0, [r0] - subs r0, #1 - movs r1, #0 - mov sb, r1 - mov r1, r8 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0804B4CE - adds r0, r7, #0 - adds r0, #0x3c - adds r0, r0, r6 - movs r1, #1 - strb r1, [r0] - movs r0, #0xb4 - mov r1, r8 - strh r0, [r1] - adds r0, r7, #0 - adds r0, #0x40 - adds r0, r0, r6 - mov r1, sb - strb r1, [r0] -_0804B4CE: - adds r0, r7, #0 - adds r1, r6, #0 - bl sub_804B0EC - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0804B584 - lsls r4, r6, #3 - adds r2, r7, #0 - adds r2, #0x18 - adds r2, r2, r4 - ldr r0, _0804B568 @ =gSineTable - mov ip, r0 - adds r3, r7, #0 - adds r3, #0x28 - adds r3, r3, r5 - ldrh r0, [r3] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - add r0, ip - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - adds r2, r7, #0 - adds r2, #0x1c - adds r2, r2, r4 - ldrh r0, [r3] - lsls r0, r0, #1 - add r0, ip - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - lsls r2, r6, #2 - adds r0, r7, #0 - adds r0, #0x34 - adds r0, r0, r2 - ldr r1, _0804B56C @ =0x0000FE80 - strh r1, [r0] - adds r0, r7, #0 - adds r0, #0x36 - adds r0, r0, r2 - movs r1, #0xfd - lsls r1, r1, #8 - strh r1, [r0] - adds r0, r7, #0 - adds r0, #0x3c - adds r0, r0, r6 - movs r1, #7 - strb r1, [r0] - movs r0, #0x3c - mov r1, r8 - strh r0, [r1] - lsls r0, r6, #4 - subs r0, r0, r6 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r7, r0 - cmp r6, #0 - beq _0804B570 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804B572 - .align 2, 0 -_0804B564: .4byte 0x000002BF -_0804B568: .4byte gSineTable -_0804B56C: .4byte 0x0000FE80 -_0804B570: - ldr r0, _0804B590 @ =0x000002BF -_0804B572: - strh r0, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - movs r0, #2 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804B584: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804B590: .4byte 0x000002BF - - thumb_func_start sub_804B594 -sub_804B594: @ 0x0804B594 - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r7, r0, #0 - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - mov r8, r1 - lsls r3, r1, #3 - adds r1, r7, #0 - adds r1, #0x18 - adds r1, r1, r3 - movs r2, #0 - str r2, [r1] - adds r0, #0x1c - adds r0, r0, r3 - str r2, [r0] - ldr r2, [r7] - ldr r4, [r1] - ldr r0, _0804B608 @ =gUnknown_080D8888 - mov r3, r8 - lsls r1, r3, #2 - adds r3, r1, r0 - adds r2, r2, r4 - ldrh r3, [r3] - adds r5, r2, r3 - ldr r2, [r7, #4] - adds r0, #2 - adds r1, r1, r0 - ldrh r0, [r1] - adds r6, r2, r0 - ldr r1, _0804B60C @ =gPlayer - ldr r0, [r1, #0xc] - subs r0, r0, r6 - lsls r0, r0, #8 - asrs r0, r0, #0x10 - ldr r1, [r1, #8] - subs r1, r1, r5 - lsls r1, r1, #8 - asrs r1, r1, #0x10 - bl sub_8004418 - lsls r0, r0, #0x10 - lsrs r3, r0, #0x10 - mov r0, r8 - lsls r1, r0, #1 - adds r0, r7, #0 - adds r0, #0x28 - adds r2, r0, r1 - ldrh r0, [r2] - adds r1, r0, #0 - cmp r3, r1 - beq _0804B614 - cmp r3, r1 - bhs _0804B610 - subs r0, #1 - b _0804B612 - .align 2, 0 -_0804B608: .4byte gUnknown_080D8888 -_0804B60C: .4byte gPlayer -_0804B610: - adds r0, #1 -_0804B612: - strh r0, [r2] -_0804B614: - mov r1, r8 - lsls r2, r1, #1 - adds r3, r7, #0 - adds r3, #0x30 - adds r1, r3, r2 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - adds r6, r2, #0 - mov sb, r3 - cmp r0, #0 - bne _0804B66A - mov r3, r8 - lsls r0, r3, #4 - subs r0, r0, r3 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r7, r0 - cmp r3, #0 - beq _0804B644 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804B646 -_0804B644: - ldr r0, _0804B704 @ =0x000002BF -_0804B646: - strh r0, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - movs r0, #1 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] - adds r0, r7, #0 - adds r0, #0x3c - add r0, r8 - movs r1, #2 - strb r1, [r0] - mov r0, sb - adds r1, r0, r6 - movs r0, #0x1e - strh r0, [r1] -_0804B66A: - adds r0, r7, #0 - mov r1, r8 - bl sub_804B0EC - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0804B724 - mov r1, r8 - lsls r4, r1, #3 - adds r2, r7, #0 - adds r2, #0x18 - adds r2, r2, r4 - ldr r5, _0804B708 @ =gSineTable - adds r3, r7, #0 - adds r3, #0x28 - adds r3, r3, r6 - ldrh r0, [r3] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - adds r0, r0, r5 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - adds r2, r7, #0 - adds r2, #0x1c - adds r2, r2, r4 - ldrh r0, [r3] - lsls r0, r0, #1 - adds r0, r0, r5 - movs r3, #0 - ldrsh r0, [r0, r3] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - mov r0, r8 - lsls r2, r0, #2 - adds r0, r7, #0 - adds r0, #0x34 - adds r0, r0, r2 - ldr r1, _0804B70C @ =0x0000FE80 - strh r1, [r0] - adds r0, r7, #0 - adds r0, #0x36 - adds r0, r0, r2 - movs r1, #0xfd - lsls r1, r1, #8 - strh r1, [r0] - adds r0, r7, #0 - adds r0, #0x3c - add r0, r8 - movs r1, #7 - strb r1, [r0] - mov r3, sb - adds r1, r3, r6 - movs r0, #0x3c - strh r0, [r1] - mov r1, r8 - lsls r0, r1, #4 - subs r0, r0, r1 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r7, r0 - cmp r1, #0 - beq _0804B710 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804B712 - .align 2, 0 -_0804B704: .4byte 0x000002BF -_0804B708: .4byte gSineTable -_0804B70C: .4byte 0x0000FE80 -_0804B710: - ldr r0, _0804B730 @ =0x000002BF -_0804B712: - strh r0, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - movs r0, #2 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804B724: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804B730: .4byte 0x000002BF - - thumb_func_start sub_804B734 -sub_804B734: @ 0x0804B734 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x4c - adds r7, r0, #0 - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - str r1, [sp, #0x20] - lsls r2, r1, #3 - adds r0, #0x18 - adds r3, r0, r2 - movs r1, #0 - str r1, [r3] - adds r0, #4 - adds r5, r0, r2 - str r1, [r5] - ldr r0, [sp, #0x20] - lsls r6, r0, #1 - movs r1, #0x30 - adds r1, r1, r7 - mov r8, r1 - adds r1, r1, r6 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0804B772 - b _0804B8AC -_0804B772: - ldr r4, [r7] - ldr r3, [r3] - ldr r0, _0804B840 @ =gUnknown_080D8888 - ldr r2, [sp, #0x20] - lsls r1, r2, #2 - adds r2, r1, r0 - adds r4, r4, r3 - ldrh r2, [r2] - adds r4, r4, r2 - ldr r2, [r7, #4] - ldr r3, [r5] - adds r0, #2 - adds r1, r1, r0 - adds r2, r2, r3 - ldrh r1, [r1] - adds r2, r2, r1 - movs r1, #0 - str r6, [sp, #0x2c] - mov r3, r8 - str r3, [sp, #0x38] - adds r0, r7, #0 - adds r0, #0x28 - adds r6, r7, #0 - adds r6, #0xc - str r6, [sp, #0x28] - adds r3, r7, #0 - adds r3, #0x3c - str r3, [sp, #0x3c] - asrs r4, r4, #8 - str r4, [sp, #0x30] - asrs r2, r2, #8 - str r2, [sp, #0x34] - ldr r6, [sp, #0x2c] - adds r2, r0, r6 - ldr r0, _0804B844 @ =0x000003FF - mov sl, r0 - mov r5, sp - mov sb, r1 -_0804B7BE: - movs r3, #0 - mov r8, r3 - subs r4, r1, #1 - adds r6, r1, #1 - str r6, [sp, #0x24] - adds r3, r4, #0 - movs r0, #1 - subs r1, r0, r1 - str r1, [sp, #0x48] -_0804B7D0: - ldrh r0, [r2] - ldr r1, _0804B848 @ =0xFFFFFF00 - adds r0, r0, r1 - mov r6, sl - ands r0, r6 - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r6, _0804B84C @ =gSineTable - adds r0, r0, r6 - movs r1, #0 - ldrsh r0, [r0, r1] - muls r0, r3, r0 - asrs r0, r0, #0xb - ldr r6, [sp, #0x30] - subs r0, r6, r0 - str r0, [sp, #0x14] - ldrh r0, [r2] - ldr r1, _0804B848 @ =0xFFFFFF00 - adds r0, r0, r1 - mov r6, sl - ands r0, r6 - lsls r0, r0, #1 - ldr r1, _0804B84C @ =gSineTable - adds r0, r0, r1 - movs r6, #0 - ldrsh r0, [r0, r6] - muls r0, r3, r0 - asrs r0, r0, #0xb - ldr r1, [sp, #0x34] - subs r0, r1, r0 - str r0, [sp, #0x18] - mov r6, sb - strh r6, [r5, #0x1c] - movs r1, #0x80 - lsls r1, r1, #2 - adds r0, r1, #0 - ldrh r6, [r2] - adds r0, r0, r6 - mov r1, sl - ands r0, r1 - strh r0, [r5, #0xc] - mov r6, r8 - lsls r0, r6, #7 - movs r6, #0x80 - lsls r6, r6, #2 - adds r1, r0, r6 - ldr r0, [sp, #0x48] - cmp r0, #0 - blt _0804B850 - lsls r0, r0, #1 - ldr r6, [sp, #0x48] - adds r0, r0, r6 - b _0804B854 - .align 2, 0 -_0804B840: .4byte gUnknown_080D8888 -_0804B844: .4byte 0x000003FF -_0804B848: .4byte 0xFFFFFF00 -_0804B84C: .4byte gSineTable -_0804B850: - lsls r0, r4, #1 - adds r0, r0, r4 -_0804B854: - lsls r0, r0, #5 - subs r0, r1, r0 - strh r0, [r5, #0xe] - ldr r0, [r7, #0x44] - str r0, [sp] - ldr r0, _0804B950 @ =0x000002C3 - strh r0, [r5, #8] - mov r0, sb - strh r0, [r5, #0xa] - mov r1, sb - str r1, [sp, #4] - mov r0, sp - ldr r1, [sp, #0x28] - str r2, [sp, #0x40] - str r3, [sp, #0x44] - bl CreateBossParticleStatic - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - mov r8, r0 - ldr r2, [sp, #0x40] - ldr r3, [sp, #0x44] - cmp r0, #2 - bls _0804B7D0 - ldr r3, [sp, #0x24] - lsls r0, r3, #0x18 - lsrs r1, r0, #0x18 - cmp r1, #2 - bls _0804B7BE - ldr r6, [sp, #0x3c] - ldr r0, [sp, #0x20] - adds r1, r6, r0 - movs r0, #3 - strb r0, [r1] - ldr r2, [sp, #0x38] - ldr r3, [sp, #0x2c] - adds r1, r2, r3 - movs r0, #0xa - strh r0, [r1] - adds r0, #0xfc - bl m4aSongNumStart -_0804B8AC: - adds r0, r7, #0 - ldr r1, [sp, #0x20] - bl sub_804B0EC - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0804B970 - ldr r6, [sp, #0x20] - lsls r4, r6, #3 - adds r2, r7, #0 - adds r2, #0x18 - adds r2, r2, r4 - ldr r5, _0804B954 @ =gSineTable - lsls r6, r6, #1 - adds r3, r7, #0 - adds r3, #0x28 - adds r3, r3, r6 - ldrh r0, [r3] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - adds r0, r0, r5 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - adds r2, r7, #0 - adds r2, #0x1c - adds r2, r2, r4 - ldrh r0, [r3] - lsls r0, r0, #1 - adds r0, r0, r5 - movs r3, #0 - ldrsh r0, [r0, r3] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - ldr r0, [sp, #0x20] - lsls r2, r0, #2 - adds r0, r7, #0 - adds r0, #0x34 - adds r0, r0, r2 - ldr r1, _0804B958 @ =0x0000FE80 - strh r1, [r0] - adds r0, r7, #0 - adds r0, #0x36 - adds r0, r0, r2 - movs r1, #0xfd - lsls r1, r1, #8 - strh r1, [r0] - adds r0, r7, #0 - adds r0, #0x3c - ldr r1, [sp, #0x20] - adds r0, r0, r1 - movs r1, #7 - strb r1, [r0] - adds r0, r7, #0 - adds r0, #0x30 - adds r0, r0, r6 - movs r1, #0x3c - strh r1, [r0] - ldr r2, [sp, #0x20] - lsls r0, r2, #4 - subs r0, r0, r2 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r7, r0 - ldr r3, [sp, #0x20] - cmp r3, #0 - beq _0804B95C - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804B95E - .align 2, 0 -_0804B950: .4byte 0x000002C3 -_0804B954: .4byte gSineTable -_0804B958: .4byte 0x0000FE80 -_0804B95C: - ldr r0, _0804B980 @ =0x000002BF -_0804B95E: - strh r0, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - movs r0, #2 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804B970: - add sp, #0x4c - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804B980: .4byte 0x000002BF - - thumb_func_start sub_804B984 -sub_804B984: @ 0x0804B984 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r4, r0, #0 - lsls r1, r1, #0x18 - lsrs r5, r1, #0x18 - mov sl, r5 - lsls r2, r5, #3 - adds r0, #0x18 - adds r0, r0, r2 - mov sb, r0 - lsls r3, r5, #1 - adds r0, r4, #0 - adds r0, #0x28 - adds r0, r0, r3 - mov r8, r0 - ldrh r0, [r0] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r6, _0804BA90 @ =gSineTable - adds r0, r0, r6 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #2 - adds r1, r1, r0 - asrs r1, r1, #5 - mov r6, sb - ldr r0, [r6] - adds r0, r0, r1 - str r0, [r6] - adds r0, r4, #0 - adds r0, #0x1c - adds r6, r0, r2 - mov r1, r8 - ldrh r0, [r1] - lsls r0, r0, #1 - ldr r2, _0804BA90 @ =gSineTable - adds r0, r0, r2 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #2 - adds r1, r1, r0 - asrs r1, r1, #5 - ldr r0, [r6] - adds r0, r0, r1 - str r0, [r6] - adds r0, r4, #0 - adds r0, #0x30 - adds r7, r0, r3 - ldrh r0, [r7] - subs r0, #1 - strh r0, [r7] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0804BA08 - adds r0, r4, #0 - adds r0, #0x3c - adds r0, r0, r5 - movs r1, #6 - strb r1, [r0] - movs r0, #0x1e - strh r0, [r7] -_0804BA08: - adds r0, r4, #0 - mov r1, sl - bl sub_804B0EC - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0804BAAC - mov r2, r8 - ldrh r0, [r2] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r2, _0804BA90 @ =gSineTable - adds r0, r0, r2 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - mov r2, sb - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - mov r1, r8 - ldrh r0, [r1] - lsls r0, r0, #1 - ldr r2, _0804BA90 @ =gSineTable - adds r0, r0, r2 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r6] - adds r0, r0, r1 - str r0, [r6] - mov r6, sl - lsls r2, r6, #2 - adds r0, r4, #0 - adds r0, #0x34 - adds r0, r0, r2 - ldr r1, _0804BA94 @ =0x0000FE80 - strh r1, [r0] - adds r0, r4, #0 - adds r0, #0x36 - adds r0, r0, r2 - movs r1, #0xfd - lsls r1, r1, #8 - strh r1, [r0] - adds r0, r4, #0 - adds r0, #0x3c - add r0, sl - movs r1, #7 - strb r1, [r0] - movs r0, #0x3c - strh r0, [r7] - lsls r0, r6, #4 - subs r0, r0, r6 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r4, r0 - cmp r6, #0 - beq _0804BA98 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804BA9A - .align 2, 0 -_0804BA90: .4byte gSineTable -_0804BA94: .4byte 0x0000FE80 -_0804BA98: - ldr r0, _0804BABC @ =0x000002BF -_0804BA9A: - strh r0, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - movs r0, #2 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804BAAC: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804BABC: .4byte 0x000002BF - - thumb_func_start sub_804BAC0 -sub_804BAC0: @ 0x0804BAC0 - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r6, r0, #0 - lsls r1, r1, #0x18 - lsrs r5, r1, #0x18 - adds r7, r5, #0 - lsls r0, r5, #1 - mov r8, r0 - adds r0, r6, #0 - adds r0, #0x30 - add r0, r8 - mov sb, r0 - ldrh r0, [r0] - subs r0, #1 - mov r1, sb - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0804BB84 - lsls r3, r5, #3 - adds r2, r6, #0 - adds r2, #0x18 - adds r2, r2, r3 - ldr r0, _0804BB5C @ =gSineTable - mov ip, r0 - adds r0, r6, #0 - adds r0, #0x28 - mov r1, r8 - adds r4, r0, r1 - ldrh r0, [r4] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - add r0, ip - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - adds r2, r6, #0 - adds r2, #0x1c - adds r2, r2, r3 - ldrh r0, [r4] - lsls r0, r0, #1 - add r0, ip - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - adds r0, r6, #0 - adds r0, #0x40 - adds r0, r0, r5 - ldrb r0, [r0] - cmp r0, #0 - beq _0804BB60 - adds r0, r6, #0 - adds r0, #0x2c - add r0, r8 - ldrh r1, [r4] - strh r1, [r0] - adds r0, r6, #0 - adds r0, #0x3c - adds r0, r0, r5 - movs r1, #4 - strb r1, [r0] - movs r0, #0x32 - b _0804BB6C - .align 2, 0 -_0804BB5C: .4byte gSineTable -_0804BB60: - adds r0, r6, #0 - adds r0, #0x3c - adds r0, r0, r5 - movs r1, #5 - strb r1, [r0] - movs r0, #0xa0 -_0804BB6C: - mov r1, sb - strh r0, [r1] - lsls r0, r7, #4 - subs r0, r0, r7 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r6, r0 - cmp r7, #0 - beq _0804BC20 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804BC22 -_0804BB84: - adds r0, r6, #0 - adds r1, r7, #0 - bl sub_804B0EC - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0804BC34 - lsls r0, r7, #3 - mov ip, r0 - adds r2, r6, #0 - adds r2, #0x18 - add r2, ip - ldr r5, _0804BC18 @ =gSineTable - adds r3, r6, #0 - adds r3, #0x28 - add r3, r8 - ldrh r0, [r3] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - adds r0, r0, r5 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - adds r2, r6, #0 - adds r2, #0x1c - add r2, ip - ldrh r0, [r3] - lsls r0, r0, #1 - adds r0, r0, r5 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #4 - subs r1, r1, r0 - asrs r1, r1, #6 - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - lsls r2, r7, #2 - adds r0, r6, #0 - adds r0, #0x34 - adds r0, r0, r2 - ldr r1, _0804BC1C @ =0x0000FE80 - strh r1, [r0] - adds r0, r6, #0 - adds r0, #0x36 - adds r0, r0, r2 - movs r1, #0xfd - lsls r1, r1, #8 - strh r1, [r0] - adds r0, r6, #0 - adds r0, #0x3c - adds r0, r0, r7 - movs r1, #7 - strb r1, [r0] - movs r0, #0x3c - mov r1, sb - strh r0, [r1] - lsls r0, r7, #4 - subs r0, r0, r7 - lsls r0, r0, #2 - adds r0, #0x90 - adds r2, r6, r0 - cmp r7, #0 - beq _0804BC20 - movs r0, #0xb0 - lsls r0, r0, #2 - b _0804BC22 - .align 2, 0 -_0804BC18: .4byte gSineTable -_0804BC1C: .4byte 0x0000FE80 -_0804BC20: - ldr r0, _0804BC40 @ =0x000002BF -_0804BC22: - strh r0, [r2, #0xa] - adds r1, r2, #0 - adds r1, #0x20 - movs r0, #2 - strb r0, [r1] - adds r1, r2, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804BC34: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804BC40: .4byte 0x000002BF - - thumb_func_start sub_804BC44 -sub_804BC44: @ 0x0804BC44 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x64 - mov sb, r0 - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - str r1, [sp, #0x20] - lsls r2, r1, #3 - adds r0, #0x18 - adds r6, r0, r2 - ldr r0, _0804BDE0 @ =gSineTable - mov ip, r0 - lsls r7, r1, #1 - mov r1, sb - adds r1, #0x2c - str r1, [sp, #0x24] - adds r1, r1, r7 - mov sl, r1 - ldrh r0, [r1] - movs r3, #0x80 - lsls r3, r3, #1 - adds r0, r0, r3 - lsls r0, r0, #1 - add r0, ip - movs r4, #0 - ldrsh r0, [r0, r4] - lsls r1, r0, #5 - subs r1, r1, r0 - asrs r1, r1, #0xa - ldr r0, [r6] - subs r0, r0, r1 - str r0, [r6] - mov r0, sb - adds r0, #0x1c - adds r5, r0, r2 - mov r1, sl - ldrh r0, [r1] - lsls r0, r0, #1 - add r0, ip - movs r2, #0 - ldrsh r0, [r0, r2] - lsls r1, r0, #5 - subs r1, r1, r0 - asrs r1, r1, #0xa - ldr r0, [r5] - subs r0, r0, r1 - str r0, [r5] - mov r3, sb - adds r3, #0x28 - str r3, [sp, #0x28] - adds r3, r3, r7 - mov r4, sb - adds r4, #0x30 - str r4, [sp, #0x2c] - adds r2, r4, r7 - ldrh r0, [r2] - lsls r0, r0, #2 - ldrh r1, [r3] - adds r0, r0, r1 - ldr r4, _0804BDE4 @ =0x000003FF - adds r1, r4, #0 - ands r0, r1 - strh r0, [r3] - ldrh r0, [r2] - subs r0, #1 - strh r0, [r2] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0804BCD6 - b _0804BE56 -_0804BCD6: - mov r0, sb - ldr r4, [r0] - ldr r3, [r6] - ldr r0, _0804BDE8 @ =gUnknown_080D8888 - ldr r2, [sp, #0x20] - lsls r1, r2, #2 - adds r2, r1, r0 - adds r4, r4, r3 - ldrh r2, [r2] - adds r4, r4, r2 - mov r2, sb - ldr r3, [r2, #4] - ldr r2, [r5] - adds r0, #2 - adds r1, r1, r0 - adds r3, r3, r2 - ldrh r1, [r1] - adds r3, r3, r1 - mov r5, sl - ldrh r2, [r5] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r2, r1 - lsls r0, r0, #1 - add r0, ip - movs r5, #0 - ldrsh r1, [r0, r5] - lsls r0, r1, #4 - subs r0, r0, r1 - asrs r0, r0, #6 - subs r4, r4, r0 - lsls r2, r2, #1 - add r2, ip - movs r0, #0 - ldrsh r1, [r2, r0] - lsls r0, r1, #4 - subs r0, r0, r1 - asrs r0, r0, #6 - subs r3, r3, r0 - movs r1, #0 - mov r8, r1 - str r7, [sp, #0x38] - ldr r2, [sp, #0x24] - str r2, [sp, #0x4c] - ldr r5, [sp, #0x28] - str r5, [sp, #0x48] - ldr r7, [sp, #0x2c] - str r7, [sp, #0x50] - mov r0, sb - adds r0, #0xc - str r0, [sp, #0x34] - mov r1, sb - adds r1, #0x3c - str r1, [sp, #0x54] - asrs r4, r4, #8 - str r4, [sp, #0x40] - asrs r3, r3, #8 - str r3, [sp, #0x44] - mov r2, sl - mov r4, sp - movs r3, #0 - mov sl, r3 -_0804BD52: - movs r6, #0 - mov r5, r8 - subs r5, #1 - str r5, [sp, #0x60] - mov r7, r8 - lsls r7, r7, #1 - str r7, [sp, #0x3c] - mov r0, r8 - adds r0, #1 - str r0, [sp, #0x30] - adds r3, r5, #0 - movs r1, #1 - mov r7, r8 - subs r5, r1, r7 -_0804BD6E: - ldrh r0, [r2] - ldr r1, _0804BDEC @ =0xFFFFFF00 - adds r0, r0, r1 - ldr r7, _0804BDE4 @ =0x000003FF - ands r0, r7 - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r7, _0804BDE0 @ =gSineTable - adds r0, r0, r7 - movs r1, #0 - ldrsh r0, [r0, r1] - muls r0, r3, r0 - asrs r0, r0, #0xb - ldr r7, [sp, #0x40] - subs r0, r7, r0 - str r0, [sp, #0x14] - ldrh r0, [r2] - ldr r1, _0804BDEC @ =0xFFFFFF00 - adds r0, r0, r1 - ldr r7, _0804BDE4 @ =0x000003FF - ands r0, r7 - lsls r0, r0, #1 - ldr r1, _0804BDE0 @ =gSineTable - adds r0, r0, r1 - movs r7, #0 - ldrsh r0, [r0, r7] - muls r0, r3, r0 - asrs r0, r0, #0xb - ldr r1, [sp, #0x44] - subs r0, r1, r0 - str r0, [sp, #0x18] - mov r7, sl - strh r7, [r4, #0x1c] - movs r0, #0x90 - lsls r0, r0, #2 - adds r1, r0, #0 - ldrh r7, [r2] - adds r1, r1, r7 - ldr r0, [sp, #0x3c] - add r0, r8 - adds r0, r0, r6 - lsls r0, r0, #5 - subs r1, r1, r0 - ldr r0, _0804BDE4 @ =0x000003FF - ands r1, r0 - strh r1, [r4, #0xc] - lsls r0, r6, #7 - movs r7, #0x80 - lsls r7, r7, #2 - adds r1, r0, r7 - cmp r5, #0 - blt _0804BDF0 - lsls r0, r5, #1 - adds r0, r0, r5 - b _0804BDF6 - .align 2, 0 -_0804BDE0: .4byte gSineTable -_0804BDE4: .4byte 0x000003FF -_0804BDE8: .4byte gUnknown_080D8888 -_0804BDEC: .4byte 0xFFFFFF00 -_0804BDF0: - ldr r7, [sp, #0x60] - lsls r0, r7, #1 - adds r0, r0, r7 -_0804BDF6: - lsls r0, r0, #5 - subs r0, r1, r0 - strh r0, [r4, #0xe] - mov r1, sb - ldr r0, [r1, #0x44] - str r0, [sp] - ldr r0, _0804BE68 @ =0x000002C3 - strh r0, [r4, #8] - mov r7, sl - strh r7, [r4, #0xa] - mov r0, sl - str r0, [sp, #4] - mov r0, sp - ldr r1, [sp, #0x34] - str r2, [sp, #0x58] - str r3, [sp, #0x5c] - bl CreateBossParticleStatic - adds r0, r6, #1 - lsls r0, r0, #0x18 - lsrs r6, r0, #0x18 - ldr r2, [sp, #0x58] - ldr r3, [sp, #0x5c] - cmp r6, #2 - bls _0804BD6E - ldr r1, [sp, #0x30] - lsls r0, r1, #0x18 - lsrs r0, r0, #0x18 - mov r8, r0 - cmp r0, #2 - bls _0804BD52 - ldr r3, [sp, #0x48] - ldr r4, [sp, #0x38] - adds r2, r3, r4 - ldr r5, [sp, #0x4c] - adds r0, r5, r4 - ldrh r0, [r0] - movs r1, #0 - strh r0, [r2] - ldr r7, [sp, #0x54] - ldr r2, [sp, #0x20] - adds r0, r7, r2 - strb r1, [r0] - ldr r3, [sp, #0x50] - adds r1, r3, r4 - movs r0, #0x96 - lsls r0, r0, #1 - strh r0, [r1] -_0804BE56: - add sp, #0x64 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804BE68: .4byte 0x000002C3 - - thumb_func_start sub_804BE6C -sub_804BE6C: @ 0x0804BE6C - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x4c - mov r8, r0 - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - str r1, [sp, #0x20] - lsls r2, r1, #3 - adds r0, #0x18 - adds r3, r0, r2 - ldr r0, _0804BFCC @ =gSineTable - mov sb, r0 - lsls r7, r1, #1 - mov r0, r8 - adds r0, #0x28 - adds r6, r0, r7 - ldrh r0, [r6] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - add r0, sb - movs r5, #0 - ldrsh r0, [r0, r5] - lsls r1, r0, #2 - adds r1, r1, r0 - asrs r1, r1, #9 - ldr r0, [r3] - subs r0, r0, r1 - str r0, [r3] - mov r0, r8 - adds r0, #0x1c - adds r5, r0, r2 - ldrh r0, [r6] - lsls r0, r0, #1 - add r0, sb - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r1, r0, #2 - adds r1, r1, r0 - asrs r1, r1, #9 - ldr r0, [r5] - subs r0, r0, r1 - str r0, [r5] - movs r2, #0x30 - add r2, r8 - mov sl, r2 - adds r4, r2, r7 - ldrh r0, [r4] - subs r0, #1 - strh r0, [r4] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0804BEE0 - b _0804C034 -_0804BEE0: - mov r0, r8 - ldr r4, [r0] - ldr r3, [r3] - ldr r0, _0804BFD0 @ =gUnknown_080D8888 - ldr r2, [sp, #0x20] - lsls r1, r2, #2 - adds r2, r1, r0 - adds r4, r4, r3 - ldrh r2, [r2] - adds r4, r4, r2 - mov r2, r8 - ldr r3, [r2, #4] - ldr r2, [r5] - adds r0, #2 - adds r1, r1, r0 - adds r3, r3, r2 - ldrh r1, [r1] - adds r3, r3, r1 - ldrh r2, [r6] - movs r5, #0x80 - lsls r5, r5, #1 - adds r0, r2, r5 - lsls r0, r0, #1 - add r0, sb - movs r5, #0 - ldrsh r1, [r0, r5] - lsls r0, r1, #4 - subs r0, r0, r1 - asrs r0, r0, #6 - subs r4, r4, r0 - lsls r2, r2, #1 - add r2, sb - movs r0, #0 - ldrsh r1, [r2, r0] - lsls r0, r1, #4 - subs r0, r0, r1 - asrs r0, r0, #6 - subs r3, r3, r0 - movs r0, #0 - str r7, [sp, #0x30] - mov r1, sl - str r1, [sp, #0x3c] - mov r2, r8 - adds r2, #0xc - str r2, [sp, #0x2c] - mov r5, r8 - adds r5, #0x3c - str r5, [sp, #0x40] - asrs r4, r4, #8 - str r4, [sp, #0x34] - asrs r3, r3, #8 - str r3, [sp, #0x38] - adds r7, r6, #0 - ldr r1, _0804BFD4 @ =0x000003FF - mov sl, r1 - mov r4, sp -_0804BF50: - movs r6, #0 - subs r2, r0, #1 - mov sb, r2 - adds r5, r0, #1 - str r5, [sp, #0x28] - movs r1, #1 - subs r3, r1, r0 - lsls r5, r3, #5 - str r5, [sp, #0x24] -_0804BF62: - ldrh r0, [r7] - ldr r1, _0804BFD8 @ =0xFFFFFF00 - adds r0, r0, r1 - mov r5, sl - ands r0, r5 - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r5, _0804BFCC @ =gSineTable - adds r0, r0, r5 - movs r1, #0 - ldrsh r0, [r0, r1] - muls r0, r2, r0 - asrs r0, r0, #0xb - ldr r5, [sp, #0x34] - subs r0, r5, r0 - str r0, [sp, #0x14] - ldrh r0, [r7] - ldr r1, _0804BFD8 @ =0xFFFFFF00 - adds r0, r0, r1 - mov r5, sl - ands r0, r5 - lsls r0, r0, #1 - ldr r1, _0804BFCC @ =gSineTable - adds r0, r0, r1 - movs r5, #0 - ldrsh r0, [r0, r5] - muls r0, r2, r0 - asrs r0, r0, #0xb - ldr r1, [sp, #0x38] - subs r0, r1, r0 - str r0, [sp, #0x18] - movs r0, #0x12 - strh r0, [r4, #0x1c] - movs r5, #0x80 - lsls r5, r5, #2 - adds r0, r5, #0 - ldrh r1, [r7] - adds r0, r0, r1 - mov r5, sl - ands r0, r5 - strh r0, [r4, #0xc] - lsls r0, r6, #1 - adds r0, r0, r6 - lsls r0, r0, #5 - adds r1, r0, #0 - adds r1, #0x80 - cmp r3, #0 - blt _0804BFDC - ldr r5, [sp, #0x24] - subs r0, r1, r5 - b _0804BFE2 - .align 2, 0 -_0804BFCC: .4byte gSineTable -_0804BFD0: .4byte gUnknown_080D8888 -_0804BFD4: .4byte 0x000003FF -_0804BFD8: .4byte 0xFFFFFF00 -_0804BFDC: - mov r5, sb - lsls r0, r5, #5 - subs r0, r1, r0 -_0804BFE2: - movs r5, #0 - strh r0, [r4, #0xe] - mov r1, r8 - ldr r0, [r1, #0x44] - str r0, [sp] - ldr r0, _0804C030 @ =0x000002C3 - strh r0, [r4, #8] - strh r5, [r4, #0xa] - str r5, [sp, #4] - mov r0, sp - ldr r1, [sp, #0x2c] - str r2, [sp, #0x44] - str r3, [sp, #0x48] - bl CreateBossParticleStatic - adds r0, r6, #1 - lsls r0, r0, #0x18 - lsrs r6, r0, #0x18 - ldr r2, [sp, #0x44] - ldr r3, [sp, #0x48] - cmp r6, #2 - bls _0804BF62 - ldr r2, [sp, #0x28] - lsls r0, r2, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #2 - bls _0804BF50 - ldr r1, [sp, #0x40] - ldr r2, [sp, #0x20] - adds r0, r1, r2 - strb r5, [r0] - ldr r5, [sp, #0x3c] - ldr r0, [sp, #0x30] - adds r1, r5, r0 - movs r0, #0x96 - lsls r0, r0, #1 - strh r0, [r1] - b _0804C06C - .align 2, 0 -_0804C030: .4byte 0x000002C3 -_0804C034: - mov r0, r8 - ldr r1, [sp, #0x20] - bl sub_804B2EC - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0804C06C - ldr r1, [sp, #0x20] - lsls r2, r1, #2 - mov r0, r8 - adds r0, #0x34 - adds r0, r0, r2 - ldr r1, _0804C07C @ =0x0000FE80 - strh r1, [r0] - mov r0, r8 - adds r0, #0x36 - adds r0, r0, r2 - movs r1, #0xfd - lsls r1, r1, #8 - strh r1, [r0] - mov r0, r8 - adds r0, #0x3c - ldr r2, [sp, #0x20] - adds r0, r0, r2 - movs r1, #7 - strb r1, [r0] - movs r0, #0x3c - strh r0, [r4] -_0804C06C: - add sp, #0x4c - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C07C: .4byte 0x0000FE80 - - thumb_func_start sub_804C080 -sub_804C080: @ 0x0804C080 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x20 - mov sl, r0 - ldr r0, _0804C20C @ =gStageTime - mov sb, r0 - ldr r7, [r0] - movs r0, #7 - ands r7, r0 - cmp r7, #0 - bne _0804C116 - ldr r1, _0804C210 @ =gPseudoRandom - mov r8, r1 - ldr r0, [r1] - ldr r5, _0804C214 @ =0x00196225 - adds r2, r0, #0 - muls r2, r5, r2 - ldr r4, _0804C218 @ =0x3C6EF35F - adds r2, r2, r4 - ldr r6, _0804C21C @ =gCamera - movs r3, #0xff - adds r1, r2, #0 - ands r1, r3 - ldr r0, [r6] - adds r0, r0, r1 - str r0, [sp, #0x14] - muls r2, r5, r2 - adds r2, r2, r4 - adds r1, r2, #0 - ands r1, r3 - ldr r0, [r6, #4] - adds r0, r0, r1 - str r0, [sp, #0x18] - mov r1, sp - movs r0, #0x12 - strh r0, [r1, #0x1c] - mov r3, sp - adds r1, r2, #0 - muls r1, r5, r1 - adds r1, r1, r4 - ldr r0, _0804C220 @ =0x000003FF - ands r0, r1 - strh r0, [r3, #0xc] - mov r2, sp - adds r0, r1, #0 - muls r0, r5, r0 - adds r0, r0, r4 - mov r3, r8 - str r0, [r3] - ldr r1, _0804C224 @ =0x000001FF - ands r0, r1 - adds r1, #1 - adds r0, r0, r1 - strh r0, [r2, #0xe] - ldr r0, _0804C228 @ =0x06012980 - str r0, [sp] - mov r1, sp - ldr r0, _0804C22C @ =0x0000026B - strh r0, [r1, #8] - mov r0, sp - strh r7, [r0, #0xa] - str r7, [sp, #4] - mov r1, sl - adds r1, #0xc - bl CreateBossParticleStatic - movs r0, #0x90 - bl m4aSongNumStart - ldr r0, _0804C230 @ =gMPlayInfo_SE3 - bl m4aMPlayImmInit -_0804C116: - ldr r0, _0804C230 @ =gMPlayInfo_SE3 - ldr r1, _0804C234 @ =0x0000FFFF - mov r3, sl - ldrh r2, [r3, #0x14] - bl m4aMPlayVolumeControl - mov r0, sl - ldr r2, [r0, #0x14] - cmp r2, #0 - beq _0804C13C - mov r1, sb - ldr r0, [r1] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _0804C13C - subs r0, r2, #1 - mov r3, sl - str r0, [r3, #0x14] -_0804C13C: - ldr r0, _0804C20C @ =gStageTime - ldr r0, [r0] - adds r7, r0, #3 - movs r0, #7 - ands r7, r0 - cmp r7, #0 - bne _0804C1FC - ldr r0, _0804C210 @ =gPseudoRandom - mov sb, r0 - ldr r0, [r0] - ldr r1, _0804C214 @ =0x00196225 - mov r8, r1 - mov r3, r8 - muls r3, r0, r3 - adds r0, r3, #0 - ldr r6, _0804C218 @ =0x3C6EF35F - adds r0, r0, r6 - mov r1, sb - str r0, [r1] - lsls r0, r0, #0x18 - movs r4, #0xf0 - lsls r4, r4, #0x14 - ands r4, r0 - lsrs r4, r4, #0x18 - adds r0, r4, #0 - movs r1, #6 - bl Div - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #1 - subs r4, r4, r1 - lsls r4, r4, #0x18 - lsrs r4, r4, #0x18 - mov r3, sb - ldr r0, [r3] - mov r2, r8 - muls r2, r0, r2 - adds r2, r2, r6 - ldr r5, _0804C21C @ =gCamera - movs r3, #0xff - adds r1, r2, #0 - ands r1, r3 - ldr r0, [r5] - adds r0, r0, r1 - str r0, [sp, #0x14] - mov r0, r8 - muls r0, r2, r0 - adds r2, r0, #0 - adds r2, r2, r6 - adds r1, r2, #0 - ands r1, r3 - ldr r0, [r5, #4] - adds r0, r0, r1 - str r0, [sp, #0x18] - mov r1, sp - movs r0, #0x20 - strh r0, [r1, #0x1c] - mov r3, sp - mov r0, r8 - muls r0, r2, r0 - adds r0, r0, r6 - mov r1, sb - str r0, [r1] - ldr r1, _0804C220 @ =0x000003FF - ands r0, r1 - strh r0, [r3, #0xc] - mov r1, sp - movs r0, #0x80 - lsls r0, r0, #2 - strh r0, [r1, #0xe] - ldr r2, _0804C238 @ =gTileInfoBossScrews - lsls r1, r4, #1 - adds r1, r1, r4 - lsls r1, r1, #2 - adds r0, r1, r2 - ldr r0, [r0] - lsls r0, r0, #5 - ldr r3, _0804C23C @ =0x06010000 - adds r0, r0, r3 - str r0, [sp] - mov r3, sp - adds r0, r2, #4 - adds r0, r1, r0 - ldr r0, [r0] - strh r0, [r3, #8] - adds r2, #8 - adds r1, r1, r2 - ldr r0, [r1] - strh r0, [r3, #0xa] - str r7, [sp, #4] - mov r1, sl - adds r1, #0xc - mov r0, sp - bl CreateBossParticleStatic -_0804C1FC: - add sp, #0x20 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C20C: .4byte gStageTime -_0804C210: .4byte gPseudoRandom -_0804C214: .4byte 0x00196225 -_0804C218: .4byte 0x3C6EF35F -_0804C21C: .4byte gCamera -_0804C220: .4byte 0x000003FF -_0804C224: .4byte 0x000001FF -_0804C228: .4byte 0x06012980 -_0804C22C: .4byte 0x0000026B -_0804C230: .4byte gMPlayInfo_SE3 -_0804C234: .4byte 0x0000FFFF -_0804C238: .4byte gTileInfoBossScrews -_0804C23C: .4byte 0x06010000 - - thumb_func_start sub_804C240 -sub_804C240: @ 0x0804C240 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x24 - adds r4, r0, #0 - lsls r1, r1, #0x18 - lsrs r2, r1, #0x18 - mov ip, r2 - adds r0, #0x42 - adds r3, r0, r2 - ldrb r0, [r3] - cmp r0, #0 - beq _0804C260 - b _0804C37C -_0804C260: - lsls r7, r2, #3 - adds r0, r4, #0 - adds r0, #0x1c - adds r6, r0, r7 - ldr r1, [r4, #4] - ldr r0, [r6] - adds r1, r1, r0 - ldr r0, _0804C290 @ =gUnknown_080D8888 - mov sb, r0 - lsls r5, r2, #2 - adds r0, #2 - adds r0, r5, r0 - ldrh r0, [r0] - mov r8, r0 - add r1, r8 - asrs r1, r1, #8 - movs r0, #0x96 - lsls r0, r0, #1 - cmp r1, r0 - ble _0804C294 - movs r0, #1 - strb r0, [r3] - b _0804C37C - .align 2, 0 -_0804C290: .4byte gUnknown_080D8888 -_0804C294: - mov r1, ip - lsls r0, r1, #1 - adds r2, r4, #0 - adds r2, #0x28 - adds r2, r2, r0 - movs r3, #0xc8 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r1, [r2] - adds r0, r0, r1 - adds r3, #0xdf - adds r1, r3, #0 - ands r0, r1 - strh r0, [r2] - adds r0, r4, #0 - adds r0, #0x36 - adds r3, r0, r5 - ldrh r0, [r3] - adds r0, #0x20 - strh r0, [r3] - adds r0, r4, #0 - adds r0, #0x18 - adds r2, r0, r7 - adds r0, #0x1c - adds r0, r0, r5 - mov ip, r0 - movs r7, #0 - ldrsh r1, [r0, r7] - ldr r0, [r2] - adds r0, r0, r1 - str r0, [r2] - movs r0, #0 - ldrsh r1, [r3, r0] - ldr r0, [r6] - adds r0, r0, r1 - str r0, [sp, #0x20] - str r0, [r6] - ldr r1, _0804C38C @ =gStageTime - mov sl, r1 - ldr r6, [r1] - movs r0, #3 - ands r6, r0 - cmp r6, #0 - bne _0804C37C - ldr r1, [r4] - ldr r0, [r2] - mov r7, sb - adds r2, r5, r7 - adds r1, r1, r0 - ldrh r2, [r2] - adds r1, r1, r2 - ldr r0, [r4, #4] - ldr r2, [sp, #0x20] - adds r0, r0, r2 - add r0, r8 - asrs r1, r1, #8 - str r1, [sp, #0x14] - asrs r0, r0, #8 - str r0, [sp, #0x18] - mov r0, sp - strh r6, [r0, #0x1c] - ldrh r0, [r3] - lsls r0, r0, #0x10 - asrs r0, r0, #0x13 - rsbs r0, r0, #0 - mov r3, ip - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x13 - rsbs r1, r1, #0 - bl sub_8004418 - mov r1, sp - strh r0, [r1, #0xc] - mov r3, sp - ldr r2, _0804C390 @ =gPseudoRandom - ldr r1, [r2] - ldr r0, _0804C394 @ =0x00196225 - muls r0, r1, r0 - ldr r5, _0804C398 @ =0x3C6EF35F - adds r0, r0, r5 - str r0, [r2] - mov r2, sp - movs r1, #0x1f - ands r0, r1 - ldrh r2, [r2, #0xc] - adds r0, r0, r2 - subs r0, #0x10 - ldr r1, _0804C39C @ =0x000003FF - ands r0, r1 - strh r0, [r3, #0xc] - ldr r2, _0804C3A0 @ =gSineTable - mov r7, sl - ldr r0, [r7] - lsls r0, r0, #4 - ands r0, r1 - lsls r0, r0, #1 - adds r0, r0, r2 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - subs r1, #0xff - adds r0, r0, r1 - strh r0, [r3, #0xe] - ldr r0, _0804C3A4 @ =0x06012980 - str r0, [sp] - mov r1, sp - ldr r0, _0804C3A8 @ =0x0000026B - strh r0, [r1, #8] - mov r0, sp - strh r6, [r0, #0xa] - str r6, [sp, #4] - adds r1, r4, #0 - adds r1, #0xc - bl CreateBossParticleStatic -_0804C37C: - add sp, #0x24 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C38C: .4byte gStageTime -_0804C390: .4byte gPseudoRandom -_0804C394: .4byte 0x00196225 -_0804C398: .4byte 0x3C6EF35F -_0804C39C: .4byte 0x000003FF -_0804C3A0: .4byte gSineTable -_0804C3A4: .4byte 0x06012980 -_0804C3A8: .4byte 0x0000026B - - thumb_func_start sub_804C3AC -sub_804C3AC: @ 0x0804C3AC - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x14 - mov sl, r0 - ldr r5, _0804C42C @ =gPseudoRandom - ldr r0, [r5] - ldr r4, _0804C430 @ =0x00196225 - adds r1, r0, #0 - muls r1, r4, r1 - ldr r2, _0804C434 @ =0x3C6EF35F - adds r1, r1, r2 - movs r3, #7 - adds r0, r1, #0 - ands r0, r3 - subs r0, #3 - lsls r0, r0, #8 - str r0, [sp] - adds r0, r1, #0 - muls r0, r4, r0 - adds r0, r0, r2 - str r0, [r5] - ands r0, r3 - subs r0, #3 - lsls r0, r0, #8 - str r0, [sp, #4] - ldr r3, _0804C438 @ =gBgScrollRegs - ldr r1, _0804C43C @ =gCamera - ldr r4, [r1] - mov r0, sl - ldr r2, [r0] - ldr r5, [sp] - adds r0, r2, r5 - asrs r0, r0, #8 - subs r0, r4, r0 - strh r0, [r3] - ldr r1, [r1, #4] - mov r5, sl - ldr r0, [r5, #4] - ldr r5, [sp, #4] - adds r0, r0, r5 - asrs r0, r0, #8 - subs r1, r1, r0 - strh r1, [r3, #2] - movs r0, #0xbe - lsls r0, r0, #8 - adds r2, r2, r0 - asrs r2, r2, #8 - subs r6, r2, r4 - adds r1, r6, #0 - adds r1, #0x32 - movs r0, #0xa5 - lsls r0, r0, #1 - cmp r1, r0 - bls _0804C448 - ldr r2, _0804C440 @ =gDispCnt - ldrh r1, [r2] - ldr r0, _0804C444 @ =0x0000FEFF - ands r0, r1 - strh r0, [r2] - b _0804C456 - .align 2, 0 -_0804C42C: .4byte gPseudoRandom -_0804C430: .4byte 0x00196225 -_0804C434: .4byte 0x3C6EF35F -_0804C438: .4byte gBgScrollRegs -_0804C43C: .4byte gCamera -_0804C440: .4byte gDispCnt -_0804C444: .4byte 0x0000FEFF -_0804C448: - ldr r0, _0804C5A0 @ =gDispCnt - ldrh r1, [r0] - movs r3, #0x80 - lsls r3, r3, #1 - adds r2, r3, #0 - orrs r1, r2 - strh r1, [r0] -_0804C456: - mov r5, sl - adds r5, #0x54 - movs r4, #0x84 - add r4, sl - mov r8, r4 - mov r1, sl - ldr r0, [r1] - ldr r2, [sp] - adds r0, r0, r2 - movs r3, #0xbe - lsls r3, r3, #8 - adds r6, r0, r3 - ldr r0, [r1, #4] - ldr r4, [sp, #4] - adds r0, r0, r4 - movs r1, #0xa0 - lsls r1, r1, #6 - adds r7, r0, r1 - asrs r0, r6, #8 - ldr r2, _0804C5A4 @ =gCamera - ldr r1, [r2] - subs r0, r0, r1 - strh r0, [r5, #0x16] - asrs r0, r7, #8 - ldr r1, [r2, #4] - subs r0, r0, r1 - strh r0, [r5, #0x18] - ldr r2, _0804C5A8 @ =gUnknown_030054B8 - ldrb r0, [r2] - adds r1, r0, #1 - strb r1, [r2] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - ldr r1, _0804C5AC @ =0x00003060 - orrs r0, r1 - str r0, [r5, #0x10] - mov r2, sl - ldrh r0, [r2, #0x10] - mov r3, r8 - strh r0, [r3] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r3, #2] - strh r0, [r3, #4] - ldrh r0, [r5, #0x16] - strh r0, [r3, #6] - ldrh r0, [r5, #0x18] - strh r0, [r3, #8] - adds r0, r5, #0 - bl UpdateSpriteAnimation - adds r0, r5, #0 - mov r1, r8 - bl sub_8004860 - adds r0, r5, #0 - bl DisplaySprite - movs r4, #0 - mov sb, r4 - subs r5, #0x3c - str r5, [sp, #0xc] - mov r0, sl - adds r0, #0x1c - str r0, [sp, #0x10] - mov r1, sl - adds r1, #0x28 - str r1, [sp, #8] -_0804C4DE: - mov r2, sb - lsls r0, r2, #4 - subs r0, r0, r2 - lsls r0, r0, #2 - adds r0, #0x90 - mov r3, sl - adds r5, r3, r0 - movs r4, #0x30 - adds r4, r4, r5 - mov r8, r4 - ldr r1, [r3] - ldr r0, [sp] - adds r1, r1, r0 - lsls r2, r2, #3 - ldr r3, [sp, #0xc] - adds r0, r3, r2 - ldr r0, [r0] - mov ip, r0 - mov r4, sb - lsls r3, r4, #2 - ldr r4, _0804C5B0 @ =gUnknown_080D8888 - adds r0, r3, r4 - add r1, ip - ldrh r0, [r0] - adds r6, r1, r0 - mov r1, sl - ldr r0, [r1, #4] - ldr r4, [sp, #4] - adds r0, r0, r4 - ldr r1, [sp, #0x10] - adds r2, r1, r2 - ldr r1, [r2] - ldr r2, _0804C5B4 @ =gUnknown_080D888A - adds r3, r3, r2 - adds r0, r0, r1 - ldrh r3, [r3] - adds r7, r0, r3 - asrs r1, r6, #8 - ldr r2, _0804C5A4 @ =gCamera - ldr r0, [r2] - subs r1, r1, r0 - strh r1, [r5, #0x16] - asrs r0, r7, #8 - ldr r1, [r2, #4] - subs r0, r0, r1 - strh r0, [r5, #0x18] - ldr r2, _0804C5A8 @ =gUnknown_030054B8 - ldrb r0, [r2] - adds r1, r0, #1 - strb r1, [r2] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - movs r1, #0x83 - lsls r1, r1, #5 - orrs r0, r1 - str r0, [r5, #0x10] - mov r3, sb - lsls r0, r3, #1 - ldr r4, [sp, #8] - adds r0, r4, r0 - ldrh r0, [r0] - strh r0, [r5, #0x30] - movs r0, #0x80 - lsls r0, r0, #1 - mov r1, r8 - strh r0, [r1, #2] - strh r0, [r1, #4] - ldrh r0, [r5, #0x16] - strh r0, [r1, #6] - ldrh r0, [r5, #0x18] - strh r0, [r1, #8] - adds r0, r5, #0 - bl UpdateSpriteAnimation - adds r0, r5, #0 - mov r1, r8 - bl sub_8004860 - adds r0, r5, #0 - bl DisplaySprite - mov r0, sb - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - mov sb, r0 - cmp r0, #1 - bls _0804C4DE - add sp, #0x14 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C5A0: .4byte gDispCnt -_0804C5A4: .4byte gCamera -_0804C5A8: .4byte gUnknown_030054B8 -_0804C5AC: .4byte 0x00003060 -_0804C5B0: .4byte gUnknown_080D8888 -_0804C5B4: .4byte gUnknown_080D888A - - thumb_func_start sub_804C5B8 -sub_804C5B8: @ 0x0804C5B8 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x10 - mov r8, r0 - ldrb r0, [r0, #0xb] - cmp r0, #0 - beq _0804C640 - cmp r0, #0x1f - bhi _0804C608 - ldr r5, _0804C5FC @ =gPseudoRandom - ldr r0, [r5] - ldr r4, _0804C600 @ =0x00196225 - adds r1, r0, #0 - muls r1, r4, r1 - ldr r2, _0804C604 @ =0x3C6EF35F - adds r1, r1, r2 - movs r3, #7 - adds r0, r1, #0 - ands r0, r3 - subs r0, #3 - lsls r0, r0, #8 - str r0, [sp, #8] - adds r0, r1, #0 - muls r0, r4, r0 - adds r0, r0, r2 - str r0, [r5] - ands r0, r3 - subs r0, #3 - lsls r0, r0, #8 - b _0804C644 - .align 2, 0 -_0804C5FC: .4byte gPseudoRandom -_0804C600: .4byte 0x00196225 -_0804C604: .4byte 0x3C6EF35F -_0804C608: - ldr r5, _0804C634 @ =gPseudoRandom - ldr r0, [r5] - ldr r4, _0804C638 @ =0x00196225 - adds r1, r0, #0 - muls r1, r4, r1 - ldr r2, _0804C63C @ =0x3C6EF35F - adds r1, r1, r2 - movs r3, #0xf - adds r0, r1, #0 - ands r0, r3 - subs r0, #7 - lsls r0, r0, #8 - str r0, [sp, #8] - adds r0, r1, #0 - muls r0, r4, r0 - adds r0, r0, r2 - str r0, [r5] - ands r0, r3 - subs r0, #7 - lsls r0, r0, #8 - b _0804C644 - .align 2, 0 -_0804C634: .4byte gPseudoRandom -_0804C638: .4byte 0x00196225 -_0804C63C: .4byte 0x3C6EF35F -_0804C640: - movs r0, #0 - str r0, [sp, #8] -_0804C644: - str r0, [sp, #0xc] - ldr r5, _0804C694 @ =gBgScrollRegs - ldr r3, _0804C698 @ =gCamera - ldr r6, [r3] - mov r1, r8 - ldr r2, [r1] - ldr r7, [sp, #8] - adds r0, r2, r7 - asrs r0, r0, #8 - subs r0, r6, r0 - strh r0, [r5] - ldr r1, [r3, #4] - mov r0, r8 - ldr r4, [r0, #4] - ldr r7, [sp, #0xc] - adds r0, r4, r7 - asrs r0, r0, #8 - subs r1, r1, r0 - strh r1, [r5, #2] - movs r1, #0xbe - lsls r1, r1, #8 - adds r0, r2, r1 - asrs r0, r0, #8 - subs r6, r0, r6 - str r6, [sp] - adds r1, r6, #0 - adds r1, #0x32 - movs r0, #0xa5 - lsls r0, r0, #1 - mov sb, r3 - adds r7, r2, #0 - cmp r1, r0 - bls _0804C6A4 - ldr r2, _0804C69C @ =gDispCnt - ldrh r1, [r2] - ldr r0, _0804C6A0 @ =0x0000FEFF - ands r0, r1 - strh r0, [r2] - b _0804C6B2 - .align 2, 0 -_0804C694: .4byte gBgScrollRegs -_0804C698: .4byte gCamera -_0804C69C: .4byte gDispCnt -_0804C6A0: .4byte 0x0000FEFF -_0804C6A4: - ldr r0, _0804C6CC @ =gDispCnt - ldrh r1, [r0] - movs r3, #0x80 - lsls r3, r3, #1 - adds r2, r3, #0 - orrs r1, r2 - strh r1, [r0] -_0804C6B2: - mov r5, r8 - adds r5, #0x54 - mov r6, r8 - adds r6, #0x84 - mov r1, r8 - ldrb r0, [r1, #0xb] - lsls r1, r0, #0x18 - lsrs r0, r1, #0x18 - cmp r0, #0x1f - bhi _0804C6D0 - lsrs r3, r1, #0x1b - b _0804C6DE - .align 2, 0 -_0804C6CC: .4byte gDispCnt -_0804C6D0: - mov r2, r8 - ldrb r1, [r2, #0xb] - movs r0, #0x40 - subs r0, r0, r1 - asrs r0, r0, #3 - lsls r0, r0, #0x18 - lsrs r3, r0, #0x18 -_0804C6DE: - ldr r1, [sp, #8] - adds r0, r7, r1 - movs r2, #0xbe - lsls r2, r2, #8 - adds r2, r0, r2 - str r2, [sp] - ldr r7, [sp, #0xc] - adds r0, r4, r7 - movs r1, #0xa0 - lsls r1, r1, #6 - adds r1, r0, r1 - str r1, [sp, #4] - asrs r0, r2, #8 - mov r7, sb - ldr r1, [r7] - subs r0, r0, r1 - strh r0, [r5, #0x16] - ldr r1, [sp, #4] - asrs r0, r1, #8 - ldr r1, [r7, #4] - subs r0, r0, r1 - adds r0, r0, r3 - strh r0, [r5, #0x18] - ldr r2, _0804C81C @ =gUnknown_030054B8 - ldrb r0, [r2] - adds r1, r0, #1 - strb r1, [r2] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - ldr r1, _0804C820 @ =0x00003060 - orrs r0, r1 - str r0, [r5, #0x10] - mov r2, r8 - ldrh r0, [r2, #0x10] - strh r0, [r6] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r6, #2] - strh r0, [r6, #4] - ldrh r0, [r5, #0x16] - strh r0, [r6, #6] - ldrh r0, [r5, #0x18] - strh r0, [r6, #8] - adds r0, r5, #0 - bl UpdateSpriteAnimation - adds r0, r5, #0 - adds r1, r6, #0 - bl sub_8004860 - adds r0, r5, #0 - bl DisplaySprite - movs r7, #0 - movs r3, #0x42 - add r3, r8 - mov sl, r3 - ldr r0, _0804C824 @ =gUnknown_080D8888 - mov sb, r0 -_0804C754: - mov r1, sl - adds r0, r1, r7 - ldrb r0, [r0] - cmp r0, #0 - bne _0804C802 - lsls r0, r7, #4 - subs r0, r0, r7 - lsls r0, r0, #2 - adds r0, #0x90 - mov r2, r8 - adds r5, r2, r0 - adds r6, r5, #0 - adds r6, #0x30 - ldr r1, [r2] - ldr r3, [sp, #8] - adds r1, r1, r3 - lsls r4, r7, #3 - mov r0, r8 - adds r0, #0x18 - adds r0, r0, r4 - ldr r0, [r0] - mov ip, r0 - lsls r2, r7, #2 - mov r3, sb - adds r0, r2, r3 - add r1, ip - ldrh r0, [r0] - adds r0, r1, r0 - str r0, [sp] - mov r0, r8 - ldr r1, [r0, #4] - ldr r3, [sp, #0xc] - adds r1, r1, r3 - adds r0, #0x1c - adds r0, r0, r4 - ldr r0, [r0] - ldr r3, _0804C828 @ =gUnknown_080D888A - adds r2, r2, r3 - adds r1, r1, r0 - ldrh r2, [r2] - adds r2, r1, r2 - str r2, [sp, #4] - ldr r0, [sp] - asrs r1, r0, #8 - ldr r2, _0804C82C @ =gCamera - ldr r0, [r2] - subs r1, r1, r0 - strh r1, [r5, #0x16] - ldr r1, [sp, #4] - asrs r0, r1, #8 - ldr r1, [r2, #4] - subs r0, r0, r1 - strh r0, [r5, #0x18] - ldr r2, _0804C81C @ =gUnknown_030054B8 - ldrb r0, [r2] - adds r1, r0, #1 - strb r1, [r2] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - movs r1, #0x83 - lsls r1, r1, #5 - orrs r0, r1 - str r0, [r5, #0x10] - lsls r1, r7, #1 - mov r0, r8 - adds r0, #0x28 - adds r0, r0, r1 - ldrh r0, [r0] - strh r0, [r5, #0x30] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r6, #2] - strh r0, [r6, #4] - ldrh r0, [r5, #0x16] - strh r0, [r6, #6] - ldrh r0, [r5, #0x18] - strh r0, [r6, #8] - adds r0, r5, #0 - bl UpdateSpriteAnimation - adds r0, r5, #0 - adds r1, r6, #0 - bl sub_8004860 - adds r0, r5, #0 - bl DisplaySprite -_0804C802: - adds r0, r7, #1 - lsls r0, r0, #0x18 - lsrs r7, r0, #0x18 - cmp r7, #1 - bls _0804C754 - add sp, #0x10 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C81C: .4byte gUnknown_030054B8 -_0804C820: .4byte 0x00003060 -_0804C824: .4byte gUnknown_080D8888 -_0804C828: .4byte gUnknown_080D888A -_0804C82C: .4byte gCamera - - thumb_func_start sub_804C830 -sub_804C830: @ 0x0804C830 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - sub sp, #0xc - adds r5, r0, #0 - ldrb r0, [r5, #0xb] - cmp r0, #0 - bne _0804C8CC - ldr r0, [r5] - movs r1, #0xbe - lsls r1, r1, #8 - adds r0, r0, r1 - asrs r7, r0, #8 - str r7, [sp, #4] - ldr r0, [r5, #4] - movs r2, #0xa0 - lsls r2, r2, #6 - adds r0, r0, r2 - asrs r4, r0, #8 - str r4, [sp, #8] - adds r6, r5, #0 - adds r6, #0x54 - ldr r0, _0804C87C @ =gPlayer - mov r8, r0 - str r0, [sp] - adds r0, r6, #0 - adds r1, r7, #0 - adds r2, r4, #0 - movs r3, #0 - bl IsColliding_Cheese - cmp r0, #1 - bne _0804C880 - adds r0, r5, #0 - bl sub_804C8F4 - b _0804C8E4 - .align 2, 0 -_0804C87C: .4byte gPlayer -_0804C880: - mov r1, r8 - str r1, [sp] - adds r0, r6, #0 - adds r1, r7, #0 - adds r2, r4, #0 - movs r3, #0 - bl sub_800C320 - cmp r0, #1 - bne _0804C8AA - adds r0, r5, #0 - bl sub_804C8F4 - mov r2, r8 - movs r1, #0x10 - ldrsh r0, [r2, r1] - cmp r0, #0 - ble _0804C8CC - rsbs r0, r0, #0 - strh r0, [r2, #0x10] - b _0804C8CC -_0804C8AA: - mov r2, r8 - str r2, [sp] - adds r0, r6, #0 - adds r1, r7, #0 - adds r2, r4, #0 - movs r3, #0 - bl sub_800CA20 - cmp r0, #1 - bne _0804C8CC - mov r1, r8 - movs r2, #0x10 - ldrsh r0, [r1, r2] - cmp r0, #0 - ble _0804C8CC - rsbs r0, r0, #0 - strh r0, [r1, #0x10] -_0804C8CC: - ldr r0, _0804C8F0 @ =gSelectedCharacter - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _0804C8E4 - ldr r1, [sp, #4] - lsls r0, r1, #8 - ldr r2, [sp, #8] - lsls r1, r2, #8 - bl Player_UpdateHomingPosition -_0804C8E4: - add sp, #0xc - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C8F0: .4byte gSelectedCharacter - - thumb_func_start sub_804C8F4 -sub_804C8F4: @ 0x0804C8F4 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r7, r0, #0 - movs r0, #0x54 - adds r0, r0, r7 - mov r8, r0 - ldrb r0, [r7, #8] - subs r0, #1 - strb r0, [r7, #8] - movs r1, #0xff - ands r0, r1 - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _0804C91C - movs r0, #0x8f - bl m4aSongNumStart - b _0804C922 -_0804C91C: - movs r0, #0xeb - bl m4aSongNumStart -_0804C922: - ldrb r2, [r7, #8] - cmp r2, #3 - bne _0804C92E - ldr r1, _0804C99C @ =gUnknown_030054A8 - movs r0, #0x13 - strb r0, [r1, #1] -_0804C92E: - cmp r2, #0 - bne _0804C97C - ldr r1, _0804C9A0 @ =gLevelScore - ldr r5, [r1] - movs r2, #0xfa - lsls r2, r2, #2 - adds r0, r5, r2 - str r0, [r1] - ldr r4, _0804C9A4 @ =0x0000C350 - adds r1, r4, #0 - bl Div - adds r6, r0, #0 - adds r0, r5, #0 - adds r1, r4, #0 - bl Div - adds r1, r0, #0 - cmp r6, r1 - beq _0804C976 - ldr r0, _0804C9A8 @ =gGameMode - ldrb r0, [r0] - cmp r0, #0 - bne _0804C976 - subs r0, r6, r1 - lsls r0, r0, #0x10 - ldr r1, _0804C9AC @ =gNumLives - lsrs r0, r0, #0x10 - ldrb r2, [r1] - adds r0, r0, r2 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0xff - bls _0804C974 - movs r0, #0xff -_0804C974: - strb r0, [r1] -_0804C976: - ldr r1, _0804C99C @ =gUnknown_030054A8 - movs r0, #0x30 - strb r0, [r1, #1] -_0804C97C: - movs r0, #0x40 - strb r0, [r7, #0xb] - ldr r0, _0804C9B0 @ =0x000002C1 - mov r1, r8 - strh r0, [r1, #0xa] - adds r1, #0x20 - movs r0, #2 - strb r0, [r1] - adds r1, #1 - movs r0, #0xff - strb r0, [r1] - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C99C: .4byte gUnknown_030054A8 -_0804C9A0: .4byte gLevelScore -_0804C9A4: .4byte 0x0000C350 -_0804C9A8: .4byte gGameMode -_0804C9AC: .4byte gNumLives -_0804C9B0: .4byte 0x000002C1 - - thumb_func_start sub_804C9B4 -sub_804C9B4: @ 0x0804C9B4 - push {r4, r5, lr} - adds r5, r0, #0 - lsls r1, r1, #0x18 - lsrs r4, r1, #0x18 - adds r0, #9 - adds r1, r0, r4 - ldrb r0, [r1] - cmp r0, #0 - beq _0804C9EE - subs r0, #1 - strb r0, [r1] - movs r1, #0xff - ands r0, r1 - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _0804C9DE - movs r0, #0x8f - bl m4aSongNumStart - b _0804C9E4 -_0804C9DE: - movs r0, #0xeb - bl m4aSongNumStart -_0804C9E4: - adds r0, r5, #0 - adds r0, #0x3e - adds r0, r0, r4 - movs r1, #0x40 - strb r1, [r0] -_0804C9EE: - movs r1, #0 - adds r0, r5, #0 - adds r0, #9 - adds r0, r0, r4 - ldrb r0, [r0] - cmp r0, #0 - bne _0804C9FE - movs r1, #1 -_0804C9FE: - adds r0, r1, #0 - pop {r4, r5} - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_804CA08 -sub_804CA08: @ 0x0804CA08 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xb] - cmp r0, #0 - beq _0804CA4C - subs r0, #1 - strb r0, [r2, #0xb] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0804CA4C - adds r3, r2, #0 - adds r3, #0x54 - ldrb r0, [r2, #8] - cmp r0, #0 - beq _0804CA38 - movs r0, #0 - ldr r1, _0804CA34 @ =0x000002C1 - strh r1, [r3, #0xa] - adds r1, r2, #0 - adds r1, #0x74 - b _0804CA42 - .align 2, 0 -_0804CA34: .4byte 0x000002C1 -_0804CA38: - ldr r0, _0804CA6C @ =0x000002C1 - strh r0, [r3, #0xa] - adds r1, r2, #0 - adds r1, #0x74 - movs r0, #3 -_0804CA42: - strb r0, [r1] - adds r1, r3, #0 - adds r1, #0x21 - movs r0, #0xff - strb r0, [r1] -_0804CA4C: - adds r1, r2, #0 - adds r1, #0x3e - ldrb r0, [r1] - cmp r0, #0 - beq _0804CA5A - subs r0, #1 - strb r0, [r1] -_0804CA5A: - adds r1, r2, #0 - adds r1, #0x3f - ldrb r0, [r1] - cmp r0, #0 - beq _0804CA68 - subs r0, #1 - strb r0, [r1] -_0804CA68: - pop {r0} - bx r0 - .align 2, 0 -_0804CA6C: .4byte 0x000002C1 - - thumb_func_start sub_804CA70 -sub_804CA70: @ 0x0804CA70 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r3, r0, #0 - ldr r0, _0804CABC @ =gStageTime - ldr r0, [r0] - movs r1, #2 - ands r0, r1 - lsrs r6, r0, #1 - ldrb r0, [r3, #0xb] - cmp r0, #0 - beq _0804CACC - movs r2, #0 - movs r0, #0x3e - adds r0, r0, r3 - mov ip, r0 - adds r7, r3, #0 - adds r7, #0x3f - ldr r1, _0804CAC0 @ =gFlags - mov r8, r1 - ldr r5, _0804CAC4 @ =gObjPalette - ldr r4, _0804CAC8 @ =gUnknown_080D88B0 - lsls r3, r6, #5 -_0804CA9E: - adds r1, r2, #0 - adds r1, #0x80 - lsls r1, r1, #1 - adds r1, r1, r5 - lsls r0, r2, #1 - adds r0, r0, r3 - adds r0, r0, r4 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, #1 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0xf - bls _0804CA9E - b _0804CAFA - .align 2, 0 -_0804CABC: .4byte gStageTime -_0804CAC0: .4byte gFlags -_0804CAC4: .4byte gObjPalette -_0804CAC8: .4byte gUnknown_080D88B0 -_0804CACC: - movs r2, #0 - movs r0, #0x3e - adds r0, r0, r3 - mov ip, r0 - adds r7, r3, #0 - adds r7, #0x3f - ldr r1, _0804CB28 @ =gFlags - mov r8, r1 - ldr r4, _0804CB2C @ =gObjPalette - ldr r3, _0804CB30 @ =gUnknown_080D88B0 -_0804CAE0: - adds r1, r2, #0 - adds r1, #0x80 - lsls r1, r1, #1 - adds r1, r1, r4 - lsls r0, r2, #1 - adds r0, r0, r3 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, #1 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0xf - bls _0804CAE0 -_0804CAFA: - mov r1, ip - ldrb r0, [r1] - cmp r0, #0 - beq _0804CB34 - movs r2, #0 - ldr r5, _0804CB2C @ =gObjPalette - ldr r4, _0804CB30 @ =gUnknown_080D88B0 - lsls r3, r6, #5 -_0804CB0A: - adds r1, r2, #0 - adds r1, #0x90 - lsls r1, r1, #1 - adds r1, r1, r5 - lsls r0, r2, #1 - adds r0, r0, r3 - adds r0, r0, r4 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, #1 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0xf - bls _0804CB0A - b _0804CB54 - .align 2, 0 -_0804CB28: .4byte gFlags -_0804CB2C: .4byte gObjPalette -_0804CB30: .4byte gUnknown_080D88B0 -_0804CB34: - movs r2, #0 - ldr r4, _0804CB80 @ =gObjPalette - ldr r3, _0804CB84 @ =gUnknown_080D88B0 -_0804CB3A: - adds r1, r2, #0 - adds r1, #0x90 - lsls r1, r1, #1 - adds r1, r1, r4 - lsls r0, r2, #1 - adds r0, r0, r3 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, #1 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0xf - bls _0804CB3A -_0804CB54: - ldrb r0, [r7] - cmp r0, #0 - beq _0804CB88 - movs r2, #0 - ldr r5, _0804CB80 @ =gObjPalette - ldr r4, _0804CB84 @ =gUnknown_080D88B0 - lsls r3, r6, #5 -_0804CB62: - adds r1, r2, #0 - adds r1, #0xc0 - lsls r1, r1, #1 - adds r1, r1, r5 - lsls r0, r2, #1 - adds r0, r0, r3 - adds r0, r0, r4 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, #1 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0xf - bls _0804CB62 - b _0804CBA8 - .align 2, 0 -_0804CB80: .4byte gObjPalette -_0804CB84: .4byte gUnknown_080D88B0 -_0804CB88: - movs r2, #0 - ldr r4, _0804CBC0 @ =gObjPalette - ldr r3, _0804CBC4 @ =gUnknown_080D88B0 -_0804CB8E: - adds r1, r2, #0 - adds r1, #0xc0 - lsls r1, r1, #1 - adds r1, r1, r4 - lsls r0, r2, #1 - adds r0, r0, r3 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, #1 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0xf - bls _0804CB8E -_0804CBA8: - mov r1, r8 - ldr r0, [r1] - movs r1, #2 - orrs r0, r1 - mov r1, r8 - str r0, [r1] - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804CBC0: .4byte gObjPalette -_0804CBC4: .4byte gUnknown_080D88B0 - - thumb_func_start Task_SuperEggRoboZMain -Task_SuperEggRoboZMain: @ 0x0804CBC8 - push {r4, r5, r6, r7, lr} - ldr r7, _0804CC24 @ =gCurTask - ldr r0, [r7] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r5, r1, r0 - adds r0, r5, #0 - bl sub_804C5B8 - ldr r6, _0804CC28 @ =gPlayer - ldr r0, [r6, #0x20] - movs r1, #0x80 - lsls r1, r1, #0xe - orrs r0, r1 - str r0, [r6, #0x20] - movs r1, #0x14 - ldrsh r0, [r6, r1] - cmp r0, #0 - bne _0804CC1C - ldr r0, [r5, #0x14] - subs r4, r0, #1 - str r4, [r5, #0x14] - cmp r4, #0 - bne _0804CC1C - movs r0, #0x96 - lsls r0, r0, #1 - str r0, [r5, #0x14] - ldr r1, [r7] - ldr r0, _0804CC2C @ =sub_804A9D8 - str r0, [r1, #8] - movs r0, #0x82 - lsls r0, r0, #1 - bl m4aSongNumStart - adds r0, r6, #0 - adds r0, #0x64 - strh r4, [r0] - adds r1, r6, #0 - adds r1, #0x6d - movs r0, #1 - strb r0, [r1] -_0804CC1C: - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804CC24: .4byte gCurTask -_0804CC28: .4byte gPlayer -_0804CC2C: .4byte sub_804A9D8 - - thumb_func_start sub_804CC30 -sub_804CC30: @ 0x0804CC30 - push {r4, lr} - ldr r4, _0804CC78 @ =gCurTask - ldr r0, [r4] - ldrh r0, [r0, #6] - ldr r1, _0804CC7C @ =IWRAM_START + 0x4C - adds r2, r0, r1 - movs r1, #0x80 - lsls r1, r1, #6 - strh r1, [r2] - ldr r1, _0804CC80 @ =IWRAM_START + 0x48 - adds r0, r0, r1 - bl UpdateScreenFade - ldr r0, _0804CC84 @ =gCourseTime - ldr r0, [r0] - ldr r1, _0804CC88 @ =gRingCount - ldrh r1, [r1] - ldr r2, _0804CC8C @ =gSpecialRingCount - ldrb r2, [r2] - bl CreateStageResults - movs r0, #0x90 - bl m4aSongNumStop - ldr r0, _0804CC90 @ =gMPlayInfo_SE3 - ldr r1, _0804CC94 @ =0x0000FFFF - movs r2, #0xff - bl m4aMPlayVolumeControl - ldr r0, [r4] - bl TaskDestroy - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0804CC78: .4byte gCurTask -_0804CC7C: .4byte IWRAM_START + 0x4C -_0804CC80: .4byte IWRAM_START + 0x48 -_0804CC84: .4byte gCourseTime -_0804CC88: .4byte gRingCount -_0804CC8C: .4byte gSpecialRingCount -_0804CC90: .4byte gMPlayInfo_SE3 -_0804CC94: .4byte 0x0000FFFF - - thumb_func_start sub_804CC98 -sub_804CC98: @ 0x0804CC98 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xb] - cmp r0, #0 - beq _0804CCC4 - ldr r1, _0804CCBC @ =gSineTable - lsls r0, r0, #4 - adds r0, r0, r1 - movs r1, #0 - ldrsh r0, [r0, r1] - asrs r0, r0, #7 - movs r3, #0x80 - lsls r3, r3, #2 - adds r0, r0, r3 - ldr r3, _0804CCC0 @ =0x000003FF - adds r1, r3, #0 - ands r0, r1 - b _0804CCC8 - .align 2, 0 -_0804CCBC: .4byte gSineTable -_0804CCC0: .4byte 0x000003FF -_0804CCC4: - movs r0, #0x80 - lsls r0, r0, #2 -_0804CCC8: - strh r0, [r2, #0x10] - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start sub_804CCD0 -sub_804CCD0: @ 0x0804CCD0 - push {r4, r5, lr} - adds r4, r1, #0 - ldr r1, [r0] - movs r5, #0xbe - lsls r5, r5, #8 - adds r2, r1, r5 - ldr r0, [r0, #4] - movs r1, #0xa0 - lsls r1, r1, #6 - adds r3, r0, r1 - ldr r5, _0804CD08 @ =gPlayer - ldr r1, [r5, #0xc] - asrs r0, r1, #8 - cmp r0, r2 - bge _0804CD00 - subs r0, r3, r4 - cmp r1, r0 - blt _0804CD00 - adds r0, r4, r3 - cmp r1, r0 - bgt _0804CD00 - adds r0, r5, #0 - bl sub_800CBA4 -_0804CD00: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_0804CD08: .4byte gPlayer - - thumb_func_start TaskDestructor_SuperEggRoboZMain -TaskDestructor_SuperEggRoboZMain: @ 0x0804CD0C - push {r4, r5, lr} - ldrh r4, [r0, #6] - movs r5, #0xc0 - lsls r5, r5, #0x12 - adds r5, r4, r5 - ldr r0, [r5, #0x44] - bl VramFree - ldr r1, _0804CD44 @ =IWRAM_START + 0x94 - adds r0, r4, r1 - ldr r0, [r0] - bl VramFree - ldr r0, _0804CD48 @ =IWRAM_START + 0xD0 - adds r4, r4, r0 - ldr r0, [r4] - bl VramFree - ldr r0, [r5, #0x58] - bl VramFree - ldr r1, _0804CD4C @ =gActiveBossTask - movs r0, #0 - str r0, [r1] - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_0804CD44: .4byte IWRAM_START + 0x94 -_0804CD48: .4byte IWRAM_START + 0xD0 -_0804CD4C: .4byte gActiveBossTask diff --git a/asm/boss_9.s b/asm/boss_9.s index e481babd8..84b49f159 100644 --- a/asm/boss_9.s +++ b/asm/boss_9.s @@ -146,9 +146,7 @@ gUnknown_080D8F10: .syntax unified .arm -.if 0 -.endif - +.if 01 thumb_func_start CreateTrueArea53Boss CreateTrueArea53Boss: @ 0x0804CEC4 push {r4, r5, r6, r7, lr} @@ -182,7 +180,7 @@ _0804CEF8: movs r0, #0xc0 lsls r0, r0, #0x12 adds r0, r4, r0 - str r0, [sp, #4] + str r0, [sp, #4] @ sp04 = boss ldr r0, _0804D2B8 @ =IWRAM_START + 0x1C adds r2, r4, r0 @ r2 = &boss->unk1C ldr r1, _0804D2BC @ =IWRAM_START + 0x48 @@ -200,12 +198,12 @@ _0804CEF8: str r1, [sp, #0xc] movs r3, #0 movs r0, #0xc - ldr r5, [sp, #4] + ldr r5, [sp, #4] @ r5 = boss strb r0, [r5, #0xc] strb r3, [r5, #0xd] movs r1, #0 movs r0, #1 - mov sb, r0 + mov sb, r0 @ sb = 1 mov r0, sb strh r0, [r5, #0x10] movs r0, #0x50 @@ -981,6 +979,7 @@ _0804D584: .4byte 0x000002CE _0804D588: .4byte 0x00000467 _0804D58C: .4byte 0x000002CD _0804D590: .4byte 0x000002CF +.endif thumb_func_start sub_804D594 sub_804D594: @ 0x0804D594 diff --git a/asm/non_matching/engine/sub_80039E4.inc b/asm/non_matching/engine/sub_80039E4.inc index 8e8c66ae5..4492d8522 100644 --- a/asm/non_matching/engine/sub_80039E4.inc +++ b/asm/non_matching/engine/sub_80039E4.inc @@ -95,7 +95,7 @@ _08003A84: lsls r0, r1 lsrs r0, r0, #0x10 str r0, [sp, #0x10] @ sp10 = bg_affine_pixelcount - ldr r0, _08003BB4 @ =gUnknown_03002794 + ldr r0, _08003BB4 @ =gRefSpriteTables ldr r1, [r0] ldr r2, [sp, #0xc] ldrh r0, [r2, #0xa] @@ -242,7 +242,7 @@ _08003BA4: .4byte gUnknown_03005390 _08003BA8: .4byte gUnknown_03004D10 _08003BAC: .4byte gBgCntRegs _08003BB0: .4byte gDispCnt -_08003BB4: .4byte gUnknown_03002794 +_08003BB4: .4byte gRefSpriteTables _08003BB8: .4byte 0x040000D4 _08003BBC: .4byte 0x80000003 _08003BC0: .4byte gOamShapesSizes @@ -316,15 +316,15 @@ _08003C2C: movs r7, #0x40 str r7, [sp, #0x10] _08003C46: - ldr r0, _08003D14 @ =gUnknown_03002794 + ldr r0, _08003D14 @ =gRefSpriteTables ldr r1, [r0] ldr r2, [sp, #0xc] ldrh r0, [r2, #0xa] - ldr r1, [r1, #8] @ r1 = gUnknown_03002794->oamData + ldr r1, [r1, #8] @ r1 = gRefSpriteTables->oamData lsls r0, r0, #2 adds r0, r0, r1 ldr r0, [r0] - str r0, [sp, #0x1c] @ sp1C = gUnknown_03002794->oamData[s->graphics.anim]; + str r0, [sp, #0x1c] @ sp1C = gRefSpriteTables->oamData[s->graphics.anim]; mov r3, sl @ r3 = dims ldrb r1, [r3, #1] @ r1 = dims->oamIndex lsls r0, r1, #1 @@ -424,7 +424,7 @@ __08003D04: ldrsh r1, [r7, r2] b _08003D3C .align 2, 0 -_08003D14: .4byte gUnknown_03002794 +_08003D14: .4byte gRefSpriteTables _08003D18: .4byte 0x040000D4 _08003D1C: .4byte 0x80000003 _08003D20: .4byte gOamShapesSizes diff --git a/asm/non_matching/engine/sub_8004E14.inc b/asm/non_matching/engine/sub_8004E14.inc new file mode 100644 index 000000000..6876345a8 --- /dev/null +++ b/asm/non_matching/engine/sub_8004E14.inc @@ -0,0 +1,491 @@ +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x40 + str r0, [sp, #0x24] @ sp24 = s + adds r6, r1, #0 @ r6 = transform + ldr r1, [r0, #0xc] + movs r0, #1 + rsbs r0, r0, #0 + cmp r1, r0 + bne _08004E30 + b _080051D8 +_08004E30: + mov sb, r1 @ sb = sprDims + add r2, sp, #0x20 + ldr r1, [sp, #0x24] + ldr r0, [r1, #0x10] + movs r1, #0x1f + ands r0, r1 + strh r0, [r2] @ us->affineIndex = s->unk10 & SPRITE_FLAG_MASK_ROT_SCALE; + ldrh r4, [r2] + lsls r4, r4, #5 + ldr r0, _08005128 @ =gOamBuffer + 0x6 + adds r4, r4, r0 @ r4 = u16 *affine = &gOamBuffer[us->affineIndex * 4 + 3]; + subs r2, #0x18 + str r2, [sp, #0x28] @ sp28 = &us->qDirX + ldrh r0, [r6] + ldr r3, _0800512C @ =gUnknown_03001944 + ldrh r1, [r3] + adds r0, r0, r1 + ldr r2, _08005130 @ =0x000003FF + ands r0, r2 + movs r5, #0x80 + lsls r5, r5, #1 + adds r0, r0, r5 + lsls r0, r0, #1 + ldr r7, _08005134 @ =gSineTable + adds r0, r0, r7 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + ldr r1, [sp, #0x28] + strh r0, [r1] @ us.qDirX = COS_24_8((transform->rotation + gUnknown_03001944) & ONE_CYCLE); + movs r3, #0xa + add r3, sp + mov r8, r3 @ r8 = r3 = &us.qDirY + ldrh r0, [r6] @ r0 = transform->rotation + ldr r5, _0800512C @ =gUnknown_03001944 + ldrh r1, [r5] + adds r0, r0, r1 + ands r0, r2 + lsls r0, r0, #1 + adds r0, r0, r7 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + strh r0, [r3] @ us.qDirY = SIN_24_8((transform->rotation + gUnknown_03001944) & ONE_CYCLE); + add r7, sp, #0xc @ r7 = us->unkC[0] + movs r0, #2 + ldrsh r1, [r6, r0] @ r1 = transform->width + ldr r2, _08005138 @ =gUnknown_030017F0 + ldrh r0, [r2] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r7] @ us->unkC[0] = ((transform->width * gUnknown_030017F0) >> 8) + movs r3, #0xe + add r3, sp + mov sl, r3 + movs r5, #4 + ldrsh r1, [r6, r5] @ r1 = transform->height + ldr r2, _0800513C @ =gUnknown_03005394 + ldrh r0, [r2] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r3] @ us->unkC[1] = ((transform->height * gUnknown_03005394) >> 8); + movs r5, #0x80 + lsls r5, r5, #9 + ldrh r1, [r7] @ r1 = us->unkC[0] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + ldr r3, [sp, #0x28] + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4] + ldrh r1, [r7] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + mov r2, r8 @ r2 = r8 = &us.qDirY + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4, #8] + mov r3, sl @ r3 = &us->unkC[1] + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + mov r2, r8 @ r2 = r8 = &us.qDirY + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + rsbs r1, r1, #0 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4, #0x10] + mov r3, sl @ r3 = &us->unkC[1] + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + ldr r5, [sp, #0x28] + ldrh r1, [r5] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4, #0x18] + movs r1, #2 + ldrsh r0, [r6, r1] @ r0 = transform->width + str r0, [sp, #0x2c] + cmp r0, #0 + bge _08004F48 + movs r2, #2 + ldrsh r0, [r6, r2] + rsbs r0, r0, #0 + ldr r3, _08005138 @ =gUnknown_030017F0 + ldrh r1, [r3] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r7] @ us->unkC[0] = I(-transform->width * gUnknown_030017F0); +_08004F48: + movs r4, #4 + ldrsh r0, [r6, r4] + ldr r5, _0800513C @ =gUnknown_03005394 + ldrh r4, [r5] + ldrh r2, [r6, #4] + mov r1, sp + strh r2, [r1, #0x3c] @ sp3C = (u16)transform->height + cmp r0, #0 + bge _08004F6A + movs r3, #4 + ldrsh r0, [r6, r3] + rsbs r0, r0, #0 + muls r0, r4, r0 + asrs r0, r0, #8 + mov r4, sl @ r4 = sl = &us->unkC[1] + strh r0, [r4] + ldrh r4, [r5] @ r4 = gUnknown_03005394 +_08004F6A: + mov r2, sp @ r2 = &us + ldr r5, [sp, #0x28] + ldrh r1, [r5] @ r1 = us->qDirX + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + ldrh r0, [r7] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r2] @ us.unk0[0] = I(us->unkC[0] * us->qDirX) + mov r0, sp + adds r0, #2 + str r0, [sp, #0x30] @ sp30 = &us.unk0[1] + mov r2, r8 @ r2 = r8 = &us.qDirY + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + rsbs r1, r1, #0 @ r1 = -us.qDirY + ldrh r0, [r7] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + ldr r3, [sp, #0x30] + strh r0, [r3] @ us.unk0[1] = I(-us.qDirY * us->unkC[0]) + mov r5, sp + adds r5, #4 + str r5, [sp, #0x34] @ sp34 = &us.unk0[2] + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + mov r2, sl @ r2 = sl = &us->unkC[1] + ldrh r0, [r2] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r5] @ us.unk0[2] = I(+us.qDirY * us->unkC[1]) + mov r3, sp + adds r3, #6 + str r3, [sp, #0x38] @ sp38 = &us.unk0[3] + ldr r5, [sp, #0x28] + ldrh r1, [r5] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + ldrh r0, [r2] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r3] @ us.unk0[3] = I(+us.qDirX * us.unkC[1]); + add r0, sp, #0x18 + mov r8, r0 @ r8 = &us.unk18[0][0] + ldr r1, _0800512C @ =gUnknown_03001944 + ldrh r0, [r1] + movs r2, #0x80 + lsls r2, r2, #1 + adds r0, r0, r2 + lsls r0, r0, #1 + ldr r3, _08005134 @ =gSineTable + adds r0, r0, r3 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + ldr r5, _08005138 @ =gUnknown_030017F0 + ldrh r1, [r5] + adds r2, r0, #0 + muls r2, r1, r2 + lsls r2, r2, #8 + asrs r2, r2, #0x10 @ r2 = (COS_24_8(gUnknown_03001944) * gUnknown_030017F0) + ldrh r0, [r7] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + ldr r3, _08005140 @ =gUnknown_03005398 + movs r5, #0 + ldrsh r1, [r3, r5] + muls r0, r1, r0 + lsls r0, r0, #8 @ r0 = Q(us.unkC[0] * gUnknown_03005398) + asrs r0, r0, #0x10 @ r0 = (Q(us.unkC[0] * gUnknown_03005398) >> 16) + muls r0, r2, r0 + asrs r0, r0, #8 @ r0 = I((COS_24_8(gUnknown_03001944) * gUnknown_030017F0) * (Q(us.unkC[0] * gUnknown_03005398) >> 16)) + mov r1, r8 + strh r0, [r1] @ us.unk18[0][0] = I(r2 * r0) + movs r2, #0x1a + add r2, sp + mov ip, r2 @ ip = us.unk18[0][1] + ldr r5, _0800512C @ =gUnknown_03001944 + ldrh r0, [r5] + lsls r0, r0, #1 + ldr r1, _08005134 @ =gSineTable + adds r0, r0, r1 + movs r2, #0 + ldrsh r0, [r0, r2] + rsbs r0, r0, #0 + asrs r0, r0, #6 @ r0 = (SIN(-gUnknown_03001944) >> 6) + ldr r5, _08005138 @ =gUnknown_030017F0 + ldrh r1, [r5] + adds r2, r0, #0 + muls r2, r1, r2 + lsls r2, r2, #8 + asrs r2, r2, #0x10 + ldrh r0, [r7] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r7, #0 + ldrsh r1, [r3, r7] + muls r0, r1, r0 + lsls r0, r0, #8 + asrs r0, r0, #0x10 + muls r0, r2, r0 + asrs r0, r0, #8 + mov r1, ip + strh r0, [r1] @ us.unk18[0][1] = + add r5, sp, #0x1c + ldr r2, _0800512C @ =gUnknown_03001944 + ldrh r0, [r2] + lsls r0, r0, #1 + ldr r7, _08005134 @ =gSineTable + adds r0, r0, r7 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + adds r2, r0, #0 @ r2 = SIN_24_8(gUnknown_03001944) + muls r2, r4, r2 @ r2 *= gUnknown_03005394 + lsls r2, r2, #8 @ r2 = Q(+SIN_24_8(gUnknown_03001944) * gUnknown_03005394) + asrs r2, r2, #0x10 + mov r1, sl @ r1 = sl = &us->unkC[1] + ldrh r0, [r1] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r4, #0 + ldrsh r1, [r3, r4] + muls r0, r1, r0 + lsls r0, r0, #8 + asrs r0, r0, #0x10 + muls r0, r2, r0 + asrs r0, r0, #8 + strh r0, [r5] @ us.unk18[1][0] = + mov r4, sp + adds r4, #0x1e + ldr r7, _0800512C @ =gUnknown_03001944 + ldrh r0, [r7] + movs r1, #0x80 + lsls r1, r1, #1 + adds r0, r0, r1 + lsls r0, r0, #1 + ldr r2, _08005134 @ =gSineTable + adds r0, r0, r2 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + ldr r7, _0800513C @ =gUnknown_03005394 + ldrh r1, [r7] + adds r2, r0, #0 + muls r2, r1, r2 + lsls r2, r2, #8 + asrs r2, r2, #0x10 + mov r1, sl @ r1 = sl = &us->unkC[1] + ldrh r0, [r1] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r7, #0 + ldrsh r1, [r3, r7] + muls r0, r1, r0 + lsls r0, r0, #8 + asrs r0, r0, #0x10 + muls r0, r2, r0 + asrs r0, r0, #8 + strh r0, [r4] @ us.unk18[1][1] = + mov r1, r8 @ r1 = r8 = &us.unk18[0][0] + ldrh r0, [r1] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r2, #6 + ldrsh r1, [r6, r2] @ r1 = transform.x + muls r1, r0, r1 @ r1 = transform.x * us.unk18[0][0] + mov r3, ip + ldrh r0, [r3] @ r0 = us.unk18[0][1] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r7, #8 + ldrsh r2, [r6, r7] @ r2 = transform.y + muls r0, r2, r0 @ r0 = transform.y * us.unk18[0][1] + adds r1, r1, r0 @ r1 = r1 + r0 + ldr r0, _08005144 @ =gUnknown_0300194C + movs r2, #0 + ldrsh r0, [r0, r2] + lsls r0, r0, #8 + adds r1, r1, r0 @ r1 += Q(gUnknown_0300194C) + asrs r1, r1, #8 @ r1 = I(r1) + str r1, [sp, #0x10] @ us.posX = I(transform.x * us.unk18[0][0] + transform.y * us.unk18[0][1] + Q(gUnknown_0300194C)) + ldrh r0, [r5] @ r0 = us.unk18[1][0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r3, #6 + ldrsh r1, [r6, r3] + muls r1, r0, r1 @ r1 = transform.x * us.unk18[1][0] + ldrh r0, [r4] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 @ r0 = us.unk18[1][1] + movs r4, #8 + ldrsh r2, [r6, r4] @ r2 = transform.y + muls r0, r2, r0 @ r0 = transform.y * us.unk18[1][1] + adds r1, r1, r0 @ r1 = r1 + r0 + ldr r0, _08005148 @ =gUnknown_03002820 + movs r5, #0 + ldrsh r0, [r0, r5] + lsls r0, r0, #8 + adds r1, r1, r0 + asrs r1, r1, #8 + str r1, [sp, #0x14] @ us.posY = I(transform.x * us.unk18[1][0] + transform.y * us.unk18[1][1] + Q(gUnknown_0300194C)); + ldr r6, [sp, #0x30] @ r6 = &us.unk0[1] + ldr r7, [sp, #0x34] @ r7 = &us.unk0[2] + ldr r0, [sp, #0x38] @ r0 = &us.unk0[3] + mov r8, r0 @ r8 = r0 + ldr r1, [sp, #0x2c] @ r1 = transform->width + cmp r1, #0 + ble _0800514C + mov r2, sb @ r2 = sb = sprDims + ldrh r4, [r2, #8] @ r4 = offsetX + ldrh r2, [r2, #4] @ r2 = width + b _0800515A + .align 2, 0 +_08005128: .4byte gOamBuffer + 0x6 +_0800512C: .4byte gUnknown_03001944 +_08005130: .4byte 0x000003FF +_08005134: .4byte gSineTable +_08005138: .4byte gUnknown_030017F0 +_0800513C: .4byte gUnknown_03005394 +_08005140: .4byte gUnknown_03005398 +_08005144: .4byte gUnknown_0300194C +_08005148: .4byte gUnknown_03002820 +_0800514C: + mov r3, sb @ r3 = sb = sprDims + ldrh r1, [r3, #4] + ldrh r0, [r3, #8] + subs r0, r1, r0 + lsls r0, r0, #0x10 + lsrs r4, r0, #0x10 @ r4 = offsetX + adds r2, r1, #0 @ r2 = width +_0800515A: + mov r5, sp + ldrh r5, [r5, #0x3c] @ r5 = (u16)transform->height + lsls r0, r5, #0x10 + cmp r0, #0 + ble _0800516C + mov r0, sb @ r0 = sb = sprDims + ldrh r3, [r0, #0xa] @ r3 = offsetY = sprDims->offsetY + ldrh r5, [r0, #6] @ r5 = height = sprDims->height + b _0800517A +_0800516C: + mov r3, sb @ r3 = sb = sprDims + ldrh r1, [r3, #6] + ldrh r0, [r3, #0xa] + subs r0, r1, r0 + lsls r0, r0, #0x10 + lsrs r3, r0, #0x10 @ r3 = offsetY = sprDims->height - sprDims->offsetY + adds r5, r1, #0 @ r5 = height = sprDims->height +_0800517A: + mov r0, sp @ r0 = sp = us + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 @ r0 = us.unk0[0] + lsls r4, r4, #0x10 + asrs r4, r4, #0x10 @ r4 = offsetX + lsrs r2, r2, #1 @ r2 = halfWidth = (width/2) + subs r4, r4, r2 @ r4 = offsetX -= halfWidth + adds r1, r0, #0 + muls r1, r4, r1 @ r1 = (offsetX - halfWidth) * us.unk0[0] + ldrh r0, [r6] @ r0 = us.unk0[1] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + lsls r3, r3, #0x10 + asrs r3, r3, #0x10 + lsrs r5, r5, #1 @ r5 = halfHeight + subs r3, r3, r5 @ r3 = (offsetY - halfHeight) + muls r0, r3, r0 @ r0 = (offsetY - halfHeight) * us.unk0[1] + adds r1, r1, r0 @ r1 += r0 + lsls r2, r2, #8 + adds r1, r1, r2 @ r1 += Q(halfWidth) + asrs r1, r1, #8 + ldr r0, [sp, #0x10] + subs r0, r0, r1 + str r0, [sp, #0x10] @ us.posX -= I(r1) + ldrh r0, [r7] @ r0 = us.unk0[2] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + adds r1, r0, #0 + muls r1, r4, r1 @ r1 = offsetX * us.unk0[2] + mov r4, r8 + ldrh r0, [r4] @ r0 = us.unk0[3] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r3, r0 @ r0 = r3 * us.unk0[3] + adds r1, r1, r0 @ r1 += r0 + lsls r5, r5, #8 + adds r1, r1, r5 @ r1 += Q(halfHeight) + asrs r1, r1, #8 + ldr r0, [sp, #0x14] + subs r0, r0, r1 + str r0, [sp, #0x14] @ us.posY -= I(r1); + ldr r0, [sp, #0x10] + ldr r5, [sp, #0x24] @ r5 = sprite + strh r0, [r5, #0x16] @ sprite.x = us.posX + ldr r0, [sp, #0x14] + strh r0, [r5, #0x18] @ sprite.y = us.posY +_080051D8: + add sp, #0x40 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 + +.syntax divided diff --git a/asm/non_matching/engine/unused_transform.inc b/asm/non_matching/engine/unused_transform.inc new file mode 100644 index 000000000..9f24e8cb5 --- /dev/null +++ b/asm/non_matching/engine/unused_transform.inc @@ -0,0 +1,430 @@ +.syntax unified +.text +@ VERY similar to sub_8004860 and sub_8004E14 + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x3c + str r0, [sp, #0x24] + adds r7, r1, #0 + ldr r1, [r0, #0xc] + movs r0, #1 + rsbs r0, r0, #0 + cmp r1, r0 + bne _08004AD8 + b _08004E04 +_08004AD8: + mov sb, r1 + add r2, sp, #0x20 + ldr r1, [sp, #0x24] + ldr r0, [r1, #0x10] + movs r1, #0x1f + ands r0, r1 + strh r0, [r2] + ldrh r4, [r2] + lsls r4, r4, #5 + ldr r0, _08004D58 @ =gOamBuffer + 0x6 + adds r4, r4, r0 + subs r2, #0x18 + str r2, [sp, #0x28] + ldrh r0, [r7] + ldr r3, _08004D5C @ =gUnknown_03001944 + ldrh r1, [r3] + adds r0, r0, r1 + ldr r2, _08004D60 @ =0x000003FF + ands r0, r2 + movs r5, #0x80 + lsls r5, r5, #1 + adds r0, r0, r5 + lsls r0, r0, #1 + ldr r6, _08004D64 @ =gSineTable + adds r0, r0, r6 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + ldr r1, [sp, #0x28] + strh r0, [r1] + movs r3, #0xa + add r3, sp + mov r8, r3 + ldrh r0, [r7] + ldr r5, _08004D5C @ =gUnknown_03001944 + ldrh r1, [r5] + adds r0, r0, r1 + ands r0, r2 + lsls r0, r0, #1 + adds r0, r0, r6 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + strh r0, [r3] + add r6, sp, #0xc + movs r0, #2 + ldrsh r1, [r7, r0] + ldr r2, _08004D68 @ =gUnknown_030017F0 + ldrh r0, [r2] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r6] + movs r3, #0xe + add r3, sp + mov sl, r3 + movs r5, #4 + ldrsh r1, [r7, r5] + ldr r2, _08004D6C @ =gUnknown_03005394 + ldrh r0, [r2] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r3] + movs r5, #0x80 + lsls r5, r5, #9 + ldrh r1, [r6] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + ldr r3, [sp, #0x28] + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4] + ldrh r1, [r6] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + mov r2, r8 + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4, #8] + mov r3, sl + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + mov r2, r8 + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + rsbs r1, r1, #0 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4, #0x10] + mov r3, sl + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + adds r0, r5, #0 + bl Div + ldr r5, [sp, #0x28] + ldrh r1, [r5] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r4, #0x18] + movs r1, #2 + ldrsh r0, [r7, r1] + str r0, [sp, #0x2c] + cmp r0, #0 + bge _08004BF0 + movs r2, #2 + ldrsh r0, [r7, r2] + rsbs r0, r0, #0 + ldr r3, _08004D68 @ =gUnknown_030017F0 + ldrh r1, [r3] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r6] +_08004BF0: + movs r4, #4 + ldrsh r0, [r7, r4] + ldr r5, _08004D6C @ =gUnknown_03005394 + ldrh r3, [r5] + ldrh r2, [r7, #4] + mov r1, sp + strh r2, [r1, #0x34] + cmp r0, #0 + bge _08004C14 + movs r4, #4 + ldrsh r0, [r7, r4] + rsbs r0, r0, #0 + muls r0, r3, r0 + asrs r0, r0, #8 + mov r5, sl + strh r0, [r5] + ldr r0, _08004D6C @ =gUnknown_03005394 + ldrh r3, [r0] +_08004C14: + mov r2, sp + ldr r4, [sp, #0x28] + ldrh r1, [r4] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + ldrh r0, [r6] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r2] + mov r5, sp + adds r5, #2 + str r5, [sp, #0x30] + mov r0, r8 + ldrh r1, [r0] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + rsbs r1, r1, #0 + ldrh r0, [r6] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r5] + add r1, sp, #4 + mov ip, r1 + mov r2, r8 + ldrh r1, [r2] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + mov r4, sl + ldrh r0, [r4] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + mov r5, ip + strh r0, [r5] + mov r6, sp + adds r6, #6 + str r6, [sp, #0x38] + ldr r0, [sp, #0x28] + ldrh r1, [r0] + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + ldrh r0, [r4] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r6] + add r5, sp, #0x18 + ldr r1, _08004D5C @ =gUnknown_03001944 + ldrh r0, [r1] + movs r2, #0x80 + lsls r2, r2, #1 + adds r0, r0, r2 + lsls r0, r0, #1 + ldr r4, _08004D64 @ =gSineTable + adds r0, r0, r4 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + ldr r6, _08004D68 @ =gUnknown_030017F0 + ldrh r1, [r6] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r5] + mov r2, sp + adds r2, #0x1a + ldr r1, _08004D5C @ =gUnknown_03001944 + ldrh r0, [r1] + lsls r0, r0, #1 + adds r0, r0, r4 + movs r4, #0 + ldrsh r0, [r0, r4] + rsbs r0, r0, #0 + asrs r0, r0, #6 + ldrh r1, [r6] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r2] + add r4, sp, #0x1c + ldr r6, _08004D5C @ =gUnknown_03001944 + ldrh r0, [r6] + lsls r0, r0, #1 + ldr r1, _08004D64 @ =gSineTable + adds r0, r0, r1 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + muls r0, r3, r0 + asrs r0, r0, #8 + strh r0, [r4] + mov r3, sp + adds r3, #0x1e + ldrh r0, [r6] + movs r6, #0x80 + lsls r6, r6, #1 + adds r0, r0, r6 + lsls r0, r0, #1 + adds r0, r0, r1 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + ldr r6, _08004D6C @ =gUnknown_03005394 + ldrh r1, [r6] + muls r0, r1, r0 + asrs r0, r0, #8 + strh r0, [r3] + ldrh r0, [r5] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r5, #6 + ldrsh r1, [r7, r5] + muls r1, r0, r1 + ldrh r0, [r2] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r6, #8 + ldrsh r2, [r7, r6] + muls r0, r2, r0 + adds r1, r1, r0 + ldr r0, _08004D70 @ =gUnknown_0300194C + movs r2, #0 + ldrsh r0, [r0, r2] + lsls r0, r0, #8 + adds r1, r1, r0 + asrs r1, r1, #8 + str r1, [sp, #0x10] + ldrh r0, [r4] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r4, #6 + ldrsh r1, [r7, r4] + muls r1, r0, r1 + ldrh r0, [r3] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + movs r5, #8 + ldrsh r2, [r7, r5] + muls r0, r2, r0 + adds r1, r1, r0 + ldr r0, _08004D74 @ =gUnknown_03002820 + movs r6, #0 + ldrsh r0, [r0, r6] + lsls r0, r0, #8 + adds r1, r1, r0 + asrs r1, r1, #8 + str r1, [sp, #0x14] + ldr r7, [sp, #0x30] + mov r8, ip + ldr r6, [sp, #0x38] + ldr r0, [sp, #0x2c] + cmp r0, #0 + ble _08004D78 + mov r1, sb + ldrh r4, [r1, #8] + ldrh r2, [r1, #4] + b _08004D86 + .align 2, 0 +_08004D58: .4byte gOamBuffer + 0x6 +_08004D5C: .4byte gUnknown_03001944 +_08004D60: .4byte 0x000003FF +_08004D64: .4byte gSineTable +_08004D68: .4byte gUnknown_030017F0 +_08004D6C: .4byte gUnknown_03005394 +_08004D70: .4byte gUnknown_0300194C +_08004D74: .4byte gUnknown_03002820 +_08004D78: + mov r2, sb + ldrh r1, [r2, #4] + ldrh r0, [r2, #8] + subs r0, r1, r0 + lsls r0, r0, #0x10 + lsrs r4, r0, #0x10 + adds r2, r1, #0 +_08004D86: + mov r3, sp + ldrh r3, [r3, #0x34] + lsls r0, r3, #0x10 + cmp r0, #0 + ble _08004D98 + mov r5, sb + ldrh r3, [r5, #0xa] + ldrh r5, [r5, #6] + b _08004DA6 +_08004D98: + mov r0, sb + ldrh r1, [r0, #6] + ldrh r0, [r0, #0xa] + subs r0, r1, r0 + lsls r0, r0, #0x10 + lsrs r3, r0, #0x10 + adds r5, r1, #0 +_08004DA6: + mov r0, sp + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + lsls r4, r4, #0x10 + asrs r4, r4, #0x10 + lsrs r2, r2, #1 + subs r4, r4, r2 + adds r1, r0, #0 + muls r1, r4, r1 + ldrh r0, [r7] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + lsls r3, r3, #0x10 + asrs r3, r3, #0x10 + lsrs r5, r5, #1 + subs r3, r3, r5 + muls r0, r3, r0 + adds r1, r1, r0 + lsls r2, r2, #8 + adds r1, r1, r2 + asrs r1, r1, #8 + ldr r0, [sp, #0x10] + subs r0, r0, r1 + str r0, [sp, #0x10] + mov r1, r8 + ldrh r0, [r1] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + adds r1, r0, #0 + muls r1, r4, r1 + ldrh r0, [r6] + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + muls r0, r3, r0 + adds r1, r1, r0 + lsls r5, r5, #8 + adds r1, r1, r5 + asrs r1, r1, #8 + ldr r0, [sp, #0x14] + subs r0, r0, r1 + str r0, [sp, #0x14] + ldr r0, [sp, #0x10] + ldr r2, [sp, #0x24] + strh r0, [r2, #0x16] + ldr r0, [sp, #0x14] + strh r0, [r2, #0x18] +_08004E04: + add sp, #0x3c + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 + +.syntax divided diff --git a/asm/non_matching/game/bosses/boss_8__Task_804AB24.inc b/asm/non_matching/game/bosses/boss_8__Task_804AB24.inc new file mode 100644 index 000000000..7e3918b8e --- /dev/null +++ b/asm/non_matching/game/bosses/boss_8__Task_804AB24.inc @@ -0,0 +1,284 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x14 + ldr r0, _0804AC44 @ =gCurTask + ldr r0, [r0] + ldrh r4, [r0, #6] + movs r0, #0xc0 + lsls r0, r0, #0x12 + adds r7, r4, r0 @ r7 = boss + adds r0, #0x48 + adds r6, r4, r0 + adds r0, r7, #0 + bl sub_804CC98 + adds r0, r7, #0 + bl sub_804CA08 + adds r0, r7, #0 + bl sub_804AE40 + ldr r5, _0804AC48 @ =gUnknown_080D8890 + ldr r1, _0804AC4C @ =IWRAM_START + 0x3C + adds r0, r4, r1 + ldrb r0, [r0] + lsls r0, r0, #2 + adds r0, r0, r5 + ldr r2, [r0] + adds r0, r7, #0 + movs r1, #0 + bl _call_via_r2 + ldr r2, _0804AC50 @ =IWRAM_START + 0x3D + adds r4, r4, r2 + ldrb r0, [r4] + lsls r0, r0, #2 + adds r0, r0, r5 + ldr r2, [r0] + adds r0, r7, #0 + movs r1, #1 + bl _call_via_r2 + adds r0, r7, #0 + bl sub_804C5B8 + adds r0, r7, #0 + bl sub_804C830 + adds r0, r7, #0 + bl sub_804CA70 + ldr r4, _0804AC54 @ =gPlayer + ldr r0, [r4, #0xc] + asrs r0, r0, #8 + cmp r0, #0xb8 + ble _0804ABC0 + ldr r0, [r4, #8] + asrs r0, r0, #8 + ldr r1, _0804AC58 @ =0x0000A819 + cmp r0, r1 + ble _0804ABC0 + adds r0, r4, #0 + bl sub_800CBA4 + movs r1, #0x10 + ldrsh r0, [r4, r1] + cmp r0, #0 + ble _0804ABB4 + rsbs r0, r0, #0 + strh r0, [r4, #0x10] +_0804ABB4: + movs r1, #0x14 + ldrsh r0, [r4, r1] + cmp r0, #0 + ble _0804ABC0 + rsbs r0, r0, #0 + strh r0, [r4, #0x14] +_0804ABC0: + ldr r4, _0804AC54 @ =gPlayer + ldr r0, [r4, #8] + asrs r0, r0, #8 + ldr r1, _0804AC5C @ =0x0000A84F + cmp r0, r1 + ble _0804ABEA + adds r0, r4, #0 + bl sub_800CBA4 + movs r1, #0x10 + ldrsh r0, [r4, r1] + cmp r0, #0 + ble _0804ABDE + rsbs r0, r0, #0 + strh r0, [r4, #0x10] +_0804ABDE: + movs r1, #0x14 + ldrsh r0, [r4, r1] + cmp r0, #0 + ble _0804ABEA + rsbs r0, r0, #0 + strh r0, [r4, #0x14] +_0804ABEA: + ldrb r4, [r7, #8] + cmp r4, #0 + beq _0804ABF2 + b _0804AD54 +_0804ABF2: + ldr r2, _0804AC60 @ =gFlags + ldr r0, [r2] + movs r1, #5 + rsbs r1, r1, #0 + ands r0, r1 + str r0, [r2] + ldr r0, _0804AC44 @ =gCurTask + ldr r1, [r0] + ldr r0, _0804AC64 @ =Task_804AD68 + str r0, [r1, #8] + movs r0, #0xff + str r0, [r7, #0x14] + bl Player_DisableInputAndBossTimer_FinalBoss + ldr r2, _0804AC54 @ =gPlayer + ldr r1, [r2, #0x20] + movs r0, #0x80 + lsls r0, r0, #0xe + orrs r1, r0 + str r1, [r2, #0x20] + adds r0, r2, #0 + adds r0, #0x5c + strh r4, [r0] + adds r0, #2 + strh r4, [r0] + movs r0, #0xa + ands r0, r1 + cmp r0, #0 + beq _0804AC68 + adds r1, r2, #0 + adds r1, #0x64 + movs r0, #0x32 + strh r0, [r1] + movs r0, #0xfe + lsls r0, r0, #8 + strh r0, [r2, #0x10] + strh r4, [r2, #0x12] + adds r1, #9 + movs r0, #5 + strb r0, [r1] + b _0804AC6E + .align 2, 0 +_0804AC44: .4byte gCurTask +_0804AC48: .4byte gUnknown_080D8890 +_0804AC4C: .4byte IWRAM_START + 0x3C +_0804AC50: .4byte IWRAM_START + 0x3D +_0804AC54: .4byte gPlayer +_0804AC58: .4byte 0x0000A819 +_0804AC5C: .4byte 0x0000A84F +_0804AC60: .4byte gFlags +_0804AC64: .4byte Task_804AD68 +_0804AC68: + strh r0, [r2, #0x14] + strh r0, [r2, #0x10] + strh r0, [r2, #0x12] +_0804AC6E: + movs r1, #0 + strh r1, [r6] + strh r1, [r6, #4] + movs r0, #1 + strh r0, [r6, #2] + movs r0, #0x10 + strh r0, [r6, #6] + ldr r0, _0804AD2C @ =0x00003FBF + strh r0, [r6, #8] + strh r1, [r6, #0xa] + movs r6, #0 @ r6 = i = 0 + adds r0, r7, #0 @ r0 = r7 = boss + adds r0, #0x18 + str r0, [sp] @ sp00 = &boss->qUnk18[0][0] + adds r1, r7, #0 + adds r1, #0x28 + str r1, [sp, #8] @ sp08 = &boss->qUnk28[0] + adds r2, r7, #0 + adds r2, #0x1c + str r2, [sp, #4] @ sp04 = &boss->qUnk18[0][1] + adds r0, #0x1c + str r0, [sp, #0xc] @ sp08 = &boss->qUnk34[0][0] + adds r1, #0xe + str r1, [sp, #0x10] @ sp08 = &boss->qUnk34[0][1] + movs r2, #0x3c + adds r2, r2, r7 + mov sl, r2 @ sl = &boss->unk3C[0] + movs r0, #0x30 + adds r0, r0, r7 + mov sb, r0 @ sb = &boss->qUnk30[0] + ldr r1, _0804AD30 @ =gSineTable + mov r8, r1 @ r8 = r1 = gSineTable + movs r2, #2 + mov ip, r2 @ ip = r2 = 2 +_0804ACB2: + lsls r2, r6, #3 @ r2 = i * 8 + ldr r0, [sp] + adds r3, r0, r2 @ r3 = &boss->qUnk18[i][0] + lsls r5, r6, #1 @ r5 = i * 2 + ldr r1, [sp, #8] + adds r4, r1, r5 @ r4 = &boss->qUnk28[i] + ldrh r0, [r4] + movs r1, #0x80 + lsls r1, r1, #1 + adds r0, r0, r1 + lsls r0, r0, #1 + add r0, r8 + movs r1, #0 + ldrsh r0, [r0, r1] + lsls r1, r0, #4 + subs r1, r1, r0 + asrs r1, r1, #6 + ldr r0, [r3] + adds r0, r0, r1 + str r0, [r3] + ldr r0, [sp, #4] + adds r2, r0, r2 + ldrh r0, [r4] + lsls r0, r0, #1 + add r0, r8 + movs r1, #0 + ldrsh r0, [r0, r1] + lsls r1, r0, #4 + subs r1, r1, r0 + asrs r1, r1, #6 + ldr r0, [r2] + adds r0, r0, r1 + str r0, [r2] + lsls r1, r6, #2 @ r1 = i * 4 + ldr r2, [sp, #0xc] + adds r0, r2, r1 + ldr r2, _0804AD34 @ =0xFFFFFE80 + strh r2, [r0] @ boss->qUnk34[i][0] = -Q(1.5); + ldr r0, [sp, #0x10] + adds r1, r0, r1 + movs r0, #0xfd + lsls r0, r0, #8 + strh r0, [r1] @ boss->qUnk34[i][1] = -Q(3); + mov r2, sl @ r2 = sl = &boss->unk3C[0] + adds r1, r2, r6 + movs r0, #7 + strb r0, [r1] + add r5, sb + movs r0, #0x3c + strh r0, [r5] + lsls r0, r6, #4 + subs r0, r0, r6 + lsls r0, r0, #2 + adds r0, #0x90 + adds r1, r7, r0 + cmp r6, #0 + beq _0804AD38 + movs r0, #0xb0 + lsls r0, r0, #2 + b _0804AD3A + .align 2, 0 +_0804AD2C: .4byte 0x00003FBF +_0804AD30: .4byte gSineTable +_0804AD34: .4byte 0xFFFFFE80 +_0804AD38: + ldr r0, _0804AD64 @ =0x000002BF +_0804AD3A: + strh r0, [r1, #0xa] + adds r0, r1, #0 + adds r0, #0x20 + mov r2, ip + strb r2, [r0] + adds r1, #0x21 + movs r0, #0xff + strb r0, [r1] + adds r0, r6, #1 + lsls r0, r0, #0x18 + lsrs r6, r0, #0x18 + cmp r6, #1 + bls _0804ACB2 +_0804AD54: + add sp, #0x14 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 +_0804AD64: .4byte 0x000002BF + +.syntax divided diff --git a/asm/non_matching/game/bosses/boss_8__sub_804AE40.inc b/asm/non_matching/game/bosses/boss_8__sub_804AE40.inc new file mode 100644 index 000000000..921fb81e1 --- /dev/null +++ b/asm/non_matching/game/bosses/boss_8__sub_804AE40.inc @@ -0,0 +1,335 @@ +.include "asm/macros.inc" +.include "constants/constants.inc" + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #8 + adds r5, r0, #0 @ r5 = boss + ldr r0, _0804AE94 @ =gPlayer + ldr r0, [r0, #0x20] + movs r1, #0x80 + ands r0, r1 + cmp r0, #0 + beq _0804AE7A + ldrh r1, [r5, #0xe] + cmp r1, #0 + bne _0804AE76 + ldr r0, _0804AE98 @ =gBldRegs + strh r1, [r0, #4] + adds r0, r5, #0 + adds r0, #0x4c + strh r1, [r0] + ldr r2, _0804AE9C @ =gFlags + ldr r0, [r2] + movs r1, #5 + rsbs r1, r1, #0 + ands r0, r1 + str r0, [r2] +_0804AE76: + movs r0, #2 + strh r0, [r5, #0xe] +_0804AE7A: + ldrh r0, [r5, #0xe] + cmp r0, #0 + beq _0804AEA0 + subs r0, #1 + strh r0, [r5, #0xe] + lsls r0, r0, #0x10 + cmp r0, #0 + beq _0804AE8C + b _0804B0CE +_0804AE8C: + movs r0, #0x78 + strb r0, [r5, #0x12] + b _0804B0CE + .align 2, 0 +_0804AE94: .4byte gPlayer +_0804AE98: .4byte gBldRegs +_0804AE9C: .4byte gFlags +_0804AEA0: + ldrb r0, [r5, #0xb] + cmp r0, #0 + beq _0804AED4 + ldrb r0, [r5, #0x12] + cmp r0, #0 + beq _0804AEC2 + movs r0, #0x78 + strb r0, [r5, #0x12] + adds r1, r5, #0 + adds r1, #0x4c + movs r0, #0x80 + lsls r0, r0, #6 + strh r0, [r1] + adds r0, r5, #0 + adds r0, #0x48 + bl UpdateScreenFade +_0804AEC2: + ldr r0, _0804AED0 @ =gFlags + ldr r1, [r0] + movs r2, #5 + rsbs r2, r2, #0 + ands r1, r2 + str r1, [r0] + b _0804B0CE + .align 2, 0 +_0804AED0: .4byte gFlags +_0804AED4: + ldrb r0, [r5, #0x12] + subs r4, r0, #1 + strb r4, [r5, #0x12] + movs r0, #0xff + mov sb, r0 @ sb = r0 = 0xFF + lsls r0, r4, #0x18 + cmp r0, #0 + bne _0804AF34 + ldr r2, _0804AF2C @ =gFlags + ldr r0, [r2] + movs r1, #5 + rsbs r1, r1, #0 + ands r0, r1 + str r0, [r2] + adds r1, r5, #0 + adds r1, #0x4c + movs r0, #0x80 + lsls r0, r0, #6 + strh r0, [r1] + adds r0, r5, #0 + adds r0, #0x48 + bl UpdateScreenFade + ldrb r0, [r5, #8] + movs r2, #0xb4 + lsls r2, r2, #1 + adds r1, r2, #0 + cmp r0, #4 + bhi _0804AF10 + movs r1, #0x8c +_0804AF10: + strh r1, [r5, #0xe] + adds r1, r5, #0 + adds r1, #0x54 + ldr r0, _0804AF30 @ =0x000002C1 + strh r0, [r1, #0xa] + adds r1, #0x20 + movs r0, #0 + strb r0, [r1] + adds r1, #1 + ldrb r0, [r1] + mov r6, sb + orrs r0, r6 + strb r0, [r1] + b _0804B0CE + .align 2, 0 +_0804AF2C: .4byte gFlags +_0804AF30: .4byte 0x000002C1 +_0804AF34: + ldr r0, [r5] + movs r7, #0xbe + lsls r7, r7, #8 + adds r0, r0, r7 + asrs r0, r0, #8 + mov r8, r0 + ldr r0, _0804AFF4 @ =gSineTable + mov sl, r0 @ sl = gSineTable + ldrh r1, [r5, #0x10] + movs r2, #0x80 + lsls r2, r2, #1 + adds r0, r1, r2 + lsls r0, r0, #1 + add r0, sl + movs r6, #0 + ldrsh r0, [r0, r6] @ r0 = COS(boss->unk10) + movs r3, #0xb + muls r0, r3, r0 + asrs r0, r0, #0xe + add r8, r0 + ldr r2, _0804AFF8 @ =gCamera + ldr r0, [r2] + mov r7, r8 + subs r7, r7, r0 + mov r8, r7 @ r8 -= gCamera.x; + ldr r0, [r5, #4] + movs r6, #0xa0 + lsls r6, r6, #6 + adds r0, r0, r6 + asrs r6, r0, #8 + lsls r1, r1, #1 + add r1, sl + movs r7, #0 + ldrsh r0, [r1, r7] + muls r0, r3, r0 + asrs r0, r0, #0xe + adds r6, r6, r0 + ldr r0, [r2, #4] + subs r6, r6, r0 + lsls r0, r4, #0x18 + lsrs r0, r0, #0x18 + cmp r0, #0x5a + bls _0804B008 + movs r0, #0 + bl InitHBlankBgOffsets + mov r0, r8 @ r0 = r8 + lsls r3, r0, #0x10 + asrs r3, r3, #0x10 + lsls r0, r6, #0x10 + asrs r0, r0, #0x10 + str r0, [sp] + ldr r4, _0804AFFC @ =gPseudoRandom + ldr r1, [r4] + ldr r0, _0804B000 @ =0x00196225 + adds r2, r1, #0 + muls r2, r0, r2 + ldr r1, _0804B004 @ =0x3C6EF35F + adds r2, r2, r1 + str r2, [r4] + ldrb r0, [r5, #0x12] + subs r0, #0x5a + lsls r0, r0, #3 + movs r1, #0xff + ands r0, r1 + lsls r0, r0, #1 + add r0, sl + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x18 + movs r1, #7 + ands r2, r1 + adds r0, r0, r2 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + str r0, [sp, #4] + movs r0, #0 + movs r1, #0 + movs r2, #0xa0 + bl sub_80075D0 + ldrb r1, [r5, #0x12] + subs r1, #0x5a + lsls r0, r1, #4 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r0, r0, r1 + adds r1, r5, #0 + adds r1, #0x4c + strh r0, [r1] + adds r0, r5, #0 + adds r0, #0x48 + bl UpdateScreenFade + b _0804B0CE + .align 2, 0 +_0804AFF4: .4byte gSineTable +_0804AFF8: .4byte gCamera +_0804AFFC: .4byte gPseudoRandom +_0804B000: .4byte 0x00196225 +_0804B004: .4byte 0x3C6EF35F +_0804B008: + cmp r0, #0x5a + bne _0804B02A + adds r1, r5, #0 + adds r1, #0x54 + ldr r0, _0804B060 @ =0x000002C1 + strh r0, [r1, #0xa] + adds r1, #0x20 + movs r0, #1 + strb r0, [r1] + adds r1, #1 + ldrb r0, [r1] + mov r2, sb + orrs r0, r2 + strb r0, [r1] + ldr r0, _0804B064 @ =0x00000105 + bl m4aSongNumStart +_0804B02A: + ldrb r0, [r5, #0x12] + lsls r3, r0, #0x18 + lsrs r7, r3, #0x18 + cmp r7, #0x45 + bhi _0804B074 + ldr r2, _0804B068 @ =gPseudoRandom + ldr r1, [r2] + ldr r0, _0804B06C @ =0x00196225 + muls r0, r1, r0 + ldr r1, _0804B070 @ =0x3C6EF35F + adds r0, r0, r1 + str r0, [r2] @ PseudoRandom32() + lsrs r2, r3, #0x19 + movs r1, #7 + ands r0, r1 + adds r0, #8 + adds r4, r2, r0 @ r4 = ((PseudoRandom32() % 8u) + 8) + (boss->unk12 / 2); + cmp r7, #0x3c + bls _0804B096 + adds r1, r4, #0 + subs r1, #0xa + lsls r1, r1, #8 + adds r0, r5, #0 + bl sub_804CCD0 + b _0804B096 + .align 2, 0 +_0804B060: .4byte 0x000002C1 +_0804B064: .4byte 0x00000105 +_0804B068: .4byte gPseudoRandom +_0804B06C: .4byte 0x00196225 +_0804B070: .4byte 0x3C6EF35F +_0804B074: + ldr r2, _0804B0E0 @ =gPseudoRandom + ldr r1, [r2] + ldr r0, _0804B0E4 @ =0x00196225 + muls r1, r0, r1 + ldr r7, _0804B0E8 @ =0x3C6EF35F + adds r1, r1, r7 + str r1, [r2] + ldrb r2, [r5, #0x12] + movs r0, #0x74 + subs r0, r0, r2 + asrs r0, r0, #2 + movs r2, #7 + ands r1, r2 + adds r1, #0x1e + adds r0, r0, r1 + lsls r0, r0, #0x10 + lsrs r4, r0, #0x10 +_0804B096: + ldrh r0, [r5, #0x10] + mov r1, r8 + lsls r3, r1, #0x10 + asrs r3, r3, #0x10 + adds r1, r6, #1 + lsls r1, r1, #0x10 + asrs r1, r1, #0x10 + str r1, [sp] + movs r1, #0x20 + str r1, [sp, #4] + adds r1, r4, #0 + movs r2, #6 + bl sub_802E784 + ldrb r1, [r5, #0x12] + movs r0, #0x5b + muls r1, r0, r1 + movs r2, #0x80 + lsls r2, r2, #6 + adds r0, r2, #0 + subs r0, r0, r1 + adds r1, r5, #0 + adds r1, #0x4c + strh r0, [r1] + adds r0, r5, #0 + adds r0, #0x48 + bl UpdateScreenFade +_0804B0CE: + add sp, #8 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 +_0804B0E0: .4byte gPseudoRandom +_0804B0E4: .4byte 0x00196225 +_0804B0E8: .4byte 0x3C6EF35F +.syntax divided diff --git a/asm/non_matching/game/bosses/boss_8__sub_804B2EC.inc b/asm/non_matching/game/bosses/boss_8__sub_804B2EC.inc new file mode 100644 index 000000000..a0a2a03f2 --- /dev/null +++ b/asm/non_matching/game/bosses/boss_8__sub_804B2EC.inc @@ -0,0 +1,169 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #4 + adds r7, r0, #0 @ r7 = boss + lsls r1, r1, #0x18 + lsrs r1, r1, #0x18 + mov sb, r1 + movs r0, #0 + str r0, [sp] + adds r0, r7, #0 + adds r0, #0x3e + add r0, sb + ldrb r0, [r0] + cmp r0, #0 + beq _0804B314 + movs r0, #0 + b _0804B41E +_0804B314: + ldr r1, _0804B3C8 @ =gPlayer + mov r8, r1 @ r8 = gPlayer + mov r0, r8 + adds r0, #0x90 + ldr r0, [r0] + adds r0, #0xc @ r0 = s = &gPlayer.unk90->s; + mov sl, r0 @ sl = s + mov r2, sb @ r2 = sb = arm + lsls r4, r2, #3 @ r4 = arm * 8 + adds r0, r7, #0 + adds r0, #0x18 + adds r0, r0, r4 + ldr r3, [r7] @ r3 = boss->qUnk0 + ldr r0, [r0] @ r0 = qUnk18[arm][0] + ldr r1, _0804B3CC @ r1 = gUnknown_080D8888 + lsls r2, r2, #2 @ r2 = arm * 4 + adds r5, r2, r1 @ r5 = &gUnknown_080D8888[arm][0] + adds r6, r3, r0 @ r6 = boss->qUnk0 + qUnk18[arm][0] + adds r0, r7, #0 + adds r0, #0x1c + adds r0, r0, r4 + ldr r3, [r7, #4] @ r3 = boss->qUnk4 + ldr r0, [r0] @ r0 = qUnk18[arm][1] + adds r1, #2 + adds r2, r2, r1 + adds r0, r3, r0 + ldrh r5, [r5] @ r5 = gUnknown_080D8888[arm][0] + adds r4, r6, r5 @ r4 = boss->qUnk0 + qUnk18[arm][0] + ldrh r2, [r2] + adds r5, r0, r2 + ldr r0, _0804B3D0 @ =gSelectedCharacter + ldrb r0, [r0] + lsls r0, r0, #0x18 + asrs r0, r0, #0x18 + cmp r0, #0 + beq _0804B364 + adds r0, r4, #0 + adds r1, r5, #0 + bl Player_UpdateHomingPosition +_0804B364: + mov r1, r8 + ldr r0, [r1, #0x20] + movs r1, #0x80 + ands r0, r1 + cmp r0, #0 + bne _0804B3D8 + mov r2, sl + ldr r1, [r2, #0x30] + movs r0, #1 + rsbs r0, r0, #0 + cmp r1, r0 + beq _0804B3D8 + mov r1, r8 + ldr r0, [r1, #8] + subs r0, r0, r4 + asrs r6, r0, #8 + ldr r0, [r1, #0xc] + subs r0, r0, r5 + asrs r0, r0, #8 + adds r2, r6, #0 + muls r2, r6, r2 + adds r6, r2, #0 + adds r1, r0, #0 + muls r1, r0, r1 + adds r0, r1, #0 + adds r1, r6, r0 + ldr r0, _0804B3D4 @ =0x00000177 + cmp r1, r0 + bgt _0804B3D8 + adds r0, r7, #0 + mov r1, sb + bl sub_804C9B4 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp] + mov r2, r8 + movs r5, #0x10 + ldrsh r0, [r2, r5] + rsbs r0, r0, #0 + strh r0, [r2, #0x10] + movs r1, #0x12 + ldrsh r0, [r2, r1] + rsbs r0, r0, #0 + strh r0, [r2, #0x12] + movs r5, #0x14 + ldrsh r0, [r2, r5] + rsbs r0, r0, #0 + strh r0, [r2, #0x14] + b _0804B41C + .align 2, 0 +_0804B3C8: .4byte gPlayer +_0804B3CC: .4byte gUnknown_080D8888 +_0804B3D0: .4byte gSelectedCharacter +_0804B3D4: .4byte 0x00000177 +_0804B3D8: + ldr r0, _0804B430 @ =gCheese + ldr r2, [r0] + cmp r2, #0 + beq _0804B41C + ldr r1, [r2, #0x4c] + movs r0, #1 + rsbs r0, r0, #0 + cmp r1, r0 + beq _0804B41C + ldr r0, [r2] + subs r4, r4, r0 + asrs r4, r4, #8 + ldr r0, [r2, #4] + subs r5, r5, r0 + asrs r5, r5, #8 + adds r0, r4, #0 + muls r0, r4, r0 + adds r1, r5, #0 + muls r1, r5, r1 + adds r0, r0, r1 + ldr r1, _0804B434 @ =0x00000177 + cmp r0, r1 + bgt _0804B41C + adds r0, r7, #0 + mov r1, sb + bl sub_804C9B4 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp] + ldr r0, _0804B438 @ =gUnknown_03005498 + ldr r1, [r0, #4] + movs r0, #0 + strb r0, [r1, #0x15] +_0804B41C: + ldr r0, [sp] +_0804B41E: + add sp, #4 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r1} + bx r1 + .align 2, 0 +_0804B430: .4byte gCheese +_0804B434: .4byte 0x00000177 +_0804B438: .4byte gUnknown_03005498 + +.syntax divided diff --git a/asm/non_matching/game/bosses/boss_8__sub_804BC44.inc b/asm/non_matching/game/bosses/boss_8__sub_804BC44.inc new file mode 100644 index 000000000..fa35fcce9 --- /dev/null +++ b/asm/non_matching/game/bosses/boss_8__sub_804BC44.inc @@ -0,0 +1,282 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x64 + mov sb, r0 @ sb = boss + lsls r1, r1, #0x18 + lsrs r1, r1, #0x18 + str r1, [sp, #0x20] @ sp20 = arm + lsls r2, r1, #3 + adds r0, #0x18 + adds r6, r0, r2 + ldr r0, _0804BDE0 @ =gSineTable + mov ip, r0 @ ip =gSineTable + lsls r7, r1, #1 @ r7 = arm * 2 + mov r1, sb + adds r1, #0x2c + str r1, [sp, #0x24] @ sp24 = &boss->rotation2 + adds r1, r1, r7 + mov sl, r1 @ sl = &boss->rotation2[arm] + ldrh r0, [r1] + movs r3, #0x80 + lsls r3, r3, #1 + adds r0, r0, r3 + lsls r0, r0, #1 + add r0, ip + movs r4, #0 + ldrsh r0, [r0, r4] @ r0 = COS(boss->rotation2[arm]) + lsls r1, r0, #5 + subs r1, r1, r0 + asrs r1, r1, #0xa + ldr r0, [r6] + subs r0, r0, r1 + str r0, [r6] @ boss->qUnk18[arm].x -= ((COS(boss->rotation2[arm]) * 31) >> 10) + mov r0, sb + adds r0, #0x1c + adds r5, r0, r2 @ r5 = &boss->qUnk18[arm].y + mov r1, sl + ldrh r0, [r1] + lsls r0, r0, #1 + add r0, ip + movs r2, #0 + ldrsh r0, [r0, r2] + lsls r1, r0, #5 + subs r1, r1, r0 + asrs r1, r1, #0xa + ldr r0, [r5] + subs r0, r0, r1 + str r0, [r5] @ boss->qUnk18[arm].y -= ((SIN(boss->rotation2[arm]) * 31) >> 10) + mov r3, sb + adds r3, #0x28 + str r3, [sp, #0x28] @ sp28 = &boss->rotation + adds r3, r3, r7 @ r3 = &boss->rotation[arm] + mov r4, sb + adds r4, #0x30 + str r4, [sp, #0x2c] @ sp2C = &boss->unk30 + adds r2, r4, r7 @ r2 = &boss->unk30[arm] + ldrh r0, [r2] + lsls r0, r0, #2 + ldrh r1, [r3] + adds r0, r0, r1 + ldr r4, _0804BDE4 @ =0x000003FF + adds r1, r4, #0 + ands r0, r1 + strh r0, [r3] + ldrh r0, [r2] + subs r0, #1 + strh r0, [r2] + lsls r0, r0, #0x10 + cmp r0, #0 + beq _0804BCD6 + b _0804BE56 +_0804BCD6: + mov r0, sb @ r0 = sb = boss + ldr r4, [r0] @ r4 = boss->pos.x + ldr r3, [r6] @ r3 = boss->qUnk18[arm].x + ldr r0, _0804BDE8 @ =gUnknown_080D8888 + ldr r2, [sp, #0x20] @ r2 = arm + lsls r1, r2, #2 @ r1 = arm * 4 + adds r2, r1, r0 @ r2 = &gUnknown_080D8888[arm] + adds r4, r4, r3 @ r4 += boss->qUnk18[arm].x + ldrh r2, [r2] + adds r4, r4, r2 @ r4 = x = boss->pos.x + boss->qUnk18[arm].x + gUnknown_080D8888[arm][0] + mov r2, sb @ r2 = boss + ldr r3, [r2, #4] @ r3 = boss->pos.y + ldr r2, [r5] + adds r0, #2 + adds r1, r1, r0 @ r1 += gUnknown_080D8888[arm][1] + adds r3, r3, r2 @ r3 += boss->qUnk18[arm].y + ldrh r1, [r1] + adds r3, r3, r1 @ r3 = y = boss->pos.y + boss->qUnk18[arm].y + gUnknown_080D8888[arm][1] + mov r5, sl @ r5 = sl = &boss->rotation2[arm] + ldrh r2, [r5] @ r2 = boss->rotation2[arm] + movs r1, #0x80 + lsls r1, r1, #1 + adds r0, r2, r1 + lsls r0, r0, #1 + add r0, ip + movs r5, #0 + ldrsh r1, [r0, r5] @ r1 = COS(boss->rotation2[arm]) + lsls r0, r1, #4 + subs r0, r0, r1 + asrs r0, r0, #6 + subs r4, r4, r0 @ r4 = x -= ((COS(boss->rotation2[arm]) * 15) >> 6); + lsls r2, r2, #1 + add r2, ip + movs r0, #0 + ldrsh r1, [r2, r0] + lsls r0, r1, #4 + subs r0, r0, r1 + asrs r0, r0, #6 + subs r3, r3, r0 + movs r1, #0 + mov r8, r1 + str r7, [sp, #0x38] @ sp38 = arm * 2 + ldr r2, [sp, #0x24] + str r2, [sp, #0x4c] @ sp4C = &boss->rotation2 + ldr r5, [sp, #0x28] + str r5, [sp, #0x48] @ sp48 = &boss->rotation + ldr r7, [sp, #0x2c] + str r7, [sp, #0x50] @ sp50 = &boss->unk30 + mov r0, sb + adds r0, #0xc + str r0, [sp, #0x34] @ sp34 = &boss->unkC + mov r1, sb + adds r1, #0x3c + str r1, [sp, #0x54] @ sp54 = &boss->unk3C + asrs r4, r4, #8 + str r4, [sp, #0x40] @ sp40 = I(x) + asrs r3, r3, #8 + str r3, [sp, #0x44] @ sp44 = I(y) + mov r2, sl @ r2 = sl = &boss->rotation2[arm] + mov r4, sp @ r4 = sp = info + movs r3, #0 + mov sl, r3 @ sl = 0 +_0804BD52: + movs r6, #0 + mov r5, r8 @ r5 = r8 = + subs r5, #1 + str r5, [sp, #0x60] + mov r7, r8 + lsls r7, r7, #1 + str r7, [sp, #0x3c] @ sp3C = + mov r0, r8 + adds r0, #1 + str r0, [sp, #0x30] + adds r3, r5, #0 + movs r1, #1 + mov r7, r8 + subs r5, r1, r7 +_0804BD6E: + ldrh r0, [r2] + ldr r1, _0804BDEC @ =0xFFFFFF00 + adds r0, r0, r1 + ldr r7, _0804BDE4 @ =0x000003FF + ands r0, r7 + movs r1, #0x80 + lsls r1, r1, #1 + adds r0, r0, r1 + lsls r0, r0, #1 + ldr r7, _0804BDE0 @ =gSineTable + adds r0, r0, r7 + movs r1, #0 + ldrsh r0, [r0, r1] + muls r0, r3, r0 + asrs r0, r0, #0xb + ldr r7, [sp, #0x40] + subs r0, r7, r0 + str r0, [sp, #0x14] + ldrh r0, [r2] + ldr r1, _0804BDEC @ =0xFFFFFF00 + adds r0, r0, r1 + ldr r7, _0804BDE4 @ =0x000003FF + ands r0, r7 + lsls r0, r0, #1 + ldr r1, _0804BDE0 @ =gSineTable + adds r0, r0, r1 + movs r7, #0 + ldrsh r0, [r0, r7] + muls r0, r3, r0 + asrs r0, r0, #0xb + ldr r1, [sp, #0x44] + subs r0, r1, r0 + str r0, [sp, #0x18] + mov r7, sl + strh r7, [r4, #0x1c] + movs r0, #0x90 + lsls r0, r0, #2 + adds r1, r0, #0 + ldrh r7, [r2] + adds r1, r1, r7 + ldr r0, [sp, #0x3c] + add r0, r8 + adds r0, r0, r6 + lsls r0, r0, #5 + subs r1, r1, r0 + ldr r0, _0804BDE4 @ =0x000003FF + ands r1, r0 + strh r1, [r4, #0xc] + lsls r0, r6, #7 + movs r7, #0x80 + lsls r7, r7, #2 + adds r1, r0, r7 + cmp r5, #0 + blt _0804BDF0 + lsls r0, r5, #1 + adds r0, r0, r5 + b _0804BDF6 + .align 2, 0 +_0804BDE0: .4byte gSineTable +_0804BDE4: .4byte 0x000003FF +_0804BDE8: .4byte gUnknown_080D8888 +_0804BDEC: .4byte 0xFFFFFF00 +_0804BDF0: + ldr r7, [sp, #0x60] + lsls r0, r7, #1 + adds r0, r0, r7 +_0804BDF6: + lsls r0, r0, #5 + subs r0, r1, r0 + strh r0, [r4, #0xe] + mov r1, sb + ldr r0, [r1, #0x44] + str r0, [sp] + ldr r0, _0804BE68 @ =0x000002C3 + strh r0, [r4, #8] + mov r7, sl + strh r7, [r4, #0xa] + mov r0, sl + str r0, [sp, #4] + mov r0, sp + ldr r1, [sp, #0x34] + str r2, [sp, #0x58] + str r3, [sp, #0x5c] + bl CreateBossParticleStatic + adds r0, r6, #1 + lsls r0, r0, #0x18 + lsrs r6, r0, #0x18 + ldr r2, [sp, #0x58] + ldr r3, [sp, #0x5c] + cmp r6, #2 + bls _0804BD6E + ldr r1, [sp, #0x30] + lsls r0, r1, #0x18 + lsrs r0, r0, #0x18 + mov r8, r0 + cmp r0, #2 + bls _0804BD52 + ldr r3, [sp, #0x48] + ldr r4, [sp, #0x38] + adds r2, r3, r4 + ldr r5, [sp, #0x4c] + adds r0, r5, r4 + ldrh r0, [r0] + movs r1, #0 + strh r0, [r2] + ldr r7, [sp, #0x54] + ldr r2, [sp, #0x20] + adds r0, r7, r2 + strb r1, [r0] + ldr r3, [sp, #0x50] + adds r1, r3, r4 + movs r0, #0x96 + lsls r0, r0, #1 + strh r0, [r1] +_0804BE56: + add sp, #0x64 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 +_0804BE68: .4byte 0x000002C3 + +.syntax divided diff --git a/asm/non_matching/game/bosses/boss_8__sub_804C240.inc b/asm/non_matching/game/bosses/boss_8__sub_804C240.inc new file mode 100644 index 000000000..bbd91e717 --- /dev/null +++ b/asm/non_matching/game/bosses/boss_8__sub_804C240.inc @@ -0,0 +1,180 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x24 + adds r4, r0, #0 + lsls r1, r1, #0x18 + lsrs r2, r1, #0x18 + mov ip, r2 @ ip = arm + adds r0, #0x42 + adds r3, r0, r2 + ldrb r0, [r3] + cmp r0, #0 + beq _0804C260 + b _0804C37C +_0804C260: + lsls r7, r2, #3 @ r7 = arm * 8 + adds r0, r4, #0 + adds r0, #0x1c + adds r6, r0, r7 @ r6 = boss->qUnk18[arm].y + ldr r1, [r4, #4] + ldr r0, [r6] + adds r1, r1, r0 @ r1 = boss->pos.y + boss->qUnk18[arm].y + ldr r0, _0804C290 @ =gUnknown_080D8888 + mov sb, r0 @ sb = gUnknown_080D8888 + lsls r5, r2, #2 @ r5 = arm * 4 + adds r0, #2 + adds r0, r5, r0 + ldrh r0, [r0] @ r0 = gUnknown_080D8888[arm][1] + mov r8, r0 @ r8 = r0 + add r1, r8 + asrs r1, r1, #8 + movs r0, #0x96 + lsls r0, r0, #1 + cmp r1, r0 + ble _0804C294 + movs r0, #1 + strb r0, [r3] + b _0804C37C + .align 2, 0 +_0804C290: .4byte gUnknown_080D8888 +_0804C294: + mov r1, ip @ r1 = ip = arm + lsls r0, r1, #1 + adds r2, r4, #0 + adds r2, #0x28 + adds r2, r2, r0 @ r2 = &boss->rotation[arm] + movs r3, #0xc8 + lsls r3, r3, #2 + adds r0, r3, #0 + ldrh r1, [r2] + adds r0, r0, r1 + adds r3, #0xdf + adds r1, r3, #0 + ands r0, r1 + strh r0, [r2] + adds r0, r4, #0 + adds r0, #0x36 + adds r3, r0, r5 + ldrh r0, [r3] + adds r0, #0x20 + strh r0, [r3] + adds r0, r4, #0 + adds r0, #0x18 + adds r2, r0, r7 @ r2 = &boss->qUnk18[arm] + adds r0, #0x1c + adds r0, r0, r5 + mov ip, r0 + movs r7, #0 + ldrsh r1, [r0, r7] + ldr r0, [r2] + adds r0, r0, r1 + str r0, [r2] + movs r0, #0 + ldrsh r1, [r3, r0] + ldr r0, [r6] + adds r0, r0, r1 + str r0, [sp, #0x20] @ r0 = boss->qUnk18[arm].y + str r0, [r6] + ldr r1, _0804C38C @ =gStageTime + mov sl, r1 @ sl = gStageTime + ldr r6, [r1] + movs r0, #3 + ands r6, r0 + cmp r6, #0 + bne _0804C37C + ldr r1, [r4] @ r1 = *r4 = boss->pos.x + ldr r0, [r2] @ r0 = *r2 = boss->qUnk18[arm] + mov r7, sb @ r7 = sb = gUnknown_080D8888 + adds r2, r5, r7 @ r2 = gUnknown_080D8888[arm][0] + adds r1, r1, r0 @ r1 += boss->qUnk18[arm] + ldrh r2, [r2] + adds r1, r1, r2 @ r1 = boss->pos.x + boss->qUnk18[arm] + gUnknown_080D8888[arm][0] + ldr r0, [r4, #4] @ r0 = boss->pos.y + ldr r2, [sp, #0x20] @ r2 = boss->qUnk18[arm].y + adds r0, r0, r2 + add r0, r8 + asrs r1, r1, #8 + str r1, [sp, #0x14] + asrs r0, r0, #8 + str r0, [sp, #0x18] + mov r0, sp + strh r6, [r0, #0x1c] + ldrh r0, [r3] + lsls r0, r0, #0x10 + asrs r0, r0, #0x13 + rsbs r0, r0, #0 + mov r3, ip + ldrh r1, [r3] + lsls r1, r1, #0x10 + asrs r1, r1, #0x13 + rsbs r1, r1, #0 + bl sub_8004418 + mov r1, sp + strh r0, [r1, #0xc] + mov r3, sp + ldr r2, _0804C390 @ =gPseudoRandom + ldr r1, [r2] + ldr r0, _0804C394 @ =0x00196225 + muls r0, r1, r0 + ldr r5, _0804C398 @ =0x3C6EF35F + adds r0, r0, r5 + str r0, [r2] + mov r2, sp + movs r1, #0x1f + ands r0, r1 + ldrh r2, [r2, #0xc] + adds r0, r0, r2 + subs r0, #0x10 + ldr r1, _0804C39C @ =0x000003FF + ands r0, r1 + strh r0, [r3, #0xc] + ldr r2, _0804C3A0 @ =gSineTable + mov r7, sl @ r7 = sl = &gStageTime + ldr r0, [r7] + lsls r0, r0, #4 + ands r0, r1 + lsls r0, r0, #1 + adds r0, r0, r2 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + subs r1, #0xff + adds r0, r0, r1 + strh r0, [r3, #0xe] + ldr r0, _0804C3A4 @ =0x06012980 + str r0, [sp] + mov r1, sp + ldr r0, _0804C3A8 @ =0x0000026B + strh r0, [r1, #8] + mov r0, sp + strh r6, [r0, #0xa] + str r6, [sp, #4] + adds r1, r4, #0 + adds r1, #0xc + bl CreateBossParticleStatic +_0804C37C: + add sp, #0x24 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 +_0804C38C: .4byte gStageTime +_0804C390: .4byte gPseudoRandom +_0804C394: .4byte 0x00196225 +_0804C398: .4byte 0x3C6EF35F +_0804C39C: .4byte 0x000003FF +_0804C3A0: .4byte gSineTable +_0804C3A4: .4byte 0x06012980 +_0804C3A8: .4byte 0x0000026B + +.syntax divided diff --git a/asm/non_matching/game/interactables_1/sub_805ECA0.inc b/asm/non_matching/game/interactables_1/sub_805ECA0.inc index f3d951599..7284c55ee 100644 --- a/asm/non_matching/game/interactables_1/sub_805ECA0.inc +++ b/asm/non_matching/game/interactables_1/sub_805ECA0.inc @@ -94,7 +94,7 @@ _0805ED4E: ldr r3, [sp] strb r0, [r3] adds r0, r5, #0 - bl sub_80218E4 + bl Player_TransitionCancelFlyingAndBoost adds r0, r5, #0 movs r1, #9 bl sub_8023B5C diff --git a/asm/non_matching/game/player__sub_80139B0.inc b/asm/non_matching/game/player__sub_80139B0.inc new file mode 100644 index 000000000..67ee1ba61 --- /dev/null +++ b/asm/non_matching/game/player__sub_80139B0.inc @@ -0,0 +1,168 @@ + +.syntax unified +.text + push {r4, lr} + mov ip, r0 @ ip = player + movs r1, #0x14 + ldrsh r3, [r0, r1] + cmp r3, #0 + bge _080139BE + rsbs r3, r3, #0 @ r3 = speedGrnd (abs) +_080139BE: + mov r0, ip + adds r0, #0xad + ldrb r2, [r0] + ldr r1, _080139D0 @ =0x000002FF + adds r4, r0, #0 + cmp r3, r1 + bgt _080139D4 + adds r3, #6 + b _080139E4 + .align 2, 0 +_080139D0: .4byte 0x000002FF +_080139D4: + ldr r0, _08013A14 @ =0x00000EFF + cmp r3, r0 + bgt _080139E4 + movs r0, #0x7f + ands r0, r2 + cmp r0, #0 + bne _080139E4 + adds r3, #3 +_080139E4: + mov r1, ip + ldr r0, [r1, #0x20] + movs r1, #0x40 + ands r0, r1 + cmp r0, #0 + beq _08013A00 + movs r0, #0xc0 + lsls r0, r0, #2 + cmp r3, r0 + ble _08013A00 + subs r3, #9 + cmp r3, r0 + bge _08013A00 + adds r3, r0, #0 +_08013A00: + ldrb r0, [r4] + adds r0, #0x40 + lsls r0, r0, #0x18 + cmp r0, #0 + bgt _08013A18 + rsbs r0, r3, #0 + mov r1, ip + strh r0, [r1, #0x14] + b _08013A1C + .align 2, 0 +_08013A14: .4byte 0x00000EFF +_08013A18: + mov r0, ip + strh r3, [r0, #0x14] +_08013A1C: + mov r0, ip + adds r0, #0x5c + ldrh r1, [r0] + movs r0, #0x20 + ands r0, r1 + cmp r0, #0 + beq _08013A48 + lsls r1, r2, #0x18 + lsrs r0, r1, #0x18 + cmp r0, #0x80 + beq _08013A7E + asrs r0, r1, #0x18 + cmp r0, #0 + bge _08013A3E + rsbs r0, r0, #0 + lsls r0, r0, #0x18 + lsrs r2, r0, #0x18 +_08013A3E: + lsls r0, r2, #0x18 + movs r1, #0x80 + lsls r1, r1, #0x12 + adds r0, r0, r1 + b _08013A7C +_08013A48: + movs r0, #0x10 + ands r0, r1 + cmp r0, #0 + beq _08013A6C + lsls r0, r2, #0x18 + asrs r0, r0, #0x18 + cmp r0, #0 + beq _08013A7E + cmp r0, #0 + ble _08013A62 + rsbs r0, r0, #0 + lsls r0, r0, #0x18 + lsrs r2, r0, #0x18 +_08013A62: + lsls r0, r2, #0x18 + movs r2, #0x80 + lsls r2, r2, #0x12 + adds r0, r0, r2 + b _08013A7C +_08013A6C: + lsls r0, r2, #0x18 + asrs r1, r0, #0x18 + movs r0, #0x7f + ands r0, r1 + cmp r0, #0 + beq _08013A7E + adds r0, r1, #2 + lsls r0, r0, #0x18 +_08013A7C: + lsrs r2, r0, #0x18 +_08013A7E: + strb r2, [r4] + ldr r1, _08013AAC @ =gSineTable + lsls r0, r2, #0x18 + lsrs r0, r0, #0x15 + movs r2, #0x80 + lsls r2, r2, #2 + adds r0, r0, r2 + adds r0, r0, r1 + ldrh r0, [r0] + lsls r0, r0, #0x10 + asrs r0, r0, #0x16 + muls r0, r3, r0 + asrs r0, r0, #8 + mov r3, ip + strh r0, [r3, #0x10] + ldrh r1, [r3, #0x12] + movs r2, #0x12 + ldrsh r0, [r3, r2] + cmp r0, #0x7f + bgt _08013AB0 + adds r0, r1, #0 + adds r0, #0x18 + b _08013AB6 + .align 2, 0 +_08013AAC: .4byte gSineTable +_08013AB0: + adds r0, r1, #0 + subs r0, #0x18 + mov r3, ip +_08013AB6: + strh r0, [r3, #0x12] + ldr r1, _08013AC4 @ =gCamera + ldr r0, [r1, #0x4c] + cmp r0, #0 + ble _08013AC8 + subs r0, #2 + b _08013ACE + .align 2, 0 +_08013AC4: .4byte gCamera +_08013AC8: + cmp r0, #0 + bge _08013AD0 + adds r0, #4 +_08013ACE: + str r0, [r1, #0x4c] +_08013AD0: + pop {r4} + pop {r0} + bx r0 + .align 2, 0 +.syntax divided diff --git a/asm/non_matching/game/player__sub_802966C.inc b/asm/non_matching/game/player__sub_802966C.inc new file mode 100644 index 000000000..449a0eb06 --- /dev/null +++ b/asm/non_matching/game/player__sub_802966C.inc @@ -0,0 +1,309 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + adds r4, r0, #0 + movs r6, #0xff + ldr r5, [r4, #0x48] + ldr r7, [r4, #0x4c] + movs r1, #0x2a + ldrsh r0, [r4, r1] + cmp r0, #0 + beq _08029680 + b _0802980C +_08029680: + adds r0, r4, #0 + adds r0, #0x5c + ldrh r2, [r0] + movs r0, #0x30 + ands r0, r2 + cmp r0, #0 + bne _08029690 + b _0802980C +_08029690: + ldrh r3, [r4, #0x14] + movs r0, #0x14 + ldrsh r1, [r4, r0] + mov ip, r3 + cmp r1, #0 + ble _08029734 + movs r0, #0x10 + ands r0, r2 + cmp r0, #0 + beq _080296D2 + adds r0, r1, #0 + ldr r1, [r4, #0x44] + cmp r0, r1 + bge _080296BC + adds r0, r3, r5 + strh r0, [r4, #0x14] + movs r2, #0x14 + ldrsh r0, [r4, r2] + cmp r0, r1 + ble _080296C6 + strh r1, [r4, #0x14] + b _080296C6 +_080296BC: + adds r1, r4, #0 + adds r1, #0x58 + ldrh r0, [r1] + adds r0, r0, r5 + strh r0, [r1] +_080296C6: + ldr r0, [r4, #0x20] + movs r1, #2 + rsbs r1, r1, #0 + ands r0, r1 + str r0, [r4, #0x20] + b _0802983C +_080296D2: + ldr r0, _080296F0 @ =0x000001FF + cmp r1, r0 + ble _08029708 + adds r0, r4, #0 + adds r0, #0x64 + ldrh r1, [r0] + subs r0, r1, #7 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + cmp r0, #1 + bhi _080296F4 + lsls r0, r1, #0x18 + lsrs r6, r0, #0x18 + b _08029702 + .align 2, 0 +_080296F0: .4byte 0x000001FF +_080296F4: + adds r0, r4, #0 + adds r0, #0x54 + ldrh r0, [r0] + movs r6, #7 + cmp r0, #3 + bls _08029702 + movs r6, #8 +_08029702: + mov r3, ip + subs r0, r3, r7 + b _080297A2 +_08029708: + subs r0, r3, r7 + strh r0, [r4, #0x14] + lsls r0, r0, #0x10 + cmp r0, #0 + bgt _08029714 + b _0802983C +_08029714: + ldr r0, [r4, #0x20] + movs r1, #1 + ands r0, r1 + cmp r0, #0 + beq _08029720 + b _0802983C +_08029720: + adds r0, r4, #0 + adds r0, #0x64 + ldrh r0, [r0] + subs r0, #7 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + cmp r0, #1 + bhi _080297FA + movs r6, #7 + b _080297FA +_08029734: + cmp r1, #0 + bge _080297C8 + movs r0, #0x20 + ands r0, r2 + cmp r0, #0 + beq _08029770 + movs r0, #0x14 + ldrsh r1, [r4, r0] + ldr r0, [r4, #0x44] + rsbs r2, r0, #0 + cmp r1, r2 + ble _0802975C + subs r0, r3, r5 + strh r0, [r4, #0x14] + movs r1, #0x14 + ldrsh r0, [r4, r1] + cmp r0, r2 + bge _08029766 + strh r2, [r4, #0x14] + b _08029766 +_0802975C: + adds r1, r4, #0 + adds r1, #0x58 + ldrh r0, [r1] + adds r0, r0, r5 + strh r0, [r1] +_08029766: + ldr r0, [r4, #0x20] + movs r1, #1 + orrs r0, r1 + str r0, [r4, #0x20] + b _0802983C +_08029770: + ldr r0, _0802978C @ =0xFFFFFE00 + cmp r1, r0 + bgt _080297B2 + adds r0, r4, #0 + adds r0, #0x64 + ldrh r1, [r0] + subs r0, r1, #7 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + cmp r0, #1 + bhi _08029790 + lsls r0, r1, #0x18 + lsrs r6, r0, #0x18 + b _0802979E + .align 2, 0 +_0802978C: .4byte 0xFFFFFE00 +_08029790: + adds r0, r4, #0 + adds r0, #0x54 + ldrh r0, [r0] + movs r6, #7 + cmp r0, #3 + bls _0802979E + movs r6, #8 +_0802979E: + mov r2, ip + adds r0, r2, r7 +_080297A2: + strh r0, [r4, #0x14] + adds r0, r4, #0 + bl sub_8029FA4 + movs r0, #0x73 + bl m4aSongNumStart + b _0802983C +_080297B2: + adds r0, r3, r7 + strh r0, [r4, #0x14] + lsls r0, r0, #0x10 + cmp r0, #0 + bge _0802983C + ldr r0, [r4, #0x20] + movs r1, #1 + ands r0, r1 + cmp r0, #0 + beq _0802983C + b _08029720 +_080297C8: + ldr r1, [r4, #0x20] + movs r0, #1 + ands r1, r0 + movs r0, #0x10 + ands r0, r2 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x14 + cmp r1, r0 + beq _080297FA + cmp r1, #0 + beq _080297E2 + subs r0, r3, r5 + b _080297E4 +_080297E2: + adds r0, r3, r5 +_080297E4: + strh r0, [r4, #0x14] + movs r6, #9 + adds r0, r4, #0 + movs r1, #0xe + bl sub_8023B5C + movs r0, #6 + strb r0, [r4, #0x16] + movs r0, #0xe + strb r0, [r4, #0x17] + b _0802983C +_080297FA: + ldr r1, _08029804 @ =gPlayer + ldr r0, _08029808 @ =Player_802A5C4 + str r0, [r1] + b _0802983C + .align 2, 0 +_08029804: .4byte gPlayer +_08029808: .4byte Player_802A5C4 +_0802980C: + movs r3, #0x14 + ldrsh r0, [r4, r3] + cmp r0, #0 + ble _08029820 + subs r0, #8 + lsls r0, r0, #0x10 + lsrs r1, r0, #0x10 + cmp r0, #0 + ble _0802982E + b _08029834 +_08029820: + cmp r0, #0 + bge _0802983A + adds r0, #8 + lsls r0, r0, #0x10 + lsrs r1, r0, #0x10 + cmp r0, #0 + blt _08029834 +_0802982E: + movs r1, #0 + movs r6, #0 + b _08029836 +_08029834: + movs r6, #9 +_08029836: + strh r1, [r4, #0x14] + b _0802983C +_0802983A: + movs r6, #0 +_0802983C: + ldr r0, [r4, #0x20] + movs r1, #0x80 + lsls r1, r1, #8 + ands r0, r1 + cmp r0, #0 + beq _08029860 + lsls r0, r6, #0x18 + asrs r1, r0, #0x18 + movs r2, #0xf9 + lsls r2, r2, #0x18 + adds r0, r0, r2 + lsrs r0, r0, #0x18 + cmp r0, #1 + bhi _08029890 + adds r0, r4, #0 + adds r0, #0x64 + strh r1, [r0] + b _08029890 +_08029860: + lsls r0, r6, #0x18 + asrs r1, r0, #0x18 + movs r0, #1 + rsbs r0, r0, #0 + cmp r1, r0 + beq _0802987C + adds r2, r4, #0 + adds r2, #0x64 + movs r3, #0 + ldrsh r0, [r2, r3] + cmp r0, r1 + beq _08029890 + strh r1, [r2] + b _08029890 +_0802987C: + adds r1, r4, #0 + adds r1, #0x64 + ldrh r0, [r1] + subs r0, #7 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + cmp r0, #1 + bhi _08029890 + movs r0, #9 + strh r0, [r1] +_08029890: + adds r0, r4, #0 + bl sub_8023128 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 +.syntax divided diff --git a/asm/non_matching/game/stage/outro/sub_8031138.inc b/asm/non_matching/game/stage/outro/sub_8031138.inc deleted file mode 100644 index d97dd603b..000000000 --- a/asm/non_matching/game/stage/outro/sub_8031138.inc +++ /dev/null @@ -1,249 +0,0 @@ -.include "constants/gba_constants.inc" -.syntax unified -.text - - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - sub sp, #4 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 @ r8 = p0 - ldr r0, _0803118C @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r0, r0, r1 - mov sb, r0 @ sb = outro - ldr r2, _08031190 @ =IWRAM_START + 0x168 - adds r0, r1, r2 - ldr r7, [r0] @ r7 = counter - cmp r7, #0x17 - bhi _08031198 - ldr r0, _08031194 @ =IWRAM_START + 0x12C - adds r5, r1, r0 - movs r0, #0 - cmp r7, #0x10 - bhi _08031174 - movs r1, #0x10 - subs r1, r1, r7 - lsls r0, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #3 -_08031174: - movs r6, #0 - mov r1, r8 - subs r4, r0, r1 -_0803117A: - strh r4, [r5, #0x16] - adds r0, r5, #0 - bl DisplaySprite - adds r4, #0x20 - adds r6, #1 - cmp r6, #7 - bls _0803117A - b _080311B2 - .align 2, 0 -_0803118C: .4byte gCurTask -_08031190: .4byte IWRAM_START + 0x168 -_08031194: .4byte IWRAM_START + 0x12C -_08031198: - ldr r2, _08031214 @ =IWRAM_START + 0x12C - adds r5, r1, r2 - movs r6, #0 - mov r0, r8 - rsbs r4, r0, #0 -_080311A2: - strh r4, [r5, #0x16] - adds r0, r5, #0 - bl DisplaySprite - adds r4, #0x20 - adds r6, #1 - cmp r6, #7 - bls _080311A2 -_080311B2: - cmp r7, #0x1c - bls _080311F4 - ldr r0, _08031218 @ =gCurrentLevel - ldrb r1, [r0] - movs r0, #3 - ands r0, r1 - movs r1, #3 - cmp r0, #2 - bne _080311C6 - movs r1, #2 -_080311C6: - movs r6, #0 - cmp r6, r1 - bhs _080311F4 - mov r4, sb @ r4 = sb = outro - adds r4, #0x22 - mov r0, sb @ r0 = sb = outro - adds r0, #0xc -_080311D4: - adds r5, r0, #0 - ldrh r0, [r4] - mov r2, r8 - subs r0, r0, r2 - strh r0, [r4] - adds r0, r5, #0 - str r1, [sp] - bl DisplaySprite - adds r4, #0x30 - adds r0, r5, #0 - adds r0, #0x30 - adds r6, #1 - ldr r1, [sp] - cmp r6, r1 - blo _080311D4 -_080311F4: - cmp r7, #0x26 - bls _0803124C - mov r5, sb @ r5 = sb = outro - adds r5, #0x9c - cmp r7, #0x37 - bhi _0803121C - adds r0, r7, #0 - subs r0, #0x27 - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #2 - movs r0, #0xf0 - subs r0, r0, r1 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - b _0803121E - .align 2, 0 -_08031214: .4byte IWRAM_START + 0x12C -_08031218: .4byte gCurrentLevel -_0803121C: - movs r4, #0x30 -_0803121E: - mov r1, r8 - subs r0, r4, r1 - strh r0, [r5, #0x16] - adds r0, r5, #0 - bl DisplaySprite - movs r0, #0xae - lsls r0, r0, #1 - add r0, sb - ldr r0, [r0] - mov r1, r8 - lsls r2, r1, #0x10 - asrs r2, r2, #0x10 - subs r2, #0x90 - lsls r1, r4, #0x10 - asrs r1, r1, #0x10 - subs r1, r1, r2 - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - movs r2, #0x5a - movs r3, #0 - bl StageUI_PrintIntegerAt -_0803124C: - cmp r7, #0x30 - bls _0803129C - mov r5, sb - adds r5, #0xcc - cmp r7, #0x41 - bhi _0803126C - adds r0, r7, #0 - subs r0, #0x31 - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #2 - movs r0, #0xf0 - subs r0, r0, r1 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - b _0803126E -_0803126C: - movs r4, #0x30 -_0803126E: - mov r2, r8 - subs r0, r4, r2 - strh r0, [r5, #0x16] - adds r0, r5, #0 - bl DisplaySprite - movs r0, #0xb0 - lsls r0, r0, #1 - add r0, sb - ldr r0, [r0] - mov r1, r8 - lsls r2, r1, #0x10 - asrs r2, r2, #0x10 - subs r2, #0x90 - lsls r1, r4, #0x10 - asrs r1, r1, #0x10 - subs r1, r1, r2 - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - movs r2, #0x6e - movs r3, #0 - bl StageUI_PrintIntegerAt -_0803129C: - ldr r0, _080312D0 @ =gCurrentLevel - ldrb r1, [r0] - movs r0, #3 - ands r0, r1 - cmp r0, #2 - beq _08031304 - lsls r0, r1, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0x1b - bgt _08031304 - cmp r7, #0x3a - bls _08031304 - mov r5, sb - adds r5, #0xfc - cmp r7, #0x4b - bhi _080312D4 - adds r0, r7, #0 - subs r0, #0x3b - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #2 - movs r0, #0xf0 - subs r0, r0, r1 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - b _080312D6 - .align 2, 0 -_080312D0: .4byte gCurrentLevel -_080312D4: - movs r4, #0x30 -_080312D6: - mov r2, r8 - subs r0, r4, r2 - strh r0, [r5, #0x16] - adds r0, r5, #0 - bl DisplaySprite - movs r0, #0xb2 - lsls r0, r0, #1 - add r0, sb - ldr r0, [r0] - mov r1, r8 - lsls r2, r1, #0x10 - asrs r2, r2, #0x10 - subs r2, #0x90 - lsls r1, r4, #0x10 - asrs r1, r1, #0x10 - subs r1, r1, r2 - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - movs r2, #0x82 - movs r3, #0 - bl StageUI_PrintIntegerAt -_08031304: - add sp, #4 - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 - -.syntax divided diff --git a/asm/non_matching/sub_8023B5C.inc b/asm/non_matching/sub_8023B5C.inc deleted file mode 100644 index bf96f4b0c..000000000 --- a/asm/non_matching/sub_8023B5C.inc +++ /dev/null @@ -1,110 +0,0 @@ -.include "asm/macros.inc" -.include "constants/constants.inc" - -.syntax unified -.text - push {r4, lr} - adds r3, r0, #0 - adds r4, r1, #0 - movs r0, #0x17 - ldrsb r0, [r3, r0] - cmp r0, r4 - beq _08023C0A - adds r0, r3, #0 - adds r0, #0x24 - ldrb r2, [r0] - ldr r0, _08023BA0 @ =gStageFlags - ldrh r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08023B8E - adds r0, r2, #0 - adds r0, #0x40 - lsls r0, r0, #0x18 - rsbs r0, r0, #0 - lsrs r2, r0, #0x18 - adds r0, r2, #0 - subs r0, #0x40 - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 -_08023B8E: - adds r0, r2, #0 - adds r0, #0x20 - cmp r0, #0 - ble _08023BA8 - cmp r2, #0 - beq _08023BA4 - subs r0, #1 - b _08023BAC - .align 2, 0 -_08023BA0: .4byte gStageFlags -_08023BA4: - movs r2, #0x20 - b _08023BB4 -_08023BA8: - cmp r2, #0 - beq _08023BB2 -_08023BAC: - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - b _08023BB4 -_08023BB2: - movs r2, #0x1f -_08023BB4: - lsrs r0, r2, #6 - cmp r0, #1 - beq _08023BEE - cmp r0, #1 - bgt _08023BC4 - cmp r0, #0 - beq _08023BCE - b _08023C0A -_08023BC4: - cmp r0, #2 - beq _08023BDE - cmp r0, #3 - beq _08023BFC - b _08023C0A -_08023BCE: - movs r1, #0x17 - ldrsb r1, [r3, r1] - subs r1, r4, r1 - lsls r1, r1, #8 - ldr r0, [r3, #0xc] - subs r0, r0, r1 - str r0, [r3, #0xc] - b _08023C0A -_08023BDE: - movs r1, #0x17 - ldrsb r1, [r3, r1] - subs r1, r4, r1 - lsls r1, r1, #8 - ldr r0, [r3, #0xc] - adds r0, r0, r1 - str r0, [r3, #0xc] - b _08023C0A -_08023BEE: - movs r1, #0x17 - ldrsb r1, [r3, r1] - subs r1, r4, r1 - lsls r1, r1, #8 - ldr r0, [r3, #8] - adds r0, r0, r1 - b _08023C08 -_08023BFC: - movs r1, #0x17 - ldrsb r1, [r3, r1] - subs r1, r4, r1 - lsls r1, r1, #8 - ldr r0, [r3, #8] - subs r0, r0, r1 -_08023C08: - str r0, [r3, #8] -_08023C0A: - pop {r4} - pop {r0} - bx r0 - - -.syntax divided diff --git a/asm/sprite_2.s b/asm/sprite_2.s deleted file mode 100644 index c76ffee2e..000000000 --- a/asm/sprite_2.s +++ /dev/null @@ -1,923 +0,0 @@ -.include "asm/macros.inc" -.include "constants/constants.inc" - -.syntax unified -.arm - -@ VERY similar to sub_8004860 and sub_8004E14 - thumb_func_start sub_8004ABC -sub_8004ABC: @ 0x08004ABC - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x3c - str r0, [sp, #0x24] - adds r7, r1, #0 - ldr r1, [r0, #0xc] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - bne _08004AD8 - b _08004E04 -_08004AD8: - mov sb, r1 - add r2, sp, #0x20 - ldr r1, [sp, #0x24] - ldr r0, [r1, #0x10] - movs r1, #0x1f - ands r0, r1 - strh r0, [r2] - ldrh r4, [r2] - lsls r4, r4, #5 - ldr r0, _08004D58 @ =gOamBuffer + 0x6 - adds r4, r4, r0 - subs r2, #0x18 - str r2, [sp, #0x28] - ldrh r0, [r7] - ldr r3, _08004D5C @ =gUnknown_03001944 - ldrh r1, [r3] - adds r0, r0, r1 - ldr r2, _08004D60 @ =0x000003FF - ands r0, r2 - movs r5, #0x80 - lsls r5, r5, #1 - adds r0, r0, r5 - lsls r0, r0, #1 - ldr r6, _08004D64 @ =gSineTable - adds r0, r0, r6 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - ldr r1, [sp, #0x28] - strh r0, [r1] - movs r3, #0xa - add r3, sp - mov r8, r3 - ldrh r0, [r7] - ldr r5, _08004D5C @ =gUnknown_03001944 - ldrh r1, [r5] - adds r0, r0, r1 - ands r0, r2 - lsls r0, r0, #1 - adds r0, r0, r6 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - strh r0, [r3] - add r6, sp, #0xc - movs r0, #2 - ldrsh r1, [r7, r0] - ldr r2, _08004D68 @ =gUnknown_030017F0 - ldrh r0, [r2] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r6] - movs r3, #0xe - add r3, sp - mov sl, r3 - movs r5, #4 - ldrsh r1, [r7, r5] - ldr r2, _08004D6C @ =gUnknown_03005394 - ldrh r0, [r2] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r3] - movs r5, #0x80 - lsls r5, r5, #9 - ldrh r1, [r6] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - ldr r3, [sp, #0x28] - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4] - ldrh r1, [r6] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - mov r2, r8 - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4, #8] - mov r3, sl - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - mov r2, r8 - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - rsbs r1, r1, #0 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4, #0x10] - mov r3, sl - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - ldr r5, [sp, #0x28] - ldrh r1, [r5] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4, #0x18] - movs r1, #2 - ldrsh r0, [r7, r1] - str r0, [sp, #0x2c] - cmp r0, #0 - bge _08004BF0 - movs r2, #2 - ldrsh r0, [r7, r2] - rsbs r0, r0, #0 - ldr r3, _08004D68 @ =gUnknown_030017F0 - ldrh r1, [r3] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r6] -_08004BF0: - movs r4, #4 - ldrsh r0, [r7, r4] - ldr r5, _08004D6C @ =gUnknown_03005394 - ldrh r3, [r5] - ldrh r2, [r7, #4] - mov r1, sp - strh r2, [r1, #0x34] - cmp r0, #0 - bge _08004C14 - movs r4, #4 - ldrsh r0, [r7, r4] - rsbs r0, r0, #0 - muls r0, r3, r0 - asrs r0, r0, #8 - mov r5, sl - strh r0, [r5] - ldr r0, _08004D6C @ =gUnknown_03005394 - ldrh r3, [r0] -_08004C14: - mov r2, sp - ldr r4, [sp, #0x28] - ldrh r1, [r4] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - ldrh r0, [r6] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r2] - mov r5, sp - adds r5, #2 - str r5, [sp, #0x30] - mov r0, r8 - ldrh r1, [r0] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - rsbs r1, r1, #0 - ldrh r0, [r6] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r5] - add r1, sp, #4 - mov ip, r1 - mov r2, r8 - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - mov r4, sl - ldrh r0, [r4] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - mov r5, ip - strh r0, [r5] - mov r6, sp - adds r6, #6 - str r6, [sp, #0x38] - ldr r0, [sp, #0x28] - ldrh r1, [r0] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - ldrh r0, [r4] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r6] - add r5, sp, #0x18 - ldr r1, _08004D5C @ =gUnknown_03001944 - ldrh r0, [r1] - movs r2, #0x80 - lsls r2, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #1 - ldr r4, _08004D64 @ =gSineTable - adds r0, r0, r4 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - ldr r6, _08004D68 @ =gUnknown_030017F0 - ldrh r1, [r6] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r5] - mov r2, sp - adds r2, #0x1a - ldr r1, _08004D5C @ =gUnknown_03001944 - ldrh r0, [r1] - lsls r0, r0, #1 - adds r0, r0, r4 - movs r4, #0 - ldrsh r0, [r0, r4] - rsbs r0, r0, #0 - asrs r0, r0, #6 - ldrh r1, [r6] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r2] - add r4, sp, #0x1c - ldr r6, _08004D5C @ =gUnknown_03001944 - ldrh r0, [r6] - lsls r0, r0, #1 - ldr r1, _08004D64 @ =gSineTable - adds r0, r0, r1 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - muls r0, r3, r0 - asrs r0, r0, #8 - strh r0, [r4] - mov r3, sp - adds r3, #0x1e - ldrh r0, [r6] - movs r6, #0x80 - lsls r6, r6, #1 - adds r0, r0, r6 - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - ldr r6, _08004D6C @ =gUnknown_03005394 - ldrh r1, [r6] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r3] - ldrh r0, [r5] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r5, #6 - ldrsh r1, [r7, r5] - muls r1, r0, r1 - ldrh r0, [r2] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r6, #8 - ldrsh r2, [r7, r6] - muls r0, r2, r0 - adds r1, r1, r0 - ldr r0, _08004D70 @ =gUnknown_0300194C - movs r2, #0 - ldrsh r0, [r0, r2] - lsls r0, r0, #8 - adds r1, r1, r0 - asrs r1, r1, #8 - str r1, [sp, #0x10] - ldrh r0, [r4] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r4, #6 - ldrsh r1, [r7, r4] - muls r1, r0, r1 - ldrh r0, [r3] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r5, #8 - ldrsh r2, [r7, r5] - muls r0, r2, r0 - adds r1, r1, r0 - ldr r0, _08004D74 @ =gUnknown_03002820 - movs r6, #0 - ldrsh r0, [r0, r6] - lsls r0, r0, #8 - adds r1, r1, r0 - asrs r1, r1, #8 - str r1, [sp, #0x14] - ldr r7, [sp, #0x30] - mov r8, ip - ldr r6, [sp, #0x38] - ldr r0, [sp, #0x2c] - cmp r0, #0 - ble _08004D78 - mov r1, sb - ldrh r4, [r1, #8] - ldrh r2, [r1, #4] - b _08004D86 - .align 2, 0 -_08004D58: .4byte gOamBuffer + 0x6 -_08004D5C: .4byte gUnknown_03001944 -_08004D60: .4byte 0x000003FF -_08004D64: .4byte gSineTable -_08004D68: .4byte gUnknown_030017F0 -_08004D6C: .4byte gUnknown_03005394 -_08004D70: .4byte gUnknown_0300194C -_08004D74: .4byte gUnknown_03002820 -_08004D78: - mov r2, sb - ldrh r1, [r2, #4] - ldrh r0, [r2, #8] - subs r0, r1, r0 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - adds r2, r1, #0 -_08004D86: - mov r3, sp - ldrh r3, [r3, #0x34] - lsls r0, r3, #0x10 - cmp r0, #0 - ble _08004D98 - mov r5, sb - ldrh r3, [r5, #0xa] - ldrh r5, [r5, #6] - b _08004DA6 -_08004D98: - mov r0, sb - ldrh r1, [r0, #6] - ldrh r0, [r0, #0xa] - subs r0, r1, r0 - lsls r0, r0, #0x10 - lsrs r3, r0, #0x10 - adds r5, r1, #0 -_08004DA6: - mov r0, sp - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - lsls r4, r4, #0x10 - asrs r4, r4, #0x10 - lsrs r2, r2, #1 - subs r4, r4, r2 - adds r1, r0, #0 - muls r1, r4, r1 - ldrh r0, [r7] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - lsls r3, r3, #0x10 - asrs r3, r3, #0x10 - lsrs r5, r5, #1 - subs r3, r3, r5 - muls r0, r3, r0 - adds r1, r1, r0 - lsls r2, r2, #8 - adds r1, r1, r2 - asrs r1, r1, #8 - ldr r0, [sp, #0x10] - subs r0, r0, r1 - str r0, [sp, #0x10] - mov r1, r8 - ldrh r0, [r1] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - adds r1, r0, #0 - muls r1, r4, r1 - ldrh r0, [r6] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r3, r0 - adds r1, r1, r0 - lsls r5, r5, #8 - adds r1, r1, r5 - asrs r1, r1, #8 - ldr r0, [sp, #0x14] - subs r0, r0, r1 - str r0, [sp, #0x14] - ldr r0, [sp, #0x10] - ldr r2, [sp, #0x24] - strh r0, [r2, #0x16] - ldr r0, [sp, #0x14] - strh r0, [r2, #0x18] -_08004E04: - add sp, #0x3c - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - -@ VERY similar to sub_8004860 and sub_8004ABC - thumb_func_start sub_8004E14 -sub_8004E14: @ 0x08004E14 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x40 - str r0, [sp, #0x24] - adds r6, r1, #0 - ldr r1, [r0, #0xc] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - bne _08004E30 - b _080051D8 -_08004E30: - mov sb, r1 - add r2, sp, #0x20 - ldr r1, [sp, #0x24] - ldr r0, [r1, #0x10] - movs r1, #0x1f - ands r0, r1 - strh r0, [r2] - ldrh r4, [r2] - lsls r4, r4, #5 - ldr r0, _08005128 @ =gOamBuffer + 0x6 - adds r4, r4, r0 - subs r2, #0x18 - str r2, [sp, #0x28] - ldrh r0, [r6] - ldr r3, _0800512C @ =gUnknown_03001944 - ldrh r1, [r3] - adds r0, r0, r1 - ldr r2, _08005130 @ =0x000003FF - ands r0, r2 - movs r5, #0x80 - lsls r5, r5, #1 - adds r0, r0, r5 - lsls r0, r0, #1 - ldr r7, _08005134 @ =gSineTable - adds r0, r0, r7 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - ldr r1, [sp, #0x28] - strh r0, [r1] - movs r3, #0xa - add r3, sp - mov r8, r3 - ldrh r0, [r6] - ldr r5, _0800512C @ =gUnknown_03001944 - ldrh r1, [r5] - adds r0, r0, r1 - ands r0, r2 - lsls r0, r0, #1 - adds r0, r0, r7 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - strh r0, [r3] - add r7, sp, #0xc - movs r0, #2 - ldrsh r1, [r6, r0] - ldr r2, _08005138 @ =gUnknown_030017F0 - ldrh r0, [r2] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r7] - movs r3, #0xe - add r3, sp - mov sl, r3 - movs r5, #4 - ldrsh r1, [r6, r5] - ldr r2, _0800513C @ =gUnknown_03005394 - ldrh r0, [r2] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r3] - movs r5, #0x80 - lsls r5, r5, #9 - ldrh r1, [r7] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - ldr r3, [sp, #0x28] - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4] - ldrh r1, [r7] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - mov r2, r8 - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4, #8] - mov r3, sl - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - mov r2, r8 - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - rsbs r1, r1, #0 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4, #0x10] - mov r3, sl - ldrh r1, [r3] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - adds r0, r5, #0 - bl Div - ldr r5, [sp, #0x28] - ldrh r1, [r5] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r4, #0x18] - movs r1, #2 - ldrsh r0, [r6, r1] - str r0, [sp, #0x2c] - cmp r0, #0 - bge _08004F48 - movs r2, #2 - ldrsh r0, [r6, r2] - rsbs r0, r0, #0 - ldr r3, _08005138 @ =gUnknown_030017F0 - ldrh r1, [r3] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r7] -_08004F48: - movs r4, #4 - ldrsh r0, [r6, r4] - ldr r5, _0800513C @ =gUnknown_03005394 - ldrh r4, [r5] - ldrh r2, [r6, #4] - mov r1, sp - strh r2, [r1, #0x3c] - cmp r0, #0 - bge _08004F6A - movs r3, #4 - ldrsh r0, [r6, r3] - rsbs r0, r0, #0 - muls r0, r4, r0 - asrs r0, r0, #8 - mov r4, sl - strh r0, [r4] - ldrh r4, [r5] -_08004F6A: - mov r2, sp - ldr r5, [sp, #0x28] - ldrh r1, [r5] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - ldrh r0, [r7] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r2] - mov r0, sp - adds r0, #2 - str r0, [sp, #0x30] - mov r2, r8 - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - rsbs r1, r1, #0 - ldrh r0, [r7] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - ldr r3, [sp, #0x30] - strh r0, [r3] - mov r5, sp - adds r5, #4 - str r5, [sp, #0x34] - ldrh r1, [r2] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - mov r2, sl - ldrh r0, [r2] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r5] - mov r3, sp - adds r3, #6 - str r3, [sp, #0x38] - ldr r5, [sp, #0x28] - ldrh r1, [r5] - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - ldrh r0, [r2] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r3] - add r0, sp, #0x18 - mov r8, r0 - ldr r1, _0800512C @ =gUnknown_03001944 - ldrh r0, [r1] - movs r2, #0x80 - lsls r2, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #1 - ldr r3, _08005134 @ =gSineTable - adds r0, r0, r3 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - ldr r5, _08005138 @ =gUnknown_030017F0 - ldrh r1, [r5] - adds r2, r0, #0 - muls r2, r1, r2 - lsls r2, r2, #8 - asrs r2, r2, #0x10 - ldrh r0, [r7] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - ldr r3, _08005140 @ =gUnknown_03005398 - movs r5, #0 - ldrsh r1, [r3, r5] - muls r0, r1, r0 - lsls r0, r0, #8 - asrs r0, r0, #0x10 - muls r0, r2, r0 - asrs r0, r0, #8 - mov r1, r8 - strh r0, [r1] - movs r2, #0x1a - add r2, sp - mov ip, r2 - ldr r5, _0800512C @ =gUnknown_03001944 - ldrh r0, [r5] - lsls r0, r0, #1 - ldr r1, _08005134 @ =gSineTable - adds r0, r0, r1 - movs r2, #0 - ldrsh r0, [r0, r2] - rsbs r0, r0, #0 - asrs r0, r0, #6 - ldr r5, _08005138 @ =gUnknown_030017F0 - ldrh r1, [r5] - adds r2, r0, #0 - muls r2, r1, r2 - lsls r2, r2, #8 - asrs r2, r2, #0x10 - ldrh r0, [r7] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r7, #0 - ldrsh r1, [r3, r7] - muls r0, r1, r0 - lsls r0, r0, #8 - asrs r0, r0, #0x10 - muls r0, r2, r0 - asrs r0, r0, #8 - mov r1, ip - strh r0, [r1] - add r5, sp, #0x1c - ldr r2, _0800512C @ =gUnknown_03001944 - ldrh r0, [r2] - lsls r0, r0, #1 - ldr r7, _08005134 @ =gSineTable - adds r0, r0, r7 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - adds r2, r0, #0 - muls r2, r4, r2 - lsls r2, r2, #8 - asrs r2, r2, #0x10 - mov r1, sl - ldrh r0, [r1] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r4, #0 - ldrsh r1, [r3, r4] - muls r0, r1, r0 - lsls r0, r0, #8 - asrs r0, r0, #0x10 - muls r0, r2, r0 - asrs r0, r0, #8 - strh r0, [r5] - mov r4, sp - adds r4, #0x1e - ldr r7, _0800512C @ =gUnknown_03001944 - ldrh r0, [r7] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r2, _08005134 @ =gSineTable - adds r0, r0, r2 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x16 - ldr r7, _0800513C @ =gUnknown_03005394 - ldrh r1, [r7] - adds r2, r0, #0 - muls r2, r1, r2 - lsls r2, r2, #8 - asrs r2, r2, #0x10 - mov r1, sl - ldrh r0, [r1] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r7, #0 - ldrsh r1, [r3, r7] - muls r0, r1, r0 - lsls r0, r0, #8 - asrs r0, r0, #0x10 - muls r0, r2, r0 - asrs r0, r0, #8 - strh r0, [r4] - mov r1, r8 - ldrh r0, [r1] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r2, #6 - ldrsh r1, [r6, r2] - muls r1, r0, r1 - mov r3, ip - ldrh r0, [r3] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r7, #8 - ldrsh r2, [r6, r7] - muls r0, r2, r0 - adds r1, r1, r0 - ldr r0, _08005144 @ =gUnknown_0300194C - movs r2, #0 - ldrsh r0, [r0, r2] - lsls r0, r0, #8 - adds r1, r1, r0 - asrs r1, r1, #8 - str r1, [sp, #0x10] - ldrh r0, [r5] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r3, #6 - ldrsh r1, [r6, r3] - muls r1, r0, r1 - ldrh r0, [r4] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r4, #8 - ldrsh r2, [r6, r4] - muls r0, r2, r0 - adds r1, r1, r0 - ldr r0, _08005148 @ =gUnknown_03002820 - movs r5, #0 - ldrsh r0, [r0, r5] - lsls r0, r0, #8 - adds r1, r1, r0 - asrs r1, r1, #8 - str r1, [sp, #0x14] - ldr r6, [sp, #0x30] - ldr r7, [sp, #0x34] - ldr r0, [sp, #0x38] - mov r8, r0 - ldr r1, [sp, #0x2c] - cmp r1, #0 - ble _0800514C - mov r2, sb - ldrh r4, [r2, #8] - ldrh r2, [r2, #4] - b _0800515A - .align 2, 0 -_08005128: .4byte gOamBuffer + 0x6 -_0800512C: .4byte gUnknown_03001944 -_08005130: .4byte 0x000003FF -_08005134: .4byte gSineTable -_08005138: .4byte gUnknown_030017F0 -_0800513C: .4byte gUnknown_03005394 -_08005140: .4byte gUnknown_03005398 -_08005144: .4byte gUnknown_0300194C -_08005148: .4byte gUnknown_03002820 -_0800514C: - mov r3, sb - ldrh r1, [r3, #4] - ldrh r0, [r3, #8] - subs r0, r1, r0 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - adds r2, r1, #0 -_0800515A: - mov r5, sp - ldrh r5, [r5, #0x3c] - lsls r0, r5, #0x10 - cmp r0, #0 - ble _0800516C - mov r0, sb - ldrh r3, [r0, #0xa] - ldrh r5, [r0, #6] - b _0800517A -_0800516C: - mov r3, sb - ldrh r1, [r3, #6] - ldrh r0, [r3, #0xa] - subs r0, r1, r0 - lsls r0, r0, #0x10 - lsrs r3, r0, #0x10 - adds r5, r1, #0 -_0800517A: - mov r0, sp - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - lsls r4, r4, #0x10 - asrs r4, r4, #0x10 - lsrs r2, r2, #1 - subs r4, r4, r2 - adds r1, r0, #0 - muls r1, r4, r1 - ldrh r0, [r6] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - lsls r3, r3, #0x10 - asrs r3, r3, #0x10 - lsrs r5, r5, #1 - subs r3, r3, r5 - muls r0, r3, r0 - adds r1, r1, r0 - lsls r2, r2, #8 - adds r1, r1, r2 - asrs r1, r1, #8 - ldr r0, [sp, #0x10] - subs r0, r0, r1 - str r0, [sp, #0x10] - ldrh r0, [r7] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - adds r1, r0, #0 - muls r1, r4, r1 - mov r4, r8 - ldrh r0, [r4] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - muls r0, r3, r0 - adds r1, r1, r0 - lsls r5, r5, #8 - adds r1, r1, r5 - asrs r1, r1, #8 - ldr r0, [sp, #0x14] - subs r0, r0, r1 - str r0, [sp, #0x14] - ldr r0, [sp, #0x10] - ldr r5, [sp, #0x24] - strh r0, [r5, #0x16] - ldr r0, [sp, #0x14] - strh r0, [r5, #0x18] -_080051D8: - add sp, #0x40 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 diff --git a/graphics/boss_8_a.pal b/graphics/boss_8_a.pal new file mode 100644 index 000000000..f015b2cdc --- /dev/null +++ b/graphics/boss_8_a.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 74 41 +255 255 255 +213 213 230 +180 172 205 +139 131 172 +98 90 148 +57 49 123 +16 8 98 +0 0 0 +238 65 16 +172 49 0 +115 16 0 +255 139 0 +255 205 0 +49 255 106 +0 205 123 diff --git a/graphics/boss_8_b.pal b/graphics/boss_8_b.pal new file mode 100644 index 000000000..3acde331f --- /dev/null +++ b/graphics/boss_8_b.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 180 238 +197 0 131 +205 41 139 +213 82 156 +222 123 172 +230 164 180 +246 205 197 +255 246 205 +255 255 255 +197 189 246 +213 205 255 +230 238 255 +197 115 255 +197 49 255 +246 0 205 +255 49 197 diff --git a/include/animation_commands.h b/include/animation_commands.h index 3898d703e..6d601c56e 100644 --- a/include/animation_commands.h +++ b/include/animation_commands.h @@ -117,6 +117,6 @@ typedef union { ACmd_ShowFrame show; } ACmd; -u32 sub_8004518(u16 num); +u32 Base10DigitsToHexNibbles(u16 num); #endif // GUARD_ANIMATION_COMMANDS_H diff --git a/include/bg_triangles.h b/include/bg_triangles.h index 1c75523d3..7f4f191cb 100644 --- a/include/bg_triangles.h +++ b/include/bg_triangles.h @@ -13,6 +13,7 @@ typedef struct { } TriParam1; extern void sub_800724C(u8 bg, TriParam1 *param1); +extern void sub_80075D0(u8 bg, u8 param1, u8 param2, s16 param3, u16 param4, u16 param5); extern void sub_8007858(u8 param0, u8 param1, u8 param2, u16 param3, u16 param4); extern void sub_80078D4(u8 bg, int_vcount minY, int_vcount maxY, u16 offsetEven, u16 offsetOdd); diff --git a/include/constants/animations.h b/include/constants/animations.h index 8c30b450d..c53ecee59 100644 --- a/include/constants/animations.h +++ b/include/constants/animations.h @@ -390,6 +390,14 @@ #define SA2_ANIM_EGG_FROG_BOMB_FLAME 699 #define SA2_ANIM_EGG_FROG_ARM_SEGMENT 700 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_PLATFORM 701 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_PLATFORM_PROP 702 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_ARM_LEFT 703 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_ARM_RIGHT 704 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD 705 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_PROJ 706 +#define SA2_ANIM_SUPER_EGG_ROBO_Z_CLOUD 707 + #define SA2_ANIM_ITEMBOX 724 #define SA2_ANIM_ITEMBOX_TYPE 725 diff --git a/include/core.h b/include/core.h index f443cfced..8bcad1b52 100644 --- a/include/core.h +++ b/include/core.h @@ -308,7 +308,7 @@ extern s32 gPseudoRandom; extern u8 gUnknown_03002710[128]; extern struct MultiBootParam gMultiBootParam; -extern const struct SpriteTables *gUnknown_03002794; +extern const struct SpriteTables *gRefSpriteTables; void GameInit(void); void GameLoop(void); diff --git a/include/game/bosses/common.h b/include/game/bosses/common.h index 47d229beb..a1f0e4d4c 100644 --- a/include/game/bosses/common.h +++ b/include/game/bosses/common.h @@ -45,6 +45,7 @@ typedef struct { // Use EBoss enum when calling with constants void CreateZoneBoss(u8 boss); void CreateBossParticleWithExplosionUpdate(ExplosionPartsInfo *p0, u8 *numCreatedParts); +void CreateBossParticleStatic(ExplosionPartsInfo *info, u8 *numCreatedParts); void Task_DestroyBossParts(void); void sub_8039ED4(void); void sub_8039F14(s32 p0, s32 p1); diff --git a/include/game/cheese.h b/include/game/cheese.h index 4ee55f0e2..67b01770c 100644 --- a/include/game/cheese.h +++ b/include/game/cheese.h @@ -35,7 +35,7 @@ typedef struct { /* 0x1C */ Sprite s; /* 0x4C */ Hitbox reserved; /* 0x54 */ Cheese_UNK54 unk54; - /* 0x6C */ MultiplayerPlayer *unk6C; + /* 0x6C */ MultiplayerPlayer *mpp; } Cheese; /* size: 0x70 */ extern Cheese *gCheese; diff --git a/include/game/multiplayer/mp_player.h b/include/game/multiplayer/mp_player.h index 6a37dbc8b..957d2c72b 100644 --- a/include/game/multiplayer/mp_player.h +++ b/include/game/multiplayer/mp_player.h @@ -14,9 +14,7 @@ typedef struct { s32 unk44; s32 unk48; u32 unk4C; - // x - s16 unk50; - s16 unk52; + Vec2_16 pos; u16 unk54; u8 unk56; u8 unk57; diff --git a/include/game/stage/player.h b/include/game/stage/player.h index eaeee92a8..81747aa09 100644 --- a/include/game/stage/player.h +++ b/include/game/stage/player.h @@ -14,8 +14,8 @@ void Player_SetMovestate_IsInScriptedSequence(void); void Player_ClearMovestate_IsInScriptedSequence(void); void InitializePlayer(Player *p); -void sub_80218E4(Player *); -void sub_8023B5C(Player *, s8); +void Player_TransitionCancelFlyingAndBoost(Player *p); +void sub_8023B5C(Player *, s32); void sub_8023260(Player *); void sub_80232D0(Player *); void sub_8023610(Player *); diff --git a/include/game/stage/screen_shake.h b/include/game/stage/screen_shake.h index 73db873b4..a4886c577 100644 --- a/include/game/stage/screen_shake.h +++ b/include/game/stage/screen_shake.h @@ -6,7 +6,11 @@ struct Task *CreateScreenShake(u32 p0, u32 p1, u32 p2, u32 p3, u32 flags); -#define SCREENSHAKE_HORIZONTAL 0x40 -#define SCREENSHAKE_VERTICAL 0x80 +#define SCREENSHAKE_FACTOR_POSITIVE 0x1 +#define SCREENSHAKE_FACTOR_NEGATIVE 0x2 +#define SCREENSHAKE_FACTOR_MASK 0x3 +#define SCREENSHAKE_RANDOM_VALUE 0x10 +#define SCREENSHAKE_HORIZONTAL 0x40 +#define SCREENSHAKE_VERTICAL 0x80 #endif // GUARD_SCREEN_SHAKE_H \ No newline at end of file diff --git a/include/gba/syscall.h b/include/gba/syscall.h index 9f56497c4..2fcaae2bf 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -55,12 +55,6 @@ int MultiBoot(struct MultiBootParam *mp); s32 Div(s32 num, s32 denom); s32 DivArm(s32 denom, s32 num); - -#if (!defined(PLATFORM_GBA) || (PLATFORM_GBA == 0)) -// TODO: Weird hack to get around this: -// >> Error: invalid use of operator "Mod" -#define Mod(a, b) _Mod(a, b) -#endif s32 Mod(s32 num, s32 denom); s32 ModArm(s32 denom, s32 num); diff --git a/include/global.h b/include/global.h index 8ebe66a67..31ff2dbeb 100644 --- a/include/global.h +++ b/include/global.h @@ -17,7 +17,6 @@ typedef void (*VoidFn)(void); #if (PORTABLE) #define BUG_FIX -#define UB_FIX #if !(defined NON_MATCHING) #define NON_MATCHING 1 diff --git a/include/sakit/globals.h b/include/sakit/globals.h index c524e216c..977bec610 100644 --- a/include/sakit/globals.h +++ b/include/sakit/globals.h @@ -202,7 +202,7 @@ extern u8 gUnknown_030055D8; } // if-else only matches like this in some cases -#define INCREMENT_SCORE_B(incVal) \ +#define INCREMENT_SCORE_B_BASE(incVal, _unk3) \ { \ s32 divResA, divResB; \ s32 oldScore = gLevelScore; \ @@ -221,10 +221,16 @@ extern u8 gUnknown_030055D8; gNumLives = lives; \ } \ \ - gUnknown_030054A8.unk3 = 16; \ + gUnknown_030054A8.unk3 = _unk3; \ } \ } +#define INCREMENT_SCORE_B(incVal) INCREMENT_SCORE_B_BASE(incVal, 16) + +#define INCREMENT_SCORE_C(incVal) \ + INCREMENT_SCORE_A(incVal) \ + gUnknown_030054A8.unk1 = 48; + #define INCREMENT_SCORE(incVal) \ { \ s32 divResA, divResB; \ diff --git a/include/sakit/player.h b/include/sakit/player.h index a650d8a4c..57787e50b 100644 --- a/include/sakit/player.h +++ b/include/sakit/player.h @@ -11,7 +11,7 @@ typedef struct { /*0x00 */ SpriteTransform transform; /*0x0C */ Sprite s; /*0x3C */ Hitbox reserved; -} PlayerSpriteInfo; /* 0x30 */ +} PlayerSpriteInfo; /* size: 0x44 */ extern PlayerSpriteInfo gUnknown_03005AA0; extern PlayerSpriteInfo gUnknown_03005AF0; diff --git a/include/sprite.h b/include/sprite.h index cefbb30bf..c5a8fbaaa 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -199,6 +199,21 @@ typedef struct { /* 0x08 */ s16 y; } SpriteTransform; /* size 0xA */ +// TODO: Move back into sprite_2.c! +typedef struct { + /* 0x00 */ u16 unk0[4]; + /* 0x08 */ s16 qDirX; + /* 0x0A */ s16 qDirY; + + /* 0x0C */ s16 unkC[2]; + + /* 0x10 */ s32 posX; + /* 0x14 */ s32 posY; + + /* 0x18 */ s16 unk18[2][2]; + /* 0x20 */ u16 affineIndex; +} UnkSpriteStruct; + typedef struct { /* 0x00 */ u32 numTiles; /* 0x04 */ AnimId anim; diff --git a/ldscript.txt b/ldscript.txt index b4710fc25..cc5b02465 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -90,19 +90,9 @@ SECTIONS src/sio32_multi_load.o(.text); src/core.o(.text); src/main.o(.text); -#if (ENABLE_DECOMP_CREDITS == 1) - src/game/decomp_credits.o(.text); - src/game/decomp_credits.o(.rodata); -#endif src/task.o(.text); - src/bg_update.o(.text); - src/animation_commands_bg.o(.text); - src/sprite_2.o(.text); -#if (CPU_ARCH_ARM == 1) - asm/sprite_2.o(.text); -#endif - src/sprite_3.o(.text); - src/animation_commands.o(.text); + src/background.o(.text); + src/sprite.o(.text); #if (CPU_ARCH_ARM == 1) asm/bg_triangles_unused_0.o(.text); #endif @@ -234,8 +224,8 @@ SECTIONS src/game/bosses/boss_run.o(.text); #if (CPU_ARCH_ARM == 1) asm/boss_run.o(.text); - asm/boss_8.o(.text); #endif + src/game/bosses/boss_8.o(.text); src/game/bosses/boss_9.o(.text); #if (CPU_ARCH_ARM == 1) asm/boss_9.o(.text); @@ -380,6 +370,11 @@ SECTIONS src/game/cutscenes/final_ending_fall.o(.text); src/game/cutscenes/final_ending_land.o(.text); src/game/cutscenes/missing_emeralds.o(.text); + +#if (ENABLE_DECOMP_CREDITS == 1) + src/game/decomp_credits.o(.text); + src/game/decomp_credits.o(.rodata); +#endif /* libs */ #if (CPU_ARCH_ARM == 1) @@ -424,11 +419,9 @@ SECTIONS src/multi_sio.o(.rodata); src/sio32_multi_load.o(.rodata); src/core.o(.rodata); - src/animation_commands_bg.o(.rodata); + src/background.o(.rodata); src/trig.o(.rodata); - src/sprite_2.o(.rodata); - src/animation_commands.o(.rodata); - src/sprite_3.o(.rodata); + src/sprite.o(.rodata); src/bg_triangles.o(.rodata); src/malloc_ewram.o(.rodata); src/malloc_vram.o(.rodata); @@ -503,7 +496,9 @@ SECTIONS src/game/bosses/boss_7.o(.rodata); #if (CPU_ARCH_ARM == 1) asm/boss_run.o(.rodata); - asm/boss_8.o(.rodata); +#endif + src/game/bosses/boss_8.o(.rodata); +#if (CPU_ARCH_ARM == 1) asm/boss_9.o(.rodata); #endif src/game/enemies/kubinaga.o(.rodata); diff --git a/src/animation_commands.c b/src/animation_commands.c deleted file mode 100644 index d6f3f4013..000000000 --- a/src/animation_commands.c +++ /dev/null @@ -1,153 +0,0 @@ -#include "global.h" -#include "lib/m4a.h" - -#include "flags.h" -#include "sprite.h" -#include "data/sprite_data.h" - -#include "animation_commands.h" - -extern AnimCmdResult animCmd_GetTiles(void *cursor, Sprite *s); -static AnimCmdResult animCmd_GetPalette(void *cursor, Sprite *s); -static AnimCmdResult animCmd_JumpBack(void *cursor, Sprite *s); -static AnimCmdResult animCmd_End(void *cursor, Sprite *s); -static AnimCmdResult animCmd_PlaySoundEffect(void *cursor, Sprite *s); -extern AnimCmdResult animCmd_AddHitbox(void *cursor, Sprite *s); -static AnimCmdResult animCmd_TranslateSprite(void *cursor, Sprite *s); -static AnimCmdResult animCmd_8(void *cursor, Sprite *s); -static AnimCmdResult animCmd_SetIdAndVariant(void *cursor, Sprite *s); -extern AnimCmdResult animCmd_10(void *cursor, Sprite *s); -static AnimCmdResult animCmd_SetSpritePriority(void *cursor, Sprite *s); -static AnimCmdResult animCmd_SetOamOrder(void *cursor, Sprite *s); - -// make static -const AnimationCommandFunc animCmdTable[] = { - // 0x080984AC - animCmd_GetTiles, animCmd_GetPalette, - animCmd_JumpBack, animCmd_End, - animCmd_PlaySoundEffect, animCmd_AddHitbox, - animCmd_TranslateSprite, animCmd_8, - animCmd_SetIdAndVariant, animCmd_10, - animCmd_SetSpritePriority, animCmd_SetOamOrder, -}; - -#define ReadInstruction(script, cursor) ((void *)(script) + (cursor * sizeof(s32))) - -// (-2) -AnimCmdResult animCmd_GetPalette(void *cursor, Sprite *s) -{ - ACmd_GetPalette *cmd = (ACmd_GetPalette *)cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - if (!(s->unk10 & SPRITE_FLAG_MASK_18)) { - s32 paletteIndex = cmd->palId; - - DmaCopy32(3, &gUnknown_03002794->palettes[paletteIndex * 16], - &gObjPalette[s->palId * 16 + cmd->insertOffset], cmd->numColors * 2); - - gFlags |= FLAGS_UPDATE_SPRITE_PALETTES; - } - - return ACMD_RESULT__RUNNING; -} - -// (-3) -AnimCmdResult animCmd_JumpBack(void *cursor, Sprite *s) -{ - ACmd_JumpBack *cmd = cursor; - s->animCursor -= cmd->offset; - - return ACMD_RESULT__RUNNING; -} - -// (-4) -AnimCmdResult animCmd_End(void *cursor, Sprite *s) -{ - SPRITE_FLAG_SET(s, ANIM_OVER); - - return ACMD_RESULT__ENDED; -} - -// (-5) -AnimCmdResult animCmd_PlaySoundEffect(void *cursor, Sprite *s) -{ - ACmd_PlaySoundEffect *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - m4aSongNumStart(cmd->songId); - - return ACMD_RESULT__RUNNING; -} - -// (-7) -AnimCmdResult animCmd_TranslateSprite(void *cursor, Sprite *s) -{ - ACmd_TranslateSprite *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - s->x += cmd->x; - s->y += cmd->y; - - return ACMD_RESULT__RUNNING; -} - -// (-8) -AnimCmdResult animCmd_8(void *cursor, Sprite *s) -{ - ACmd_8 *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - return ACMD_RESULT__RUNNING; -} - -// (-9) -AnimCmdResult animCmd_SetIdAndVariant(void *cursor, Sprite *s) -{ - ACmd_SetIdAndVariant *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - s->graphics.anim = cmd->animId; - s->prevVariant = -1; - s->variant = cmd->variant; - - return ACMD_RESULT__ANIM_CHANGED; -} - -// (-10) -AnimCmdResult animCmd_10(void *cursor, Sprite *s) -{ - ACmd_10 *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - -#ifdef UB_FIX - return ACMD_RESULT__RUNNING; // I think this should be the correct behavior? -#else - return (s32)cursor; -#endif -} - -// (-11) -// Sets the priority the sprite has in OAM (0 - 3) -AnimCmdResult animCmd_SetSpritePriority(void *cursor, Sprite *s) -{ - ACmd_SetSpritePriority *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - SPRITE_FLAG_CLEAR(s, PRIORITY); - SPRITE_FLAG_SET_VALUE(s, PRIORITY, cmd->priority); - - return ACMD_RESULT__RUNNING; -} - -// (-12) -// Sets the index 's' is expected to be put at in OAM -// compared to sprites with a lower/higher value (0 - 31) -AnimCmdResult animCmd_SetOamOrder(void *cursor, Sprite *s) -{ - ACmd_SetOamOrder *cmd = cursor; - - s->animCursor += AnimCommandSizeInWords(*cmd); - s->unk1A = SPRITE_OAM_ORDER(cmd->orderIndex); - - return ACMD_RESULT__RUNNING; -} \ No newline at end of file diff --git a/src/animation_commands_bg.c b/src/animation_commands_bg.c deleted file mode 100644 index f692567cd..000000000 --- a/src/animation_commands_bg.c +++ /dev/null @@ -1,776 +0,0 @@ -#include -#include "global.h" -#include "gba/syscall.h" -#include "core.h" -#include "lib/m4a.h" -#include "trig.h" - -#include "flags.h" -#include "sprite.h" -#include "data/sprite_data.h" - -#include "animation_commands.h" - -static AnimCmdResult animCmd_GetTiles_BG(void *, Sprite *); -static AnimCmdResult animCmd_GetPalette_BG(void *, Sprite *); -static AnimCmdResult animCmd_JumpBack_BG(void *, Sprite *); -static AnimCmdResult animCmd_End_BG(void *, Sprite *); -static AnimCmdResult animCmd_PlaySoundEffect_BG(void *, Sprite *); -static AnimCmdResult animCmd_AddHitbox_BG(void *, Sprite *); -static AnimCmdResult animCmd_TranslateSprite_BG(void *, Sprite *); -static AnimCmdResult animCmd_8_BG(void *, Sprite *); -static AnimCmdResult animCmd_SetIdAndVariant_BG(void *, Sprite *); -static AnimCmdResult animCmd_10_BG(void *, Sprite *); -static AnimCmdResult animCmd_SetSpritePriority_BG(void *, Sprite *); -static AnimCmdResult animCmd_SetOamOrder_BG(void *, Sprite *); - -#define ReadInstruction(script, cursor) ((void *)(script) + (cursor * sizeof(s32))) - -const AnimationCommandFunc animCmdTable_BG[12] = { - animCmd_GetTiles_BG, animCmd_GetPalette_BG, - animCmd_JumpBack_BG, animCmd_End_BG, - animCmd_PlaySoundEffect_BG, animCmd_AddHitbox_BG, - animCmd_TranslateSprite_BG, animCmd_8_BG, - animCmd_SetIdAndVariant_BG, animCmd_10_BG, - animCmd_SetSpritePriority_BG, animCmd_SetOamOrder_BG, -}; - -void UpdateBgAnimationTiles(Background *bg) -{ - struct MapHeader *header = gTilemapsRef[bg->tilemapId]; - if (header->h.animFrameCount) { - if (header->h.animDelay <= ++bg->animDelayCounter) { - u32 animTileSize; - - bg->animDelayCounter = 0; - - if (header->h.animFrameCount <= ++bg->animFrameCounter) - bg->animFrameCounter = 0; - - animTileSize = header->h.animTileSize; - - if (!(bg->flags & BACKGROUND_UPDATE_ANIMATIONS)) { - if (bg->animFrameCounter == 0) { - bg->graphics.src = header->h.tiles; - } else { - const u8 *tiles = header->h.tiles; - u32 size = header->h.tilesSize; - tiles += size; - tiles += (bg->animFrameCounter - 1) * animTileSize; - bg->graphics.src = tiles; - } - } else { - u8 *ts = bg->graphics.dest; - ts += header->h.tilesSize; - ts += (bg->animFrameCounter * animTileSize); - bg->graphics.src = ts; - } - { - u32 queueIndex; - bg->graphics.size = animTileSize; - gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &bg->graphics; - queueIndex = gVramGraphicsCopyQueueIndex + 1; - queueIndex %= ARRAY_COUNT(gVramGraphicsCopyQueue); - gVramGraphicsCopyQueueIndex = queueIndex; - } - } - } -} - -// Differences to UpdateSpriteAnimation: -// - SPRITE_MAYBE_SWITCH_ANIM gets executed *after* the if. -// - Uses animCmdTable_BG instead of animCmdTable -s32 sub_80036E0(Sprite *s) -{ - if (s->unk10 & SPRITE_FLAG_MASK_ANIM_OVER) - return 0; - - SPRITE_MAYBE_SWITCH_ANIM(s); - - if (s->timeUntilNextFrame > 0) - s->timeUntilNextFrame -= s->animSpeed * 16; - else { - s32 ret; - const ACmd *cmd; - const ACmd *script; - const ACmd **variants; - - // Handle all the "regular" Animation commands with an ID < 0 - variants = gUnknown_03002794->animations[s->graphics.anim]; - script = variants[s->variant]; - cmd = ReadInstruction(script, s->animCursor); - while (cmd->id < 0) { - // TODO: Fix types to make these const - ret = animCmdTable_BG[~cmd->id]((void *)cmd, s); - if (ret != 1) { -#ifndef NON_MATCHING - register const ACmd *newScript asm("r1"); -#else - ACmd *newScript; -#endif - if (ret != -1) { - return ret; - } - - // animation has changed - variants = gUnknown_03002794->animations[s->graphics.anim]; - newScript = (ACmd *)variants[s->variant]; - // reset cursor - s->animCursor = 0; - // load the new script - script = newScript; - } - cmd = ReadInstruction(script, s->animCursor); - } - - // Display the image 'index' for 'delay' frames - s->timeUntilNextFrame += (((ACmd_ShowFrame *)cmd)->delay << 8); - s->timeUntilNextFrame -= s->animSpeed * 16; - { - s32 frame = ((ACmd_ShowFrame *)cmd)->index; - if (frame != -1) { - const struct SpriteTables *sprTables = gUnknown_03002794; - - s->dimensions = &sprTables->dimensions[s->graphics.anim][frame]; - } else { - s->dimensions = (void *)-1; - } - } - - s->animCursor += 2; - } - return 1; -} - -// (-1) -// No differences to animCmd_GetTiles -AnimCmdResult animCmd_GetTiles_BG(void *cursor, Sprite *s) -{ - ACmd_GetTiles *cmd = (ACmd_GetTiles *)cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - if ((s->unk10 & SPRITE_FLAG_MASK_19) == 0) { - if (cmd->tileIndex < 0) { - s->graphics.src - = &gUnknown_03002794->tiles_8bpp[cmd->tileIndex * TILE_SIZE_8BPP]; - s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_8BPP; - } else { - s->graphics.src - = &gUnknown_03002794->tiles_4bpp[cmd->tileIndex * TILE_SIZE_4BPP]; - s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_4BPP; - } - - gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &s->graphics; - gVramGraphicsCopyQueueIndex = (gVramGraphicsCopyQueueIndex + 1) & 0x1F; - } - - return 1; -} - -// (-6) -// Differences to animCmd_AddHitbox: -// - uses XOR_SWAP macro instead of SWAP_AND_NEGATE -// TODO: rename animCmd_AddHitbox_BG -AnimCmdResult animCmd_AddHitbox_BG(void *cursor, Sprite *s) -{ - ACmd_Hitbox *cmd = (ACmd_Hitbox *)cursor; - s32 index = cmd->hitbox.index & 0xF; - s->animCursor += AnimCommandSizeInWords(*cmd); - - DmaCopy32(3, &cmd->hitbox, &s->hitboxes[index].index, 8); - - if ((cmd->hitbox.left == 0) && (cmd->hitbox.top == 0) && (cmd->hitbox.right == 0) - && (cmd->hitbox.bottom == 0)) { - s->hitboxes[index].index = -1; - } else { - if (s->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { - XOR_SWAP(s->hitboxes[index].top, s->hitboxes[index].bottom); - } - - if (s->unk10 & SPRITE_FLAG_MASK_X_FLIP) { - XOR_SWAP(s->hitboxes[index].left, s->hitboxes[index].right); - } - } - - return 1; -} - -void sub_8003914(Sprite *s) -{ - const SpriteOffset *dims; - gUnknown_03004D10[gUnknown_03005390] = s; - gUnknown_03005390++; - - if (s->dimensions != (void *)-1) { - u32 bgId; - - dims = s->dimensions; - bgId = SPRITE_FLAG_GET(s, BG_ID); - // Potential UB: - // gDispCnt 'Mode' is an int, not a bitfield! - if ((bgId > 1) && (gDispCnt & (DISPCNT_MODE_1 | DISPCNT_MODE_2))) { - // __sub_8003954 - s32 affineX, affineY; - s32 posX, posY; - - posX = dims->offsetX - s->x; - affineX = Mod(posX, 16); - gBgAffineRegs[bgId - 2].x = Q(affineX); - - posY = dims->offsetY - s->y; - affineY = Mod(posY, 8); - gBgAffineRegs[bgId - 2].y = Q(affineY); - } else { - // _080039A4 - s32 scrollX, scrollY; - s32 posX, posY; - - posX = dims->offsetX - s->x; - scrollX = Mod(posX, 16); - gBgScrollRegs[bgId][0] = scrollX; - - posY = dims->offsetY - s->y; - scrollY = Mod(posY, 8); - gBgScrollRegs[bgId][1] = scrollY; - } - } -} - -// Some VBlank function -// (21.30%) https://decomp.me/scratch/UfJX7 -NONMATCH("asm/non_matching/engine/sub_80039E4.inc", bool32 sub_80039E4(void)) -{ - // tilesize (could be 32 and get optimized out?) - s32 sp28 = 5; - - if (!(REG_DISPSTAT & DISPSTAT_VBLANK)) { - return FALSE; - } - - return TRUE; - - if (gUnknown_03005390 != 0) { - OamDataShort oam; - s32 r5; - s32 sp08; - u16 shapeAndSize; - Sprite *s; // = sp0C - const SpriteOffset *dims; - u32 sp10; // bg_affine_pixelcount - const u16 *const *oamSub; - OamDataShort *sp1C; - u32 tilesX; // =sp20 - u32 tilesY; // =ip - s32 xPos; // =r8 - s32 yPos; // =r5 - u16 oamX, oamY; - - for (r5 = 0; r5 < gUnknown_03005390; r5++) { - // _08003A1A - s = gUnknown_03004D10[r5]; - dims = s->dimensions; - - if (dims != (void *)-1) { - u32 bgId = SPRITE_FLAG_GET(s, BG_ID); - void *bgVram - = (void *)BG_CHAR_ADDR((gBgCntRegs[bgId] & BGCNT_CHARBASE(3)) >> 2); - void *bgBase = bgVram + ((gBgCntRegs[bgId] & BGCNT_SCREENBASE(31)) * 8); - - if (gBgCntRegs[bgId] & BGCNT_256COLOR) { - // tilesize (could be 32 and get optimized out?) - sp28 = 6; - } - - // TODO: Remove this comment if it matches without what it says - // NOTE: This might be the following: - // (... && ((gDispCnt & DISPCNT_MODE_1) || (gDispCnt & - // DISPCNT_MODE_2))) But it would be UB in that case, since the - // mode is determined by 3 bits, so the value could also be - // DISPCNT_MODE_3 or DISPCNT_MODE_5. - if ((bgId >= 2) && ((gDispCnt & 0x3) != DISPCNT_MODE_0)) { - // _08003A84 - // u16 sp24; - u8 sp30; - s32 shrunkTileId; - void *r7; - u16 affine = (gBgCntRegs[bgId] & BGCNT_AFF1024x1024) >> 14; - sp10 = ((1024 * 1024) << affine) >> 16; - oamSub = gUnknown_03002794->oamData; - - // OAM entry for this sub-frame - sp1C = (OamDataShort *)oamSub[s->graphics.anim]; - sp1C = &sp1C[dims->oamIndex]; - - for (sp08 = 0; sp08 < dims->numSubframes; sp08++) { - u16 tileId; - // _08003ABE - sp30 = sp10; - DmaCopy16(3, sp1C, &oam, sizeof(OamDataShort)); - sp1C++; - - shapeAndSize = oam.shape << 2; - shapeAndSize |= oam.size; - tilesX = gOamShapesSizes[shapeAndSize][0] >> 3; - tilesY = gOamShapesSizes[shapeAndSize][1] >> 3; - yPos = s->y - dims->offsetY; - xPos = s->x - dims->offsetX; - xPos &= ~0xF; - r7 = bgBase + (((oam.y + yPos) >> 3) * sp10); - tileId = ((size_t)(s->graphics.dest - bgVram)) >> sp28; - shrunkTileId = (oam.tileNum + tileId) & 0xFF; - - // __08003B68 - // sp08++; - while (tilesY-- != 0) { - // _08003B74 - //(r7 + (oam.tileNum >> 3)); - - // UNFINISHED // - } - } - } else { - // _08003C2C - u8 bgReg = (gBgCntRegs[bgId] >> 14); - if (bgReg == 2 || bgReg == 3) { - sp10 = 0x40; - } - // _08003C46 - sp1C = (OamDataShort *)gUnknown_03002794->oamData[s->graphics.anim]; - sp1C = (OamDataShort *)&sp1C[dims->oamIndex]; - - // _08003C78 - for (sp08 = 0; sp08 < dims->numSubframes; sp08++) { - s32 someOffsetY; - u32 yFlip; - DmaCopy16(3, sp1C, &oam, sizeof(OamDataShort)); - sp1C++; - - shapeAndSize = oam.shape << 2; - shapeAndSize |= oam.size; - tilesX = gOamShapesSizes[shapeAndSize][0] >> 3; - tilesY = gOamShapesSizes[shapeAndSize][1] >> 3; - oamY = oam.y; - oamX = oam.x; - oam.paletteNum += s->palId; - // __08003CD8 - - yFlip = s->unk10 >> SPRITE_FLAG_SHIFT_Y_FLIP; - yFlip ^= (dims->flip >> 1); - - if (yFlip & 1) { - // ___08003CEE - // alt: oam.all.attr1 ^ 0x2000 - oam.matrixNum ^= 0x4; // do flip Y in OAM - if (dims->flip & 0x1) { - // __08003D04 - someOffsetY = s->y + dims->offsetY; - } else { - // _08003D2C - someOffsetY = s->y + (dims->height - dims->offsetY); - } - // _08003D3C - someOffsetY -= 8; - oamX = -oamX; - } else { - // _08003D4A - someOffsetY = s->y - dims->offsetY; - } - - if ((SPRITE_FLAG_GET(s, X_FLIP) & 0x1) != (dims->flip & 0x1)) { - - } else { - //_08003DB4 - } - } - } - } - } - - gUnknown_03005390 = 0; - } - - return TRUE; -} -END_NONMATCH - -void sub_8003EE4(u16 p0, s16 p1, s16 p2, s16 p3, s16 p4, s16 p5, s16 p6, - BgAffineReg *affine) -{ - affine->pa = (COS_24_8(p0) * (s16)Div(0x10000, p1)) >> 8; - affine->pb = (SIN_24_8(p0) * (s16)Div(0x10000, p1)) >> 8; - affine->pc = ((-SIN(p0) >> 6) * (s16)Div(0x10000, p2)) >> 8; - affine->pd = (COS_24_8(p0) * (s16)Div(0x10000, p2)) >> 8; - - p5 *= -1; - p6 *= -1; - { - // __sub_8003FA8 - s32 r1 = (s16)affine->pa * p5; - s32 r3 = (s16)affine->pb * p6; - - affine->x = (r1 + r3) + p3 * 256; - } - { - // __sub_8003FBE - s32 r1 = (s16)affine->pc * p5; - s32 r3 = (s16)affine->pd * p6; - - affine->y = (r1 + r3) + p4 * 256; - } -} - -// (57.61%) https://decomp.me/scratch/6Xm6S -// (58.36%) https://decomp.me/scratch/ClyxP -// (48.23%) https://decomp.me/scratch/bDTEe -#if 01 -NONMATCH("asm/non_matching/engine/sub_8004010.inc", u32 sub_8004010(void)) -{ - u8 bgIndex = 0; - u16 sp00[2]; - u8 r4; - u8 *spVramPtr; - u16 bgSize_TxtOrAff; - - s32 sp08; - - for (; bgIndex < 4; bgIndex++) { - - if ((gUnknown_03002280[bgIndex][1] == gUnknown_03002280[bgIndex][3]) - && (gUnknown_03002280[bgIndex][0] == gUnknown_03002280[bgIndex][2])) - continue; - - { // _08004056 - u16 target = gBgCntRegs[bgIndex]; - u16 *vramBgCtrl = (u16 *)VRAM; - target &= BGCNT_SCREENBASE_MASK; - vramBgCtrl += target * 4; - - r4 = gUnknown_03002280[bgIndex][1]; - - sp08 = gUnknown_03002280[bgIndex][0]; - - if ((bgIndex > 1) - && (gDispCnt & (DISPCNT_MODE_2 | DISPCNT_MODE_1 | DISPCNT_MODE_0))) { - // _0800408E - spVramPtr = (u8 *)&vramBgCtrl[sp08]; - bgSize_TxtOrAff = (0x10 << (gBgCntRegs[bgIndex] >> 14)); - - if (gUnknown_03002280[bgIndex][3] == 0xFF) { - // _080040A2 - u16 v = gUnknown_03004D80[bgIndex]; - u32 value; - v |= v << 8; - - value = ((gUnknown_03002280[bgIndex][3] - r4) * bgSize_TxtOrAff); - DmaFill16(3, v, (void *)&spVramPtr[bgSize_TxtOrAff], - (((s32)(value + (value >> 31))) >> 1)); - } else { - // _080040F8 - // u8 i2 = i + 1; - for (; r4 < gUnknown_03002280[bgIndex][3]; r4++) { - u16 v = gUnknown_03004D80[bgIndex]; - v |= v << 8; - - DmaFill16( - 3, v, &spVramPtr[bgIndex * r4], - (s32)(bgIndex * 4 - gUnknown_03002280[bgIndex][0] + 1)); - } - } - // then -> _0800422C - } else { - // _08004168 - int tileSize = 32; - u8 *p1p; - - if ((u8)((gBgCntRegs[sp08] >> 14) - 2) <= 1) - tileSize = 64; - - if (gUnknown_03002280[bgIndex][2] == 0xFF) { - u8 r1 = gUnknown_03004D80[bgIndex]; - p1p = &gUnknown_03002280[bgIndex][tileSize]; - sp00[0] = r1; - -#if 0 - // TODO: This crashes the game after selecting a stage right now. - DmaFill16(3, sp00[0], &gUnknown_03002280[bgIndex][tileSize], - gUnknown_03002280[bgIndex][3] - r4); -#endif - } else { - // _080041D8 - for (; r4 <= gUnknown_03002280[bgIndex][3]; r4++) { - // _080041F6 - DmaFill16(3, gUnknown_03004D80[bgIndex], - &gUnknown_03002280[bgIndex][tileSize], - ARRAY_COUNT(gUnknown_03002280[0])); - } - } - } - // _0800422C - DmaFill32(3, 0, &gUnknown_03002280[bgIndex], - ARRAY_COUNT(gUnknown_03002280[bgIndex])); - } - } - - return 1; -} -END_NONMATCH - -#else -#define combine(v) ((v) << 8 | (v)) - -u32 sub_8004010(void) -{ - // Stack size: 0x18 bytes - - u8 bg; // bg index - u16 sp00; // 4 : num backgrounds - u8 sp08; - - for (bg = 0; bg < 4; bg++) { - if ((gUnknown_03002280[bg][1] != gUnknown_03002280[bg][3]) - || (gUnknown_03002280[bg][0] != gUnknown_03002280[bg][2])) { - // _08004056 - void *vramBase - = ((void *)BG_VRAM + ((gBgCntRegs[bg] & BGCNT_SCREENBASE_MASK) << 3)); - sp08 = gUnknown_03002280[bg][0]; - - // Potential bug? - // gDispCnt could be set to bitmap mode (0x5), which - // would still trigger this condition but is not intended. - if (bg > 1 || (gDispCnt & 0x3)) { - // __0800408E - u16 affineSize; - - vramBase = (vramBase + sp08); - - // affineSize = internal "screen size" - // 0 = 128x128 - // 1 = 256x256 - // 2 = 512x512 - // 3 = 1024x1024 - affineSize = 16 << (gBgCntRegs[bg] >> 14); - - if (gUnknown_03002280[bg][3] == 0xFF) { - // __080040A2 - u16 cb = combine(gUnknown_03004D80[bg]); - void *vram = (vramBase + (gUnknown_03002280[bg][1] * affineSize)); - s32 size = affineSize - * (gUnknown_03002280[bg][3] - gUnknown_03002280[bg][1]); - - DmaFill16(3, cb, vram, ABS(size)); - } else { - // _080040F8 - u8 r4 = gUnknown_03002280[bg][1]; - - for (; r4 <= gUnknown_03002280[bg][3]; r4++) { - u16 cb = combine(gUnknown_03004D80[bg]); - void *vram - = (vramBase + (gUnknown_03002280[bg][1] * affineSize)); - s32 size = (gUnknown_03002280[bg][2] - sp08) + 1; - - DmaFill16(3, cb, vram, ABS(size)); - } - } - } else { - // _08004168 - int tileSize; - u8 affineSize; - vramBase = (vramBase + sp08 * 2); - - tileSize = 32; - - // affineSize = internal "screen size" - // 0 = 128x128 (-2, -> 254) - // 1 = 256x256 (-2, -> 255) - // 2 = 512x512 (-2, -> 0) - // 3 = 1024x1024 (-2, -> 1) - affineSize = (gBgCntRegs[bg] >> 14) - 2; - - if (affineSize < 2) { - // 512x512 or 1024x1024 - tileSize = 64; - } - // _08004182 - - if (gUnknown_03002280[bg][2] == 0xFF) { - // __0800418C - void *vram = (vramBase + (gUnknown_03002280[bg][1] * tileSize)); - s32 size = tileSize - * (gUnknown_03002280[bg][3] - gUnknown_03002280[bg][1]); - - DmaFill16(3, gUnknown_03004D80[bg], vram, size * 2); - } else { - // _080041D8 - u8 r4 = gUnknown_03002280[bg][1]; - - for (; r4 < gUnknown_03002280[bg][3]; r4++) { - void *vram - = (vramBase + (gUnknown_03002280[bg][1] * (tileSize * 2))); - s32 size = tileSize * (gUnknown_03002280[bg][2] - sp08) + 1; - DmaFill16(3, gUnknown_03004D80[bg], vram, size * 2); - } - } - } - - // _0800422C - DmaFill32(3, 0, &gUnknown_03002280[bg], ARRAY_COUNT(gUnknown_03002280[bg])); - } - } - - return 1; -} -#endif - -// Copies the given tileOffsets of the given tilesSrc into the -// given dest. -// Also sets some stuff in the vram blend regs -// My guess is that this was designed for rendering text based tiles to the screen -s32 sub_8004274(void *dest, const void *tilesSrc, u16 param2, u16 param3, u8 bgCtrlIndex, - const u8 *tileOffsets, u8 param6) -{ - u8 i = 0; - - u16 tileBase = gBgCntRegs[bgCtrlIndex] & BGCNT_CHARBASE(0x3); - void *vramTiles = (void *)(VRAM + (tileBase * 4096)); - - u16 blendTarget = (BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BG2 - | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG0) - & gBgCntRegs[bgCtrlIndex]; - u16 *vramBlend - = ({ (u16 *)(VRAM + (blendTarget * 8)); }) + param3 * TILE_SIZE_4BPP + param2; - - for (; tileOffsets[i] != 0; i++) { - void *copyDest = dest + (i * TILE_SIZE_4BPP); - u16 offset; - u16 *addr; - CpuFastCopy(tilesSrc + (tileOffsets[i] * TILE_SIZE_4BPP), copyDest, - TILE_SIZE_4BPP); - -#ifndef NON_MATCHING - offset = (u16)((((u16 *)copyDest - (u16 *)vramTiles) << 12) >> 16); - vramBlend++; - vramBlend--; -#else - // divide by tilesize 4bpp - offset = (u16)(copyDest - vramTiles) >> 5; -#endif - - addr = vramBlend; - addr += i; - - *addr = (param6 * 4096) | offset; - } - - return i * TILE_SIZE_4BPP; -} - -// (-2) -// This is different to animCmd_GetPalette in that: -// - gBgPalette is used instead of gObjPalette -// - gFlags -> FLAGS_UPDATE_BACKGROUND_PALETTES -// instead of FLAGS_UPDATE_SPRITE_PALETTES -AnimCmdResult animCmd_GetPalette_BG(void *cursor, Sprite *s) -{ - ACmd_GetPalette *cmd = (ACmd_GetPalette *)cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - if (!(s->unk10 & SPRITE_FLAG_MASK_18)) { - s32 paletteIndex = cmd->palId; - - DmaCopy32(3, &gUnknown_03002794->palettes[paletteIndex * 16], - &gBgPalette[s->palId * 16 + cmd->insertOffset], cmd->numColors * 2); - - gFlags |= FLAGS_UPDATE_BACKGROUND_PALETTES; - } - - return 1; -} - -// (-3) -AnimCmdResult animCmd_JumpBack_BG(void *cursor, Sprite *s) -{ - ACmd_JumpBack *cmd = cursor; - s->animCursor -= cmd->offset; - - return 1; -} - -// (-4) -AnimCmdResult animCmd_End_BG(void *cursor, Sprite *s) -{ - SPRITE_FLAG_SET(s, ANIM_OVER); - - return 0; -} - -// (-5) -AnimCmdResult animCmd_PlaySoundEffect_BG(void *cursor, Sprite *s) -{ - ACmd_PlaySoundEffect *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - m4aSongNumStart(cmd->songId); - - return 1; -} - -// (-7) -AnimCmdResult animCmd_TranslateSprite_BG(void *cursor, Sprite *s) -{ - ACmd_TranslateSprite *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - s->x += cmd->x; - s->y += cmd->y; - - return 1; -} - -// (-8) -AnimCmdResult animCmd_8_BG(void *cursor, Sprite *s) -{ - ACmd_8 *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - return 1; -} - -AnimCmdResult animCmd_SetIdAndVariant_BG(void *cursor, Sprite *s) -{ - ACmd_SetIdAndVariant *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - - s->graphics.anim = cmd->animId; - s->prevVariant = 0xFF; - s->variant = cmd->variant; - - return -1; -} - -AnimCmdResult animCmd_10_BG(void *cursor, Sprite *s) -{ - ACmd_10 *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - -#ifdef UB_FIX - return 1; // I think this should be the correct behavior? -#else - return (s32)cursor; -#endif -} - -// This is not a NOP-instruction in the regular version -AnimCmdResult animCmd_SetSpritePriority_BG(void *cursor, Sprite *s) -{ - ACmd_SetSpritePriority *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - return 1; -} - -// This is not a NOP-instruction in the regular version -AnimCmdResult animCmd_SetOamOrder_BG(void *cursor, Sprite *s) -{ - ACmd_SetOamOrder *cmd = cursor; - s->animCursor += AnimCommandSizeInWords(*cmd); - return 1; -} diff --git a/src/background.c b/src/background.c new file mode 100644 index 000000000..3aa7b7a61 --- /dev/null +++ b/src/background.c @@ -0,0 +1,1374 @@ +#include "global.h" +#include "core.h" +#include "flags.h" +#include "sprite.h" +#include "trig.h" +#include "lib/m4a.h" + +#include "animation_commands.h" + +static AnimCmdResult animCmd_GetTiles_BG(void *, Sprite *); +static AnimCmdResult animCmd_GetPalette_BG(void *, Sprite *); +static AnimCmdResult animCmd_JumpBack_BG(void *, Sprite *); +static AnimCmdResult animCmd_End_BG(void *, Sprite *); +static AnimCmdResult animCmd_PlaySoundEffect_BG(void *, Sprite *); +static AnimCmdResult animCmd_AddHitbox_BG(void *, Sprite *); +static AnimCmdResult animCmd_TranslateSprite_BG(void *, Sprite *); +static AnimCmdResult animCmd_8_BG(void *, Sprite *); +static AnimCmdResult animCmd_SetIdAndVariant_BG(void *, Sprite *); +static AnimCmdResult animCmd_10_BG(void *, Sprite *); +static AnimCmdResult animCmd_SetSpritePriority_BG(void *, Sprite *); +static AnimCmdResult animCmd_SetOamOrder_BG(void *, Sprite *); + +const AnimationCommandFunc animCmdTable_BG[12] = { + animCmd_GetTiles_BG, animCmd_GetPalette_BG, + animCmd_JumpBack_BG, animCmd_End_BG, + animCmd_PlaySoundEffect_BG, animCmd_AddHitbox_BG, + animCmd_TranslateSprite_BG, animCmd_8_BG, + animCmd_SetIdAndVariant_BG, animCmd_10_BG, + animCmd_SetSpritePriority_BG, animCmd_SetOamOrder_BG, +}; + +#define ReadInstruction(script, cursor) ((void *)(script) + (cursor * sizeof(s32))) + +#define CastPointer(ptr, index) (void *)&(((u8 *)(ptr))[(index)]) + +void DrawBackground(Background *background) +{ + struct MapHeader *mapHeader = gTilemapsRef[background->tilemapId]; + const u16 *pal; + u32 palSize; + u16 gfxSize; + + background->xTiles = mapHeader->h.xTiles; + background->yTiles = mapHeader->h.yTiles; + background->graphics.src = mapHeader->h.tiles; + gfxSize = mapHeader->h.tilesSize; + background->graphics.size = gfxSize; + + if (!(background->flags & BACKGROUND_UPDATE_GRAPHICS)) { + gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &background->graphics; + gVramGraphicsCopyQueueIndex + = (gVramGraphicsCopyQueueIndex + 1) % ARRAY_COUNT(gVramGraphicsCopyQueue); + background->flags ^= BACKGROUND_UPDATE_GRAPHICS; + } + + pal = mapHeader->h.palette; + palSize = mapHeader->h.palLength; + background->paletteOffset = mapHeader->h.palOffset; + + if (!(background->flags & BACKGROUND_UPDATE_PALETTE)) { + DmaCopy16(3, pal, gBgPalette + background->paletteOffset, + palSize * sizeof(*pal)); + gFlags |= FLAGS_UPDATE_BACKGROUND_PALETTES; + background->flags ^= BACKGROUND_UPDATE_PALETTE; + } + + background->layout = mapHeader->h.map; + + if (background->flags & BACKGROUND_FLAG_IS_LEVEL_MAP) { + background->metatileMap = mapHeader->metatileMap; + background->mapWidth = mapHeader->mapWidth; + background->mapHeight = mapHeader->mapHeight; + } + + gUnknown_03001800[gUnknown_0300287C] = background; + gUnknown_0300287C = (gUnknown_0300287C + 1) % ARRAY_COUNT(gUnknown_03001800); +} + +// (85.37%) https://decomp.me/scratch/617Jb +NONMATCH("asm/non_matching/engine/sub_8002B20.inc", bool32 sub_8002B20(void)) +{ + u16 sp00; + s32 sp04 = 0; + s32 sp08; + u16 sp0C; // line-size ? + u16 sp10; + u16 sp14; + u32 affine; // -> r3 + u32 bgId; // -> r5 = (bg->flags & BACKGROUND_FLAGS_MASK_BG_ID) + s32 sb; + u32 dmaSize; + + while (gUnknown_0300287C != gUnknown_03002AE4) { + Background *bg; + +#if !PORTABLE + // TODO: This #if should not be required. + if (!(REG_DISPSTAT & DISPSTAT_VBLANK)) + return FALSE; +#endif + + // _08002B64 + REG_VCOUNT; + { + Background **backgrounds = &gUnknown_03001800[0]; + s32 index = gUnknown_03002AE4; + bg = backgrounds[index]; + index = (index + 1) % ARRAY_COUNT(gUnknown_03001800); + gUnknown_03002AE4 = index; + + if ((bg->flags & BACKGROUND_FLAG_20) && (bg->scrollX == bg->prevScrollX) + && bg->scrollY == bg->prevScrollY) + continue; + } + // NOTE: register r4 = sp00 + sp00 = bg->xTiles; + + bgId = (bg->flags & BACKGROUND_FLAGS_MASK_BG_ID); + if (bgId > 1 && ((gDispCnt & 0x3) > 0)) { + affine = (gBgCntRegs[bgId] >> 14); + sp0C = (0x10 << affine); + sp08 = 1; + } else { + // _08002BD8 + sp0C = 0x20; + affine = (gBgCntRegs[bgId] >> 14); + if ((affine == 1) || (affine == 3)) { + sp04 = 0x800; + } + sp08 = 2; + } + + // _08002BF8 + sp0C = (u16)(sp0C * sp08); + + if (!(bg->flags & BACKGROUND_FLAG_20)) { + if (!(bg->flags & BACKGROUND_FLAG_IS_LEVEL_MAP)) { + // _08002C20 + u8 *r1 = CastPointer(bg->layoutVram, bg->unk24 * sp0C); + u16 *r7 = CastPointer(r1, bg->unk22 * sp08); + u16 r5 = bg->targetTilesY; + + // r2 <- bg->flags + // r3 <- affine + // r4 <- sp00 + // r5 <- bg->targetTilesY + // sb = 0x20 + if (bg->flags & BACKGROUND_FLAG_100) { + // _08002C46 + if (bg->flags & BACKGROUND_FLAG_80) { + u32 r0Index = (((bg->unk20 + r5) - 1) * sp00) * sp08; + void *r2Ptr = CastPointer(bg->layout, r0Index); + u16 *r4Ptr = CastPointer( + r2Ptr, ((bg->unk1E + bg->targetTilesX) - 1) * sp08); + + // _08002C7C + while (r5-- != 0) { + u16 i; + + // _08002C9A + for (i = 0; i < bg->targetTilesX; i++) { + r7[i] = (*(r4Ptr - i) ^ TileMask_FlipXY); + } + + r7 = CastPointer(r7, sp0C); + r4Ptr = (void *)(((u8 *)r4Ptr) - (sp00 * sp08)); + } + } else { + // _08002CD4 + u32 someIndex = (bg->unk20 * sp00); + void *r2Ptr = CastPointer(bg->layout, someIndex * sp08); + u32 index2 = ((bg->unk1E + bg->targetTilesX) - 1); + u16 *r4Ptr = CastPointer(r2Ptr, index2 * sp08); + + // _08002D08 + while (r5-- != 0) { + u16 i; + + for (i = 0; i < bg->targetTilesX; i++) { + r7[i] = (*(r4Ptr - i) ^ TileMask_FlipX); + } + + r7 = CastPointer(r7, sp0C); + r4Ptr = CastPointer(r4Ptr, (sp00 * sp08)); + } + } + } else { + u16 *r4Ptr; + // r2 <- bg->flags + // r3 <- affine + // r4 <- sp00 + // r5 <- r5 = bg->targetTilesY + // sb = 0x20 + // _08002D50 + if (bg->flags & BACKGROUND_FLAG_80) { + u32 r0Index = (((bg->unk20 + r5) - 1) * sp00); + void *r1Ptr = CastPointer(bg->layout, r0Index * sp08); + r4Ptr = CastPointer(r1Ptr, bg->unk1E * sp08); + + while (r5-- != 0) { + u16 i; + sb = sp00 * sp08; + + for (i = 0; i < bg->targetTilesX; i++) { + r7[i] = r4Ptr[i] ^ 0x800; + } + + r7 = CastPointer(r7, sp0C); + + r4Ptr = (u16 *)(((u8 *)r4Ptr) - sb); + } + } else { + // _08002DD4 + if ((affine & 1) && (sp08 == 2) && ((0x20 - bg->unk22) > 0) + && ((bg->targetTilesX + bg->unk22 - 0x20) > 0)) { + s32 vR2; + // __08002DF8 + r4Ptr = (u16 *)(&bg->layout[bg->unk20 * sp00] + bg->unk1E); + sb = (0x20 - bg->unk22) * 2; + vR2 = (bg->targetTilesX + bg->unk22 - 0x20) * 2; + + while (r5-- != 0) { + // _08002E1C + // r7 <- sp08 + DmaCopy16(3, r4Ptr, r7, sb); + DmaCopy16(3, CastPointer(r4Ptr, sb), + CastPointer(r7, sp04), vR2); + + r7 = CastPointer(r7, sp0C); + r4Ptr = CastPointer(r4Ptr, (sp00 * sp08)); + } + + } else { + // __08002E74 + u32 r0Index = bg->unk20 * sp00 * sp08; + void *r1Ptr + = CastPointer(bg->layout, bg->unk20 * sp00 * sp08); + void *r4Ptr = CastPointer(r1Ptr, bg->unk1E * sp08); + + // r0 = r0Index + // r1 = r1Ptr + // r2 = sp00 + // r4 = r4Ptr + // r6 = bg + // r7 = + while (r5-- != 0) { + // _08002EA4 + DmaCopy16(3, r4Ptr, r7, (s32)(bg->targetTilesX * sp08)); + r7 = CastPointer(r7, sp0C); + r4Ptr = CastPointer(r4Ptr, sp00 * sp08); + } + } + } + } + } else { + // r3 = affine + // r6 = bg + // _08002ED4 + s32 sp18; + s32 sp1C; + u32 sp20; + s32 sp38; + u32 dmaFlags; // <- sp3C + s32 i, j; + sp10 = bg->unk1E; + sp14 = bg->unk20; + + // _08002EE8 + for (i = 0; i < bg->targetTilesX;) { + s32 r1; + s32 r5Res; + s32 r8; + s32 sp10_i = sp10 + i; + s32 temp; + + sp18 = Div(sp10_i, bg->xTiles); + r1 = bg->xTiles; + r5Res = sp18; + + sp1C = sp10_i - r5Res * bg->xTiles; + + r8 = bg->targetTilesY; + temp = (bg->targetTilesX - i); + r1 -= sp1C; + if (r1 > temp) + r1 = (bg->targetTilesX - i); + + sp20 = r1 * sp08; + + // _08002F28 + // sb = j + for (j = 0; j < bg->targetTilesY;) { + void *dmaSrc, *dmaDest; + s32 r5; +#ifndef NON_MATCHING + register const u16 *r1Ptr asm("r1"); + register void *r2Ptr asm("r2"); + register void *r0Ptr asm("r0"); +#else + const u16 *r1Ptr; + void *r2Ptr; + void *r0Ptr; +#endif + s32 temp2; + u32 v; + s32 r4 = sp14 + j; + s32 result = Div(r4, bg->yTiles); + r4 -= result * bg->yTiles; + r5 = bg->yTiles - r4; + + result *= bg->mapWidth; + r2Ptr = (void *)bg->metatileMap; + temp2 = sp18 << 1; + r0Ptr = CastPointer(r2Ptr, result << 1); + r1Ptr = CastPointer(r0Ptr, temp2); + + // r1 = v + v = *((u16 *)r1Ptr) * bg->xTiles * bg->yTiles; + v += r4 * bg->xTiles + sp1C; + v *= sp08; + + dmaSrc = ((u8 *)bg->layout) + v; + + { + void *r0; + r0 = CastPointer(bg->layoutVram, bg->unk24); + r0 = CastPointer(r0, sp0C * j); + r0 = CastPointer(r0, bg->unk22); + dmaDest = CastPointer(r0, i * sp08); + } + + j += r5; + + if (r5 > r8) + r5 = r8; + + r8 -= r5; + + while (r5-- != 0) { + dmaFlags = sp20; + DmaCopy16(3, dmaSrc, dmaDest, (s32)dmaFlags); + dmaDest += sp0C; + dmaSrc += sp00 * sp08; + } + } + + i += r1; + } + // _08002FD6 + } + } else { + // r2 <- bg->flags + // r3 <- bg->unk30 + // r4 <- sp00 == bg->xTiles + // r5 <- bgId + // _08002FE8 + if (!(bg->flags & BACKGROUND_FLAG_IS_LEVEL_MAP)) { + u32 vR2 = bg->xTiles; + while (bg->scrollX >= sp00 * 8) + bg->scrollX -= sp00 * 8; + + while (bg->scrollY >= bg->yTiles * 8) { + bg->scrollY -= bg->yTiles * 8; + } + } + //_08003034 + gBgScrollRegs[bgId][0] = bg->scrollX & 0x7; + gBgScrollRegs[bgId][1] = bg->scrollY & 0x7; + + if ((bg->prevScrollX >> 3 != bg->scrollX >> 3) + || (bg->prevScrollY >> 3 != bg->scrollY >> 3)) { + if (!(bg->flags & BACKGROUND_FLAG_IS_LEVEL_MAP)) { + // _08003072 + // TODO: Something'S wrong with the types here (r2 should be s16?) + u16 *r7Ptr; + s16 r2; + s32 r4; + u16 r5; + u16 *sp3C; + u32 notherIndex; + sp10 = (u16)((bg->scrollX >> 3) + bg->unk1E); + sp14 = (u16)((bg->scrollY >> 3) + bg->unk20); + + notherIndex = (bg->unk24 * sp0C); + r7Ptr = CastPointer(bg->layoutVram, notherIndex); + r7Ptr = CastPointer(r7Ptr, bg->unk22 * sp08); + + if (((bg->targetTilesX + sp10) + 1) > bg->xTiles) { + r2 -= (bg->xTiles - 1); + } else { + r2 = 0; + } + + r5 = bg->targetTilesY + 1; + if (bg->flags & BACKGROUND_FLAG_100) { + // _080030D4 + if (bg->flags & BACKGROUND_FLAG_80) { + // _080030DC + u32 index = ((bg->unk20 + r5) - 1); + u16 *r1Ptr = (u16 *)&((u8 *)bg->layout)[r4 * index * sp08]; + u32 index2 = ((bg->unk1E + bg->targetTilesX) - 1); + u16 *r4Ptr = &r1Ptr[index2 * sp08]; + + while (r5-- != 0) { + // _08003108 + u16 i; // <- r3 + for (i = 0; i < bg->targetTilesX; i++) { + u32 mask = TileMask_FlipXY; + // _08003126 + sp3C = &r7Ptr[i]; + *sp3C = (r4Ptr[0 - i] ^ mask); + } + } + } else { + // _08003158 + u32 index; + u16 *r1Ptr; + u32 index2; + u16 *r4Ptr; + index = bg->unk20; + index *= r4; + index *= sp08; + r1Ptr = (u16 *)&((u8 *)bg->layout)[index]; + index2 = bg->unk1E + bg->targetTilesX - 1; + r4Ptr = CastPointer(r1Ptr, index2 * sp08); + + while (r5-- != 0) { + // _08003180 + u16 i; + for (i = 0; i < bg->targetTilesX; i++) { + // _0800319E + sp3C = &r7Ptr[i]; + *sp3C = (r4Ptr[0 - i] ^ TileMask_FlipX); + } + } + } + } else { + // _080031D0 + if (bg->flags & BACKGROUND_FLAG_80) { + // _080031D8 + u32 index = ((sp14 + r5) - 1); + u16 *r0Ptr = (u16 *)&((u8 *)bg->layout)[r4 * index * sp08]; + u32 index2 = sp10; + u16 *r4Ptr = &r0Ptr[index2 * sp08]; + + while (r5-- != 0) { + u16 i = 0; + + for (; i < bg->targetTilesX; i++) { + sp3C = &r7Ptr[i]; + *sp3C = r4Ptr[i] ^ TileMask_FlipY; + } + r7Ptr = CastPointer(r7Ptr, sp0C); + r4Ptr = (void *)(((u8 *)r4Ptr) - sp00 * sp08); + } + } else { + // _08003254 + u32 index = sp14; + u16 *r0Ptr = (u16 *)&((u8 *)bg->layout)[r4 * index * sp08]; + u32 index2 = sp10; + u16 *r4Ptr = &r0Ptr[index2 * sp08]; + + // _08003298 + while (r5-- != 0) { + dmaSize = bg->targetTilesX - (r2 - 1); + dmaSize *= sp08; + dmaSize += (dmaSize >> 31); + DmaCopy16(3, r4Ptr, r7Ptr, dmaSize); + + r7Ptr = CastPointer(r7Ptr, sp0C); + r4Ptr = CastPointer(r4Ptr, sp00 * sp08); + } + } + } + // _080032C4 + if (r2 != 0) { + // _080032CE + u8 *r1 = CastPointer(bg->layoutVram, bg->unk24 * sp0C); // <- r1 + u32 displayTile = bg->unk22 + bg->xTiles - sp10; // <- r0 + u16 *r7Ptr = CastPointer(r1, displayTile * sp08); + u16 r5 = (bg->targetTilesY + 1); + + if (bg->flags & BACKGROUND_FLAG_100) { + if (bg->flags & BACKGROUND_FLAG_80) { + // _08003306 + u32 index = ((sp14 + r5) - 1) * r4; + u16 *r1Ptr = (u16 *)&(((u8 *)bg->layout)[index * sp08]); + u16 *r4Ptr = (u16 *)((u8 *)&r1Ptr[(r2 - 1) * sp08]); + + while (--r5 != (u16)-1) { + u16 i; + for (i = 0; i < bg->targetTilesX; i++) { + r7Ptr[i] = *(r4Ptr - i) ^ TileMask_FlipXY; + } + r7Ptr = CastPointer(r7Ptr, sp0C); + r4Ptr = (u16 *)(((u8 *)r4Ptr) - sp00 * sp08); + } + } else { + // _08003380 + u32 index; + u8 *r1Ptr; + u16 *r4Ptr; + index = sp14; + index *= r4; + index *= sp08; + r1Ptr = &((u8 *)bg->layout)[index]; + r4Ptr = (u16 *)&r1Ptr[(r2 - 1) * sp08]; + + while (--r5 != (u16)-1) { + u16 i; + for (i = 0; i < bg->targetTilesX; i++) { + r7Ptr[i] = *(r4Ptr - i) ^ TileMask_FlipX; + } + r7Ptr = CastPointer(r7Ptr, sp0C); + r4Ptr = CastPointer(r4Ptr, sp00 * sp08); + } + } + } else { + // _080033F4 + if (bg->flags & BACKGROUND_FLAG_80) { + // _080033FC + u32 index = ((sp14 + r5) - 1) * r4; + u16 *r4Ptr = (u16 *)&((u8 *)bg->layout)[index * sp08]; + + u32 sp30 = r2; + while (--r5 != (u16)-1) { + u16 i; + for (i = 0; i < r2; i++) { + u16 *sp3C = &r7Ptr[i]; + *sp3C = r4Ptr[i] ^ TileMask_FlipY; + } + r7Ptr = CastPointer(r7Ptr, sp0C); + r4Ptr = (u16 *)(((u8 *)r4Ptr) - sp00 * sp08); + } + } else { + // _08003474 + u32 index = (sp14 * r4); + u16 *r4Ptr = (u16 *)&((u8 *)bg->layout)[index * sp08]; + + while (r5-- != 0) { + dmaSize = sp08 * r2; + // _08003492 + DmaCopy16(3, r4Ptr, r7Ptr, (s32)dmaSize); + + r7Ptr = CastPointer(r7Ptr, sp0C); + r4Ptr = CastPointer(r4Ptr, sp00 * sp08); + } + } + } + } + } else { + // _080034DC + s32 i; + s32 j; + sp10 = (bg->scrollX >> 3) + bg->unk1E; + sp14 = (bg->scrollY >> 3) + bg->unk20; + + for (i = 0; i < bg->targetTilesX;) { + // _08003500 + s32 r4 = sp10 + i; + s32 sp24 = Div(r4, bg->xTiles); + s32 r1 = bg->xTiles; + s32 sp28 = r4 - (sp24 * r1); + s32 sp2C; + s32 sp34; + s32 r8 = bg->targetTilesY; + s32 r0 = bg->targetTilesX - i; + r1 = r1 - sp28; + + if (r1 > r0) + r1 = r0; + + // _0800352E + sp2C = r1 * sp08; + + for (j = 0; j < bg->targetTilesY;) { + // _08003542 + s32 divident = sp14 + j; + s32 yPos = Div(divident, bg->yTiles); + s32 new_r4 = divident - (yPos * bg->yTiles); + s32 r5 = bg->yTiles - new_r4; + yPos *= bg->mapWidth; + + { // _0800355C + s32 metatileIndex = *(&bg->metatileMap[yPos] + sp24); + s32 otherVal; + metatileIndex *= bg->xTiles; + metatileIndex *= bg->yTiles; + + otherVal = new_r4 * bg->xTiles; + otherVal += sp28; + otherVal += metatileIndex; + + { + // r4 <- dmaSrc + u8 *dmaSrc; + u8 *dmaDest; + u8 *destPtr; + u32 destIndex; + dmaSrc = CastPointer(bg->layout, otherVal * sp08); + destPtr = CastPointer(bg->layoutVram, bg->unk24); + destPtr += sp0C * j; + destPtr += +bg->unk22; + dmaDest = CastPointer(destPtr, i * sp08); + + j += r5; + + if (r5 > r8) + r5 = r8; + r8 -= r5; + + // _080035A4 + while (r5-- != 0) { + dmaSize = sp2C; + DmaCopy16(3, dmaSrc, dmaDest, (s32)dmaSize); + dmaDest += sp0C; + dmaSrc += sp00 * sp08; + } + } + } + } + + i += r1; + } + } + } + } + // _080035FA + REG_VCOUNT; + bg->prevScrollX = bg->scrollX; + bg->prevScrollY = bg->scrollY; + }; + + return 1; +} +END_NONMATCH + +void UpdateBgAnimationTiles(Background *bg) +{ + struct MapHeader *header = gTilemapsRef[bg->tilemapId]; + if (header->h.animFrameCount) { + if (header->h.animDelay <= ++bg->animDelayCounter) { + u32 animTileSize; + + bg->animDelayCounter = 0; + + if (header->h.animFrameCount <= ++bg->animFrameCounter) + bg->animFrameCounter = 0; + + animTileSize = header->h.animTileSize; + + if (!(bg->flags & BACKGROUND_UPDATE_ANIMATIONS)) { + if (bg->animFrameCounter == 0) { + bg->graphics.src = header->h.tiles; + } else { + const u8 *tiles = header->h.tiles; + u32 size = header->h.tilesSize; + tiles += size; + tiles += (bg->animFrameCounter - 1) * animTileSize; + bg->graphics.src = tiles; + } + } else { + u8 *ts = bg->graphics.dest; + ts += header->h.tilesSize; + ts += (bg->animFrameCounter * animTileSize); + bg->graphics.src = ts; + } + { + bg->graphics.size = animTileSize; + gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &bg->graphics; + gVramGraphicsCopyQueueIndex = (gVramGraphicsCopyQueueIndex + 1) + % ARRAY_COUNT(gVramGraphicsCopyQueue); + } + } + } +} + +// Differences to UpdateSpriteAnimation: +// - SPRITE_MAYBE_SWITCH_ANIM gets executed *after* the if. +// - Uses animCmdTable_BG instead of animCmdTable +s32 sub_80036E0(Sprite *s) +{ + if (s->unk10 & SPRITE_FLAG_MASK_ANIM_OVER) + return 0; + + SPRITE_MAYBE_SWITCH_ANIM(s); + + if (s->timeUntilNextFrame > 0) + s->timeUntilNextFrame -= s->animSpeed * 16; + else { + s32 ret; + const ACmd *cmd; + const ACmd *script; + const ACmd **variants; + + // Handle all the "regular" Animation commands with an ID < 0 + variants = gRefSpriteTables->animations[s->graphics.anim]; + script = variants[s->variant]; + cmd = ReadInstruction(script, s->animCursor); + while (cmd->id < 0) { + // TODO: Fix types to make these const + ret = animCmdTable_BG[~cmd->id]((void *)cmd, s); + if (ret != 1) { +#ifndef NON_MATCHING + register const ACmd *newScript asm("r1"); +#else + ACmd *newScript; +#endif + if (ret != -1) { + return ret; + } + + // animation has changed + variants = gRefSpriteTables->animations[s->graphics.anim]; + newScript = (ACmd *)variants[s->variant]; + // reset cursor + s->animCursor = 0; + // load the new script + script = newScript; + } + cmd = ReadInstruction(script, s->animCursor); + } + + // Display the image 'index' for 'delay' frames + s->timeUntilNextFrame += (((ACmd_ShowFrame *)cmd)->delay << 8); + s->timeUntilNextFrame -= s->animSpeed * 16; + { + s32 frame = ((ACmd_ShowFrame *)cmd)->index; + if (frame != -1) { + const struct SpriteTables *sprTables = gRefSpriteTables; + + s->dimensions = &sprTables->dimensions[s->graphics.anim][frame]; + } else { + s->dimensions = (void *)-1; + } + } + + s->animCursor += 2; + } + return 1; +} + +// (-1) +// No differences to animCmd_GetTiles +static AnimCmdResult animCmd_GetTiles_BG(void *cursor, Sprite *s) +{ + ACmd_GetTiles *cmd = (ACmd_GetTiles *)cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + if ((s->unk10 & SPRITE_FLAG_MASK_19) == 0) { + if (cmd->tileIndex < 0) { + s->graphics.src + = &gRefSpriteTables->tiles_8bpp[cmd->tileIndex * TILE_SIZE_8BPP]; + s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_8BPP; + } else { + s->graphics.src + = &gRefSpriteTables->tiles_4bpp[cmd->tileIndex * TILE_SIZE_4BPP]; + s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_4BPP; + } + + gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &s->graphics; + gVramGraphicsCopyQueueIndex = (gVramGraphicsCopyQueueIndex + 1) & 0x1F; + } + + return 1; +} + +// (-6) +// Differences to animCmd_AddHitbox: +// - uses XOR_SWAP macro instead of SWAP_AND_NEGATE +// TODO: rename animCmd_AddHitbox_BG +static AnimCmdResult animCmd_AddHitbox_BG(void *cursor, Sprite *s) +{ + ACmd_Hitbox *cmd = (ACmd_Hitbox *)cursor; + s32 index = cmd->hitbox.index & 0xF; + s->animCursor += AnimCommandSizeInWords(*cmd); + + DmaCopy32(3, &cmd->hitbox, &s->hitboxes[index].index, 8); + + if ((cmd->hitbox.left == 0) && (cmd->hitbox.top == 0) && (cmd->hitbox.right == 0) + && (cmd->hitbox.bottom == 0)) { + s->hitboxes[index].index = -1; + } else { + if (s->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { + XOR_SWAP(s->hitboxes[index].top, s->hitboxes[index].bottom); + } + + if (s->unk10 & SPRITE_FLAG_MASK_X_FLIP) { + XOR_SWAP(s->hitboxes[index].left, s->hitboxes[index].right); + } + } + + return 1; +} + +void sub_8003914(Sprite *s) +{ + const SpriteOffset *dims; + gUnknown_03004D10[gUnknown_03005390] = s; + gUnknown_03005390++; + + if (s->dimensions != (void *)-1) { + u32 bgId; + + dims = s->dimensions; + bgId = SPRITE_FLAG_GET(s, BG_ID); + // Potential UB: + // gDispCnt 'Mode' is an int, not a bitfield! + if ((bgId > 1) && (gDispCnt & (DISPCNT_MODE_1 | DISPCNT_MODE_2))) { + // __sub_8003954 + s32 affineX, affineY; + s32 posX, posY; + + posX = dims->offsetX - s->x; + affineX = Mod(posX, 16); + gBgAffineRegs[bgId - 2].x = Q(affineX); + + posY = dims->offsetY - s->y; + affineY = Mod(posY, 8); + gBgAffineRegs[bgId - 2].y = Q(affineY); + } else { + // _080039A4 + s32 scrollX, scrollY; + s32 posX, posY; + + posX = dims->offsetX - s->x; + scrollX = Mod(posX, 16); + gBgScrollRegs[bgId][0] = scrollX; + + posY = dims->offsetY - s->y; + scrollY = Mod(posY, 8); + gBgScrollRegs[bgId][1] = scrollY; + } + } +} + +// Some VBlank function +// (21.30%) https://decomp.me/scratch/UfJX7 +NONMATCH("asm/non_matching/engine/sub_80039E4.inc", bool32 sub_80039E4(void)) +{ + // tilesize (could be 32 and get optimized out?) + s32 sp28 = 5; + + if (!(REG_DISPSTAT & DISPSTAT_VBLANK)) { + return FALSE; + } + + return TRUE; + + if (gUnknown_03005390 != 0) { + OamDataShort oam; + s32 r5; + s32 sp08; + u16 shapeAndSize; + Sprite *s; // = sp0C + const SpriteOffset *dims; + u32 sp10; // bg_affine_pixelcount + const u16 *const *oamSub; + OamDataShort *sp1C; + u32 tilesX; // =sp20 + u32 tilesY; // =ip + s32 xPos; // =r8 + s32 yPos; // =r5 + u16 oamX, oamY; + + for (r5 = 0; r5 < gUnknown_03005390; r5++) { + // _08003A1A + s = gUnknown_03004D10[r5]; + dims = s->dimensions; + + if (dims != (void *)-1) { + u32 bgId = SPRITE_FLAG_GET(s, BG_ID); + void *bgVram + = (void *)BG_CHAR_ADDR((gBgCntRegs[bgId] & BGCNT_CHARBASE(3)) >> 2); + void *bgBase = bgVram + ((gBgCntRegs[bgId] & BGCNT_SCREENBASE(31)) * 8); + + if (gBgCntRegs[bgId] & BGCNT_256COLOR) { + // tilesize (could be 32 and get optimized out?) + sp28 = 6; + } + + // TODO: Remove this comment if it matches without what it says + // NOTE: This might be the following: + // (... && ((gDispCnt & DISPCNT_MODE_1) || (gDispCnt & + // DISPCNT_MODE_2))) But it would be UB in that case, since the + // mode is determined by 3 bits, so the value could also be + // DISPCNT_MODE_3 or DISPCNT_MODE_5. + if ((bgId >= 2) && ((gDispCnt & 0x3) != DISPCNT_MODE_0)) { + // _08003A84 + // u16 sp24; + u8 sp30; + s32 shrunkTileId; + void *r7; + u16 affine = (gBgCntRegs[bgId] & BGCNT_AFF1024x1024) >> 14; + sp10 = ((1024 * 1024) << affine) >> 16; + oamSub = gRefSpriteTables->oamData; + + // OAM entry for this sub-frame + sp1C = (OamDataShort *)oamSub[s->graphics.anim]; + sp1C = &sp1C[dims->oamIndex]; + + for (sp08 = 0; sp08 < dims->numSubframes; sp08++) { + u16 tileId; + // _08003ABE + sp30 = sp10; + DmaCopy16(3, sp1C, &oam, sizeof(OamDataShort)); + sp1C++; + + shapeAndSize = oam.shape << 2; + shapeAndSize |= oam.size; + tilesX = gOamShapesSizes[shapeAndSize][0] >> 3; + tilesY = gOamShapesSizes[shapeAndSize][1] >> 3; + yPos = s->y - dims->offsetY; + xPos = s->x - dims->offsetX; + xPos &= ~0xF; + r7 = bgBase + (((oam.y + yPos) >> 3) * sp10); + tileId = ((size_t)(s->graphics.dest - bgVram)) >> sp28; + shrunkTileId = (oam.tileNum + tileId) & 0xFF; + + // __08003B68 + // sp08++; + while (tilesY-- != 0) { + // _08003B74 + //(r7 + (oam.tileNum >> 3)); + + // UNFINISHED // + } + } + } else { + // _08003C2C + u8 bgReg = (gBgCntRegs[bgId] >> 14); + if (bgReg == 2 || bgReg == 3) { + sp10 = 0x40; + } + // _08003C46 + sp1C = (OamDataShort *)gRefSpriteTables->oamData[s->graphics.anim]; + sp1C = (OamDataShort *)&sp1C[dims->oamIndex]; + + // _08003C78 + for (sp08 = 0; sp08 < dims->numSubframes; sp08++) { + s32 someOffsetY; + u32 yFlip; + DmaCopy16(3, sp1C, &oam, sizeof(OamDataShort)); + sp1C++; + + shapeAndSize = oam.shape << 2; + shapeAndSize |= oam.size; + tilesX = gOamShapesSizes[shapeAndSize][0] >> 3; + tilesY = gOamShapesSizes[shapeAndSize][1] >> 3; + oamY = oam.y; + oamX = oam.x; + oam.paletteNum += s->palId; + // __08003CD8 + + yFlip = s->unk10 >> SPRITE_FLAG_SHIFT_Y_FLIP; + yFlip ^= (dims->flip >> 1); + + if (yFlip & 1) { + // ___08003CEE + // alt: oam.all.attr1 ^ 0x2000 + oam.matrixNum ^= 0x4; // do flip Y in OAM + if (dims->flip & 0x1) { + // __08003D04 + someOffsetY = s->y + dims->offsetY; + } else { + // _08003D2C + someOffsetY = s->y + (dims->height - dims->offsetY); + } + // _08003D3C + someOffsetY -= 8; + oamX = -oamX; + } else { + // _08003D4A + someOffsetY = s->y - dims->offsetY; + } + + if ((SPRITE_FLAG_GET(s, X_FLIP) & 0x1) != (dims->flip & 0x1)) { + + } else { + //_08003DB4 + } + } + } + } + } + + gUnknown_03005390 = 0; + } + + return TRUE; +} +END_NONMATCH + +void sub_8003EE4(u16 p0, s16 p1, s16 p2, s16 p3, s16 p4, s16 p5, s16 p6, + BgAffineReg *affine) +{ + affine->pa = (COS_24_8(p0) * (s16)Div(0x10000, p1)) >> 8; + affine->pb = (SIN_24_8(p0) * (s16)Div(0x10000, p1)) >> 8; + affine->pc = ((-SIN(p0) >> 6) * (s16)Div(0x10000, p2)) >> 8; + affine->pd = (COS_24_8(p0) * (s16)Div(0x10000, p2)) >> 8; + + p5 *= -1; + p6 *= -1; + { + // __sub_8003FA8 + s32 r1 = (s16)affine->pa * p5; + s32 r3 = (s16)affine->pb * p6; + + affine->x = (r1 + r3) + p3 * 256; + } + { + // __sub_8003FBE + s32 r1 = (s16)affine->pc * p5; + s32 r3 = (s16)affine->pd * p6; + + affine->y = (r1 + r3) + p4 * 256; + } +} + +// (57.61%) https://decomp.me/scratch/6Xm6S +// (58.36%) https://decomp.me/scratch/ClyxP +// (48.23%) https://decomp.me/scratch/bDTEe +#if 01 +NONMATCH("asm/non_matching/engine/sub_8004010.inc", u32 sub_8004010(void)) +{ + u8 bgIndex = 0; + u16 sp00[2]; + u8 r4; + u8 *spVramPtr; + u16 bgSize_TxtOrAff; + + s32 sp08; + + for (; bgIndex < 4; bgIndex++) { + + if ((gUnknown_03002280[bgIndex][1] == gUnknown_03002280[bgIndex][3]) + && (gUnknown_03002280[bgIndex][0] == gUnknown_03002280[bgIndex][2])) + continue; + + { // _08004056 + u16 target = gBgCntRegs[bgIndex]; + u16 *vramBgCtrl = (u16 *)VRAM; + target &= BGCNT_SCREENBASE_MASK; + vramBgCtrl += target * 4; + + r4 = gUnknown_03002280[bgIndex][1]; + + sp08 = gUnknown_03002280[bgIndex][0]; + + if ((bgIndex > 1) + && (gDispCnt & (DISPCNT_MODE_2 | DISPCNT_MODE_1 | DISPCNT_MODE_0))) { + // _0800408E + spVramPtr = (u8 *)&vramBgCtrl[sp08]; + bgSize_TxtOrAff = (0x10 << (gBgCntRegs[bgIndex] >> 14)); + + if (gUnknown_03002280[bgIndex][3] == 0xFF) { + // _080040A2 + u16 v = gUnknown_03004D80[bgIndex]; + u32 value; + v |= v << 8; + + value = ((gUnknown_03002280[bgIndex][3] - r4) * bgSize_TxtOrAff); + DmaFill16(3, v, (void *)&spVramPtr[bgSize_TxtOrAff], + (((s32)(value + (value >> 31))) >> 1)); + } else { + // _080040F8 + // u8 i2 = i + 1; + for (; r4 < gUnknown_03002280[bgIndex][3]; r4++) { + u16 v = gUnknown_03004D80[bgIndex]; + v |= v << 8; + + DmaFill16( + 3, v, &spVramPtr[bgIndex * r4], + (s32)(bgIndex * 4 - gUnknown_03002280[bgIndex][0] + 1)); + } + } + // then -> _0800422C + } else { + // _08004168 + int tileSize = 32; + u8 *p1p; + + if ((u8)((gBgCntRegs[sp08] >> 14) - 2) <= 1) + tileSize = 64; + + if (gUnknown_03002280[bgIndex][2] == 0xFF) { + u8 r1 = gUnknown_03004D80[bgIndex]; + p1p = &gUnknown_03002280[bgIndex][tileSize]; + sp00[0] = r1; + +#if 0 + // TODO: This crashes the game after selecting a stage right now. + DmaFill16(3, sp00[0], &gUnknown_03002280[bgIndex][tileSize], + gUnknown_03002280[bgIndex][3] - r4); +#endif + } else { + // _080041D8 + for (; r4 <= gUnknown_03002280[bgIndex][3]; r4++) { + // _080041F6 + DmaFill16(3, gUnknown_03004D80[bgIndex], + &gUnknown_03002280[bgIndex][tileSize], + ARRAY_COUNT(gUnknown_03002280[0])); + } + } + } + // _0800422C + DmaFill32(3, 0, &gUnknown_03002280[bgIndex], + ARRAY_COUNT(gUnknown_03002280[bgIndex])); + } + } + + return 1; +} +END_NONMATCH + +#else +#define combine(v) ((v) << 8 | (v)) + +u32 sub_8004010(void) +{ + // Stack size: 0x18 bytes + + u8 bg; // bg index + u16 sp00; // 4 : num backgrounds + u8 sp08; + + for (bg = 0; bg < 4; bg++) { + if ((gUnknown_03002280[bg][1] != gUnknown_03002280[bg][3]) + || (gUnknown_03002280[bg][0] != gUnknown_03002280[bg][2])) { + // _08004056 + void *vramBase + = ((void *)BG_VRAM + ((gBgCntRegs[bg] & BGCNT_SCREENBASE_MASK) << 3)); + sp08 = gUnknown_03002280[bg][0]; + + // Potential bug? + // gDispCnt could be set to bitmap mode (0x5), which + // would still trigger this condition but is not intended. + if (bg > 1 || (gDispCnt & 0x3)) { + // __0800408E + u16 affineSize; + + vramBase = (vramBase + sp08); + + // affineSize = internal "screen size" + // 0 = 128x128 + // 1 = 256x256 + // 2 = 512x512 + // 3 = 1024x1024 + affineSize = 16 << (gBgCntRegs[bg] >> 14); + + if (gUnknown_03002280[bg][3] == 0xFF) { + // __080040A2 + u16 cb = combine(gUnknown_03004D80[bg]); + void *vram = (vramBase + (gUnknown_03002280[bg][1] * affineSize)); + s32 size = affineSize + * (gUnknown_03002280[bg][3] - gUnknown_03002280[bg][1]); + + DmaFill16(3, cb, vram, ABS(size)); + } else { + // _080040F8 + u8 r4 = gUnknown_03002280[bg][1]; + + for (; r4 <= gUnknown_03002280[bg][3]; r4++) { + u16 cb = combine(gUnknown_03004D80[bg]); + void *vram + = (vramBase + (gUnknown_03002280[bg][1] * affineSize)); + s32 size = (gUnknown_03002280[bg][2] - sp08) + 1; + + DmaFill16(3, cb, vram, ABS(size)); + } + } + } else { + // _08004168 + int tileSize; + u8 affineSize; + vramBase = (vramBase + sp08 * 2); + + tileSize = 32; + + // affineSize = internal "screen size" + // 0 = 128x128 (-2, -> 254) + // 1 = 256x256 (-2, -> 255) + // 2 = 512x512 (-2, -> 0) + // 3 = 1024x1024 (-2, -> 1) + affineSize = (gBgCntRegs[bg] >> 14) - 2; + + if (affineSize < 2) { + // 512x512 or 1024x1024 + tileSize = 64; + } + // _08004182 + + if (gUnknown_03002280[bg][2] == 0xFF) { + // __0800418C + void *vram = (vramBase + (gUnknown_03002280[bg][1] * tileSize)); + s32 size = tileSize + * (gUnknown_03002280[bg][3] - gUnknown_03002280[bg][1]); + + DmaFill16(3, gUnknown_03004D80[bg], vram, size * 2); + } else { + // _080041D8 + u8 r4 = gUnknown_03002280[bg][1]; + + for (; r4 < gUnknown_03002280[bg][3]; r4++) { + void *vram + = (vramBase + (gUnknown_03002280[bg][1] * (tileSize * 2))); + s32 size = tileSize * (gUnknown_03002280[bg][2] - sp08) + 1; + DmaFill16(3, gUnknown_03004D80[bg], vram, size * 2); + } + } + } + + // _0800422C + DmaFill32(3, 0, &gUnknown_03002280[bg], ARRAY_COUNT(gUnknown_03002280[bg])); + } + } + + return 1; +} +#endif + +// Copies the given tileOffsets of the given tilesSrc into the +// given dest. +// Also sets some stuff in the vram blend regs +// My guess is that this was designed for rendering text based tiles to the screen +s32 sub_8004274(void *dest, const void *tilesSrc, u16 param2, u16 param3, u8 bgCtrlIndex, + const u8 *tileOffsets, u8 param6) +{ + u8 i = 0; + + u16 tileBase = gBgCntRegs[bgCtrlIndex] & BGCNT_CHARBASE(0x3); + void *vramTiles = (void *)(VRAM + (tileBase * 4096)); + + u16 blendTarget = (BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BG2 + | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG0) + & gBgCntRegs[bgCtrlIndex]; + u16 *vramBlend + = ({ (u16 *)(VRAM + (blendTarget * 8)); }) + param3 * TILE_SIZE_4BPP + param2; + + for (; tileOffsets[i] != 0; i++) { + void *copyDest = dest + (i * TILE_SIZE_4BPP); + u16 offset; + u16 *addr; + CpuFastCopy(tilesSrc + (tileOffsets[i] * TILE_SIZE_4BPP), copyDest, + TILE_SIZE_4BPP); + +#ifndef NON_MATCHING + offset = (u16)((((u16 *)copyDest - (u16 *)vramTiles) << 12) >> 16); + vramBlend++; + vramBlend--; +#else + // divide by tilesize 4bpp + offset = (u16)(copyDest - vramTiles) >> 5; +#endif + + addr = vramBlend; + addr += i; + + *addr = (param6 * 4096) | offset; + } + + return i * TILE_SIZE_4BPP; +} + +// (-2) +// This is different to animCmd_GetPalette in that: +// - gBgPalette is used instead of gObjPalette +// - gFlags -> FLAGS_UPDATE_BACKGROUND_PALETTES +// instead of FLAGS_UPDATE_SPRITE_PALETTES +static AnimCmdResult animCmd_GetPalette_BG(void *cursor, Sprite *s) +{ + ACmd_GetPalette *cmd = (ACmd_GetPalette *)cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + if (!(s->unk10 & SPRITE_FLAG_MASK_18)) { + s32 paletteIndex = cmd->palId; + + DmaCopy32(3, &gRefSpriteTables->palettes[paletteIndex * 16], + &gBgPalette[s->palId * 16 + cmd->insertOffset], cmd->numColors * 2); + + gFlags |= FLAGS_UPDATE_BACKGROUND_PALETTES; + } + + return 1; +} + +// (-3) +static AnimCmdResult animCmd_JumpBack_BG(void *cursor, Sprite *s) +{ + ACmd_JumpBack *cmd = cursor; + s->animCursor -= cmd->offset; + + return 1; +} + +// (-4) +static AnimCmdResult animCmd_End_BG(void *cursor, Sprite *s) +{ + SPRITE_FLAG_SET(s, ANIM_OVER); + + return 0; +} + +// (-5) +static AnimCmdResult animCmd_PlaySoundEffect_BG(void *cursor, Sprite *s) +{ + ACmd_PlaySoundEffect *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + m4aSongNumStart(cmd->songId); + + return 1; +} + +// (-7) +static AnimCmdResult animCmd_TranslateSprite_BG(void *cursor, Sprite *s) +{ + ACmd_TranslateSprite *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + s->x += cmd->x; + s->y += cmd->y; + + return 1; +} + +// (-8) +static AnimCmdResult animCmd_8_BG(void *cursor, Sprite *s) +{ + ACmd_8 *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + return 1; +} + +static AnimCmdResult animCmd_SetIdAndVariant_BG(void *cursor, Sprite *s) +{ + ACmd_SetIdAndVariant *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + s->graphics.anim = cmd->animId; + s->prevVariant = 0xFF; + s->variant = cmd->variant; + + return -1; +} + +static AnimCmdResult animCmd_10_BG(void *cursor, Sprite *s) +{ + ACmd_10 *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + +#ifdef BUG_FIX + return 1; // I think this should be the correct behavior? +#else + return (s32)cursor; +#endif +} + +// This is not a NOP-instruction in the regular version +static AnimCmdResult animCmd_SetSpritePriority_BG(void *cursor, Sprite *s) +{ + ACmd_SetSpritePriority *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + return 1; +} + +// This is not a NOP-instruction in the regular version +static AnimCmdResult animCmd_SetOamOrder_BG(void *cursor, Sprite *s) +{ + ACmd_SetOamOrder *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + return 1; +} diff --git a/src/bg_triangles.c b/src/bg_triangles.c index b5db092fc..003e0736c 100644 --- a/src/bg_triangles.c +++ b/src/bg_triangles.c @@ -319,6 +319,7 @@ NONMATCH("asm/non_matching/engine/sub_800724C.inc", } END_NONMATCH +// TODO: param2 might be horizontal void sub_80075D0(u8 bg, u8 param1, u8 param2, s16 param3, u16 param4, u16 param5) { int_vcount *cursor; diff --git a/src/bg_update.c b/src/bg_update.c deleted file mode 100644 index 677e7e63e..000000000 --- a/src/bg_update.c +++ /dev/null @@ -1,607 +0,0 @@ -#include "global.h" -#include "core.h" -#include "flags.h" -#include "sprite.h" - -#define CastPointer(ptr, index) (void *)&(((u8 *)(ptr))[(index)]) - -void DrawBackground(Background *background) -{ - struct MapHeader *mapHeader = gTilemapsRef[background->tilemapId]; - const u16 *pal; - u32 palSize; - u16 gfxSize; - - background->xTiles = mapHeader->h.xTiles; - background->yTiles = mapHeader->h.yTiles; - background->graphics.src = mapHeader->h.tiles; - gfxSize = mapHeader->h.tilesSize; - background->graphics.size = gfxSize; - - if (!(background->flags & BACKGROUND_UPDATE_GRAPHICS)) { - gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &background->graphics; - gVramGraphicsCopyQueueIndex = (gVramGraphicsCopyQueueIndex + 1) & 0x1F; - background->flags ^= BACKGROUND_UPDATE_GRAPHICS; - } - - pal = mapHeader->h.palette; - palSize = mapHeader->h.palLength; - background->paletteOffset = mapHeader->h.palOffset; - - if (!(background->flags & BACKGROUND_UPDATE_PALETTE)) { - DmaCopy16(3, pal, gBgPalette + background->paletteOffset, - palSize * sizeof(*pal)); - gFlags |= FLAGS_UPDATE_BACKGROUND_PALETTES; - background->flags ^= BACKGROUND_UPDATE_PALETTE; - } - - background->layout = mapHeader->h.map; - - if (background->flags & BACKGROUND_FLAG_IS_LEVEL_MAP) { - background->metatileMap = mapHeader->metatileMap; - background->mapWidth = mapHeader->mapWidth; - background->mapHeight = mapHeader->mapHeight; - } - - gUnknown_03001800[gUnknown_0300287C] = background; - gUnknown_0300287C = (gUnknown_0300287C + 1) % ARRAY_COUNT(gUnknown_03001800); -} - -// (85.37%) https://decomp.me/scratch/617Jb -NONMATCH("asm/non_matching/engine/sub_8002B20.inc", bool32 sub_8002B20(void)) -{ - u16 sp00; - s32 sp04 = 0; - s32 sp08; - u16 sp0C; // line-size ? - u16 sp10; - u16 sp14; - u32 affine; // -> r3 - u32 bgId; // -> r5 = (bg->flags & BACKGROUND_FLAGS_MASK_BG_ID) - s32 sb; - u32 dmaSize; - - while (gUnknown_0300287C != gUnknown_03002AE4) { - Background *bg; - -#if !PORTABLE - // TODO: This #if should not be required. - if (!(REG_DISPSTAT & DISPSTAT_VBLANK)) - return FALSE; -#endif - - // _08002B64 - REG_VCOUNT; - { - Background **backgrounds = &gUnknown_03001800[0]; - s32 index = gUnknown_03002AE4; - bg = backgrounds[index]; - index = (index + 1) % ARRAY_COUNT(gUnknown_03001800); - gUnknown_03002AE4 = index; - - if ((bg->flags & BACKGROUND_FLAG_20) && (bg->scrollX == bg->prevScrollX) - && bg->scrollY == bg->prevScrollY) - continue; - } - // NOTE: register r4 = sp00 - sp00 = bg->xTiles; - - bgId = (bg->flags & BACKGROUND_FLAGS_MASK_BG_ID); - if (bgId > 1 && ((gDispCnt & 0x3) > 0)) { - affine = (gBgCntRegs[bgId] >> 14); - sp0C = (0x10 << affine); - sp08 = 1; - } else { - // _08002BD8 - sp0C = 0x20; - affine = (gBgCntRegs[bgId] >> 14); - if ((affine == 1) || (affine == 3)) { - sp04 = 0x800; - } - sp08 = 2; - } - - // _08002BF8 - sp0C = (u16)(sp0C * sp08); - - if (!(bg->flags & BACKGROUND_FLAG_20)) { - if (!(bg->flags & BACKGROUND_FLAG_IS_LEVEL_MAP)) { - // _08002C20 - u8 *r1 = CastPointer(bg->layoutVram, bg->unk24 * sp0C); - u16 *r7 = CastPointer(r1, bg->unk22 * sp08); - u16 r5 = bg->targetTilesY; - - // r2 <- bg->flags - // r3 <- affine - // r4 <- sp00 - // r5 <- bg->targetTilesY - // sb = 0x20 - if (bg->flags & BACKGROUND_FLAG_100) { - // _08002C46 - if (bg->flags & BACKGROUND_FLAG_80) { - u32 r0Index = (((bg->unk20 + r5) - 1) * sp00) * sp08; - void *r2Ptr = CastPointer(bg->layout, r0Index); - u16 *r4Ptr = CastPointer( - r2Ptr, ((bg->unk1E + bg->targetTilesX) - 1) * sp08); - - // _08002C7C - while (r5-- != 0) { - u16 i; - - // _08002C9A - for (i = 0; i < bg->targetTilesX; i++) { - r7[i] = (*(r4Ptr - i) ^ TileMask_FlipXY); - } - - r7 = CastPointer(r7, sp0C); - r4Ptr = (void *)(((u8 *)r4Ptr) - (sp00 * sp08)); - } - } else { - // _08002CD4 - u32 someIndex = (bg->unk20 * sp00); - void *r2Ptr = CastPointer(bg->layout, someIndex * sp08); - u32 index2 = ((bg->unk1E + bg->targetTilesX) - 1); - u16 *r4Ptr = CastPointer(r2Ptr, index2 * sp08); - - // _08002D08 - while (r5-- != 0) { - u16 i; - - for (i = 0; i < bg->targetTilesX; i++) { - r7[i] = (*(r4Ptr - i) ^ TileMask_FlipX); - } - - r7 = CastPointer(r7, sp0C); - r4Ptr = CastPointer(r4Ptr, (sp00 * sp08)); - } - } - } else { - u16 *r4Ptr; - // r2 <- bg->flags - // r3 <- affine - // r4 <- sp00 - // r5 <- r5 = bg->targetTilesY - // sb = 0x20 - // _08002D50 - if (bg->flags & BACKGROUND_FLAG_80) { - u32 r0Index = (((bg->unk20 + r5) - 1) * sp00); - void *r1Ptr = CastPointer(bg->layout, r0Index * sp08); - r4Ptr = CastPointer(r1Ptr, bg->unk1E * sp08); - - while (r5-- != 0) { - u16 i; - sb = sp00 * sp08; - - for (i = 0; i < bg->targetTilesX; i++) { - r7[i] = r4Ptr[i] ^ 0x800; - } - - r7 = CastPointer(r7, sp0C); - - r4Ptr = (u16 *)(((u8 *)r4Ptr) - sb); - } - } else { - // _08002DD4 - if ((affine & 1) && (sp08 == 2) && ((0x20 - bg->unk22) > 0) - && ((bg->targetTilesX + bg->unk22 - 0x20) > 0)) { - s32 vR2; - // __08002DF8 - r4Ptr = (u16 *)(&bg->layout[bg->unk20 * sp00] + bg->unk1E); - sb = (0x20 - bg->unk22) * 2; - vR2 = (bg->targetTilesX + bg->unk22 - 0x20) * 2; - - while (r5-- != 0) { - // _08002E1C - // r7 <- sp08 - DmaCopy16(3, r4Ptr, r7, sb); - DmaCopy16(3, CastPointer(r4Ptr, sb), - CastPointer(r7, sp04), vR2); - - r7 = CastPointer(r7, sp0C); - r4Ptr = CastPointer(r4Ptr, (sp00 * sp08)); - } - - } else { - // __08002E74 - u32 r0Index = bg->unk20 * sp00 * sp08; - void *r1Ptr - = CastPointer(bg->layout, bg->unk20 * sp00 * sp08); - void *r4Ptr = CastPointer(r1Ptr, bg->unk1E * sp08); - - // r0 = r0Index - // r1 = r1Ptr - // r2 = sp00 - // r4 = r4Ptr - // r6 = bg - // r7 = - while (r5-- != 0) { - // _08002EA4 - DmaCopy16(3, r4Ptr, r7, (s32)(bg->targetTilesX * sp08)); - r7 = CastPointer(r7, sp0C); - r4Ptr = CastPointer(r4Ptr, sp00 * sp08); - } - } - } - } - } else { - // r3 = affine - // r6 = bg - // _08002ED4 - s32 sp18; - s32 sp1C; - u32 sp20; - s32 sp38; - u32 dmaFlags; // <- sp3C - s32 i, j; - sp10 = bg->unk1E; - sp14 = bg->unk20; - - // _08002EE8 - for (i = 0; i < bg->targetTilesX;) { - s32 r1; - s32 r5Res; - s32 r8; - s32 sp10_i = sp10 + i; - s32 temp; - - sp18 = Div(sp10_i, bg->xTiles); - r1 = bg->xTiles; - r5Res = sp18; - - sp1C = sp10_i - r5Res * bg->xTiles; - - r8 = bg->targetTilesY; - temp = (bg->targetTilesX - i); - r1 -= sp1C; - if (r1 > temp) - r1 = (bg->targetTilesX - i); - - sp20 = r1 * sp08; - - // _08002F28 - // sb = j - for (j = 0; j < bg->targetTilesY;) { - void *dmaSrc, *dmaDest; - s32 r5; -#ifndef NON_MATCHING - register const u16 *r1Ptr asm("r1"); - register void *r2Ptr asm("r2"); - register void *r0Ptr asm("r0"); -#else - const u16 *r1Ptr; - void *r2Ptr; - void *r0Ptr; -#endif - s32 temp2; - u32 v; - s32 r4 = sp14 + j; - s32 result = Div(r4, bg->yTiles); - r4 -= result * bg->yTiles; - r5 = bg->yTiles - r4; - - result *= bg->mapWidth; - r2Ptr = (void *)bg->metatileMap; - temp2 = sp18 << 1; - r0Ptr = CastPointer(r2Ptr, result << 1); - r1Ptr = CastPointer(r0Ptr, temp2); - - // r1 = v - v = *((u16 *)r1Ptr) * bg->xTiles * bg->yTiles; - v += r4 * bg->xTiles + sp1C; - v *= sp08; - - dmaSrc = ((u8 *)bg->layout) + v; - - { - void *r0; - r0 = CastPointer(bg->layoutVram, bg->unk24); - r0 = CastPointer(r0, sp0C * j); - r0 = CastPointer(r0, bg->unk22); - dmaDest = CastPointer(r0, i * sp08); - } - - j += r5; - - if (r5 > r8) - r5 = r8; - - r8 -= r5; - - while (r5-- != 0) { - dmaFlags = sp20; - DmaCopy16(3, dmaSrc, dmaDest, (s32)dmaFlags); - dmaDest += sp0C; - dmaSrc += sp00 * sp08; - } - } - - i += r1; - } - // _08002FD6 - } - } else { - // r2 <- bg->flags - // r3 <- bg->unk30 - // r4 <- sp00 == bg->xTiles - // r5 <- bgId - // _08002FE8 - if (!(bg->flags & BACKGROUND_FLAG_IS_LEVEL_MAP)) { - u32 vR2 = bg->xTiles; - while (bg->scrollX >= sp00 * 8) - bg->scrollX -= sp00 * 8; - - while (bg->scrollY >= bg->yTiles * 8) { - bg->scrollY -= bg->yTiles * 8; - } - } - //_08003034 - gBgScrollRegs[bgId][0] = bg->scrollX & 0x7; - gBgScrollRegs[bgId][1] = bg->scrollY & 0x7; - - if ((bg->prevScrollX >> 3 != bg->scrollX >> 3) - || (bg->prevScrollY >> 3 != bg->scrollY >> 3)) { - if (!(bg->flags & BACKGROUND_FLAG_IS_LEVEL_MAP)) { - // _08003072 - // TODO: Something'S wrong with the types here (r2 should be s16?) - u16 *r7Ptr; - s16 r2; - s32 r4; - u16 r5; - u16 *sp3C; - u32 notherIndex; - sp10 = (u16)((bg->scrollX >> 3) + bg->unk1E); - sp14 = (u16)((bg->scrollY >> 3) + bg->unk20); - - notherIndex = (bg->unk24 * sp0C); - r7Ptr = CastPointer(bg->layoutVram, notherIndex); - r7Ptr = CastPointer(r7Ptr, bg->unk22 * sp08); - - if (((bg->targetTilesX + sp10) + 1) > bg->xTiles) { - r2 -= (bg->xTiles - 1); - } else { - r2 = 0; - } - - r5 = bg->targetTilesY + 1; - if (bg->flags & BACKGROUND_FLAG_100) { - // _080030D4 - if (bg->flags & BACKGROUND_FLAG_80) { - // _080030DC - u32 index = ((bg->unk20 + r5) - 1); - u16 *r1Ptr = (u16 *)&((u8 *)bg->layout)[r4 * index * sp08]; - u32 index2 = ((bg->unk1E + bg->targetTilesX) - 1); - u16 *r4Ptr = &r1Ptr[index2 * sp08]; - - while (r5-- != 0) { - // _08003108 - u16 i; // <- r3 - for (i = 0; i < bg->targetTilesX; i++) { - u32 mask = TileMask_FlipXY; - // _08003126 - sp3C = &r7Ptr[i]; - *sp3C = (r4Ptr[0 - i] ^ mask); - } - } - } else { - // _08003158 - u32 index; - u16 *r1Ptr; - u32 index2; - u16 *r4Ptr; - index = bg->unk20; - index *= r4; - index *= sp08; - r1Ptr = (u16 *)&((u8 *)bg->layout)[index]; - index2 = bg->unk1E + bg->targetTilesX - 1; - r4Ptr = CastPointer(r1Ptr, index2 * sp08); - - while (r5-- != 0) { - // _08003180 - u16 i; - for (i = 0; i < bg->targetTilesX; i++) { - // _0800319E - sp3C = &r7Ptr[i]; - *sp3C = (r4Ptr[0 - i] ^ TileMask_FlipX); - } - } - } - } else { - // _080031D0 - if (bg->flags & BACKGROUND_FLAG_80) { - // _080031D8 - u32 index = ((sp14 + r5) - 1); - u16 *r0Ptr = (u16 *)&((u8 *)bg->layout)[r4 * index * sp08]; - u32 index2 = sp10; - u16 *r4Ptr = &r0Ptr[index2 * sp08]; - - while (r5-- != 0) { - u16 i = 0; - - for (; i < bg->targetTilesX; i++) { - sp3C = &r7Ptr[i]; - *sp3C = r4Ptr[i] ^ TileMask_FlipY; - } - r7Ptr = CastPointer(r7Ptr, sp0C); - r4Ptr = (void *)(((u8 *)r4Ptr) - sp00 * sp08); - } - } else { - // _08003254 - u32 index = sp14; - u16 *r0Ptr = (u16 *)&((u8 *)bg->layout)[r4 * index * sp08]; - u32 index2 = sp10; - u16 *r4Ptr = &r0Ptr[index2 * sp08]; - - // _08003298 - while (r5-- != 0) { - dmaSize = bg->targetTilesX - (r2 - 1); - dmaSize *= sp08; - dmaSize += (dmaSize >> 31); - DmaCopy16(3, r4Ptr, r7Ptr, dmaSize); - - r7Ptr = CastPointer(r7Ptr, sp0C); - r4Ptr = CastPointer(r4Ptr, sp00 * sp08); - } - } - } - // _080032C4 - if (r2 != 0) { - // _080032CE - u8 *r1 = CastPointer(bg->layoutVram, bg->unk24 * sp0C); // <- r1 - u32 displayTile = bg->unk22 + bg->xTiles - sp10; // <- r0 - u16 *r7Ptr = CastPointer(r1, displayTile * sp08); - u16 r5 = (bg->targetTilesY + 1); - - if (bg->flags & BACKGROUND_FLAG_100) { - if (bg->flags & BACKGROUND_FLAG_80) { - // _08003306 - u32 index = ((sp14 + r5) - 1) * r4; - u16 *r1Ptr = (u16 *)&(((u8 *)bg->layout)[index * sp08]); - u16 *r4Ptr = (u16 *)((u8 *)&r1Ptr[(r2 - 1) * sp08]); - - while (--r5 != (u16)-1) { - u16 i; - for (i = 0; i < bg->targetTilesX; i++) { - r7Ptr[i] = *(r4Ptr - i) ^ TileMask_FlipXY; - } - r7Ptr = CastPointer(r7Ptr, sp0C); - r4Ptr = (u16 *)(((u8 *)r4Ptr) - sp00 * sp08); - } - } else { - // _08003380 - u32 index; - u8 *r1Ptr; - u16 *r4Ptr; - index = sp14; - index *= r4; - index *= sp08; - r1Ptr = &((u8 *)bg->layout)[index]; - r4Ptr = (u16 *)&r1Ptr[(r2 - 1) * sp08]; - - while (--r5 != (u16)-1) { - u16 i; - for (i = 0; i < bg->targetTilesX; i++) { - r7Ptr[i] = *(r4Ptr - i) ^ TileMask_FlipX; - } - r7Ptr = CastPointer(r7Ptr, sp0C); - r4Ptr = CastPointer(r4Ptr, sp00 * sp08); - } - } - } else { - // _080033F4 - if (bg->flags & BACKGROUND_FLAG_80) { - // _080033FC - u32 index = ((sp14 + r5) - 1) * r4; - u16 *r4Ptr = (u16 *)&((u8 *)bg->layout)[index * sp08]; - - u32 sp30 = r2; - while (--r5 != (u16)-1) { - u16 i; - for (i = 0; i < r2; i++) { - u16 *sp3C = &r7Ptr[i]; - *sp3C = r4Ptr[i] ^ TileMask_FlipY; - } - r7Ptr = CastPointer(r7Ptr, sp0C); - r4Ptr = (u16 *)(((u8 *)r4Ptr) - sp00 * sp08); - } - } else { - // _08003474 - u32 index = (sp14 * r4); - u16 *r4Ptr = (u16 *)&((u8 *)bg->layout)[index * sp08]; - - while (r5-- != 0) { - dmaSize = sp08 * r2; - // _08003492 - DmaCopy16(3, r4Ptr, r7Ptr, (s32)dmaSize); - - r7Ptr = CastPointer(r7Ptr, sp0C); - r4Ptr = CastPointer(r4Ptr, sp00 * sp08); - } - } - } - } - } else { - // _080034DC - s32 i; - s32 j; - sp10 = (bg->scrollX >> 3) + bg->unk1E; - sp14 = (bg->scrollY >> 3) + bg->unk20; - - for (i = 0; i < bg->targetTilesX;) { - // _08003500 - s32 r4 = sp10 + i; - s32 sp24 = Div(r4, bg->xTiles); - s32 r1 = bg->xTiles; - s32 sp28 = r4 - (sp24 * r1); - s32 sp2C; - s32 sp34; - s32 r8 = bg->targetTilesY; - s32 r0 = bg->targetTilesX - i; - r1 = r1 - sp28; - - if (r1 > r0) - r1 = r0; - - // _0800352E - sp2C = r1 * sp08; - - for (j = 0; j < bg->targetTilesY;) { - // _08003542 - s32 divident = sp14 + j; - s32 yPos = Div(divident, bg->yTiles); - s32 new_r4 = divident - (yPos * bg->yTiles); - s32 r5 = bg->yTiles - new_r4; - yPos *= bg->mapWidth; - - { // _0800355C - s32 metatileIndex = *(&bg->metatileMap[yPos] + sp24); - s32 otherVal; - metatileIndex *= bg->xTiles; - metatileIndex *= bg->yTiles; - - otherVal = new_r4 * bg->xTiles; - otherVal += sp28; - otherVal += metatileIndex; - - { - // r4 <- dmaSrc - u8 *dmaSrc; - u8 *dmaDest; - u8 *destPtr; - u32 destIndex; - dmaSrc = CastPointer(bg->layout, otherVal * sp08); - destPtr = CastPointer(bg->layoutVram, bg->unk24); - destPtr += sp0C * j; - destPtr += +bg->unk22; - dmaDest = CastPointer(destPtr, i * sp08); - - j += r5; - - if (r5 > r8) - r5 = r8; - r8 -= r5; - - // _080035A4 - while (r5-- != 0) { - dmaSize = sp2C; - DmaCopy16(3, dmaSrc, dmaDest, (s32)dmaSize); - dmaDest += sp0C; - dmaSrc += sp00 * sp08; - } - } - } - } - - i += r1; - } - } - } - } - // _080035FA - REG_VCOUNT; - bg->prevScrollX = bg->scrollX; - bg->prevScrollY = bg->scrollY; - }; - - return 1; -} -END_NONMATCH diff --git a/src/core.c b/src/core.c index 15095706b..fa98c24dd 100644 --- a/src/core.c +++ b/src/core.c @@ -72,7 +72,7 @@ u8 gKeysFirstRepeatIntervals[10] ALIGNED(16) = {}; u16 gReleasedKeys ALIGNED(4) = 0; u8 gUnknown_03002710[] ALIGNED(16) = {}; u32 gFlagsPreVBlank = 0; -/* 0x03002794 */ const struct SpriteTables *gUnknown_03002794 = NULL; +/* 0x03002794 */ const struct SpriteTables *gRefSpriteTables = NULL; struct GraphicsData *gVramGraphicsCopyQueue[] ALIGNED(16) = {}; u16 gUnknown_03002820 = 0; s16 gBgScrollRegs[][2] ALIGNED(16) = {}; @@ -281,7 +281,7 @@ void GameInit(void) gInputPlaybackData = NULL; gFrameCount = 0; -#ifdef UB_FIX +#ifdef BUG_FIX for (i = 0; i < ARRAY_COUNT(gIntrTableTemplate); i++) #else for (i = 0; i < 15; i++) diff --git a/src/game/boost_effect.c b/src/game/boost_effect.c index 55c46a31d..cfbd8338c 100644 --- a/src/game/boost_effect.c +++ b/src/game/boost_effect.c @@ -173,7 +173,7 @@ static inline void sub_8015B64_inline(AnimId anim, u16 palId) insertOffset += palId; numColors = *pAnim % 256u; - DmaCopy32(3, &gUnknown_03002794->palettes[animPalId * 16], + DmaCopy32(3, &gRefSpriteTables->palettes[animPalId * 16], &gObjPalette[insertOffset], numColors * sizeof(u16)); gFlags |= FLAGS_UPDATE_SPRITE_PALETTES; diff --git a/src/game/bosses/boss_8.c b/src/game/bosses/boss_8.c new file mode 100644 index 000000000..4a34dda74 --- /dev/null +++ b/src/game/bosses/boss_8.c @@ -0,0 +1,1518 @@ +#include "global.h" +#include "core.h" +#include "flags.h" +#include "task.h" +#include "trig.h" +#include "bg_triangles.h" +#include "malloc_vram.h" +#include "gba/defines.h" +#include "gba/io_reg.h" +#include "lib/m4a.h" +#include "sakit/globals.h" +#include "sakit/camera.h" +#include "sakit/collision.h" +#include "sakit/player.h" +#include "game/bosses/common.h" +#include "game/player_callbacks.h" // UpdateHomingPosition +#include "game/cheese.h" +#include "game/stage/player.h" +#include "game/stage/results.h" +#include "game/stage/boss_results_transition.h" +#include "game/stage/game_7.h" +#include "game/stage/screen_fade.h" +#include "game/stage/screen_shake.h" + +#include "constants/animations.h" +#include "constants/move_states.h" +#include "constants/player_transitions.h" +#include "constants/songs.h" +#include "constants/tilemaps.h" + +#define BOSS_8_ARM_LEFT 0 +#define BOSS_8_ARM_RIGHT 1 +#define BOSS_8_ARM_COUNT 2 + +#define SWITCH_ARM_VARIANT(boss, arm, vNum) \ + { \ + Sprite *s = &boss->bsArms[arm].s; \ + \ + if (arm != BOSS_8_ARM_LEFT) { \ + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_ARM_RIGHT; \ + s->variant = vNum; \ + } else { \ + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_ARM_LEFT; \ + s->variant = vNum; \ + } \ + s->prevVariant = -1; \ + } + +typedef struct { + /* 0x00 */ Sprite s; + /* 0x30 */ SpriteTransform transform; +} BossSprite; + +typedef struct { + /* 0x00 */ Vec2_32 qPos; + /* 0x08 */ u8 livesCockpit; + /* 0x09 */ u8 livesArms[BOSS_8_ARM_COUNT]; + /* 0x0B */ u8 unkB; + /* 0x0C */ u8 unkC; + /* 0x0E */ u16 unkE; + /* 0x10 */ u16 unk10; // rotationHead ? + /* 0x12 */ u8 unk12; + /* 0x14 */ u32 unk14; + /* 0x18 */ Vec2_32 qUnk18[BOSS_8_ARM_COUNT]; + /* 0x28 */ u16 rotation[BOSS_8_ARM_COUNT]; + /* 0x2C */ u16 rotation2[BOSS_8_ARM_COUNT]; + /* 0x30 */ u16 unk30[BOSS_8_ARM_COUNT]; + /* 0x34 */ s16 qUnk34[BOSS_8_ARM_COUNT][2]; + /* 0x3C */ u8 unk3C[BOSS_8_ARM_COUNT]; + /* 0x3E */ u8 unk3E[BOSS_8_ARM_COUNT]; + /* 0x40 */ u8 unk40[BOSS_8_ARM_COUNT]; + /* 0x42 */ u8 unk42[BOSS_8_ARM_COUNT]; + /* 0x44 */ void *tilesCloud; + /* 0x48 */ ScreenFade fade; + /* 0x54 */ BossSprite bsHead; + /* 0x90 */ BossSprite bsArms[BOSS_8_ARM_COUNT]; + /* 0x108 */ Background body; +} SuperEggRoboZ; /* size: 0x148 */ + +typedef void (*EggRoboFn)(SuperEggRoboZ *boss, u8 arm); + +void Task_SuperEggRoboZMain(void); +void TaskDestructor_SuperEggRoboZMain(struct Task *); + +// TODO: Remove once boss_run.h has its own prototype for this function. +// (or once it is integrated into this module, if it makes sense) +extern void sub_8049D20(void *vramTiles, SuperEggRoboZ *boss); +void Task_804AB24(void); +void Task_804AD68(void); +u8 sub_804B0EC(SuperEggRoboZ *boss, u8 arm); +void sub_804B43C(SuperEggRoboZ *boss, u8 p1); +void sub_804B594(SuperEggRoboZ *boss, u8 p1); +void sub_804B734(SuperEggRoboZ *boss, u8 p1); +void sub_804B984(SuperEggRoboZ *boss, u8 p1); +void sub_804BAC0(SuperEggRoboZ *boss, u8 p1); +void sub_804BC44(SuperEggRoboZ *boss, u8 p1); +void sub_804BE6C(SuperEggRoboZ *boss, u8 p1); +void sub_804C080(SuperEggRoboZ *boss); +void sub_804C240(SuperEggRoboZ *boss, u8 p1); +void sub_804C3AC(SuperEggRoboZ *boss); +void sub_804C5B8(SuperEggRoboZ *boss); +void sub_804C830(SuperEggRoboZ *boss); +void sub_804CA08(SuperEggRoboZ *boss); +void sub_804CA70(SuperEggRoboZ *boss); +void Task_ShowResultsAndDelete(void); +void sub_804CC98(SuperEggRoboZ *boss); +void sub_804AE40(SuperEggRoboZ *boss); +void Boss8_HitCockpit(SuperEggRoboZ *boss); +void sub_804C8F4(SuperEggRoboZ *boss); +void sub_804CCD0(SuperEggRoboZ *boss, s32 qP1); +bool8 sub_804C9B4(SuperEggRoboZ *boss, u8 param1); + +const u16 gUnknown_080D8888[2][2] = { { Q(188), Q(110) }, { Q(162), Q(110) } }; +const EggRoboFn gUnknown_080D8890[8] + = { sub_804B43C, sub_804B594, sub_804B734, sub_804B984, + sub_804BC44, sub_804BE6C, sub_804BAC0, sub_804C240 }; + +const u16 sArmPalettes[2][16] = { + INCBIN_U16("graphics/boss_8_a.gbapal"), + INCBIN_U16("graphics/boss_8_b.gbapal"), +}; + +void CreateSuperEggRoboZ(void) +{ + struct Task *t; + SuperEggRoboZ *boss; + ScreenFade *fade; + Sprite *s; + Background *body; + u8 arm; + + gBgCntRegs[0] = (BGCNT_TXT512x512 | BGCNT_SCREENBASE(20) | BGCNT_CHARBASE(3) + | BGCNT_PRIORITY(2)); + gBgCntRegs[2] = (BGCNT_TXT256x256 | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(0) + | BGCNT_PRIORITY(1)); + gBgScrollRegs[0][0] = 0; + gBgScrollRegs[0][1] = 0; + gUnknown_03004D80[0] = 0; + gUnknown_03002280[0][0] = 0; + gUnknown_03002280[0][1] = 0; + gUnknown_03002280[0][2] = 0xFF; + gUnknown_03002280[0][3] = 0x40; + gPlayer.moveState |= MOVESTATE_IGNORE_INPUT; + sub_8039ED4(); + gPseudoRandom = gStageTime; + gUnknown_03005AF0.s.unk10 &= ~SPRITE_FLAG_MASK_PRIORITY; + gUnknown_03005AF0.s.unk10 |= SPRITE_FLAG(PRIORITY, 1); + gUnknown_03005AA0.s.unk10 &= ~SPRITE_FLAG_MASK_PRIORITY; + gUnknown_03005AA0.s.unk10 |= SPRITE_FLAG(PRIORITY, 1); + + t = TaskCreate(Task_SuperEggRoboZMain, sizeof(SuperEggRoboZ), 0x4000, 0, + TaskDestructor_SuperEggRoboZMain); + gActiveBossTask = t; + boss = TASK_DATA(t); + fade = &boss->fade; + + if (gDifficultyLevel != DIFFICULTY_NORMAL) { + boss->livesCockpit = 6; + boss->livesArms[BOSS_8_ARM_LEFT] = 4; + boss->livesArms[BOSS_8_ARM_RIGHT] = 4; + } else { + boss->livesCockpit = 8; + boss->livesArms[BOSS_8_ARM_LEFT] = 6; + boss->livesArms[BOSS_8_ARM_RIGHT] = 6; + } + + boss->qPos.x = Q(42876); + boss->qPos.y = Q(370); + boss->unkE = 360; + boss->unk10 = 512; + boss->unkB = 0; + boss->unkC = 0; + boss->unk14 = 30; + boss->tilesCloud = VramMalloc(32); + sub_8049D20(boss->tilesCloud, boss); + + for (arm = 0; arm < BOSS_8_ARM_COUNT; arm++) { + boss->rotation[arm] = (SIN_PERIOD / 2); + boss->rotation2[arm] = (SIN_PERIOD / 2); + boss->qUnk18[arm].x = Q(0.0); + boss->qUnk18[arm].y = Q(0.0); + boss->unk3C[arm] = 0; + boss->unk30[arm] = arm * 360 + 360; + boss->unk3E[arm] = Q(0.0); + boss->unk40[arm] = Q(0.0); + boss->unk42[arm] = Q(0.0); + boss->qUnk34[arm][0] = Q(0.0); + boss->qUnk34[arm][1] = Q(0.0); + + s = &boss->bsArms[arm].s; + s->x = 0; + s->y = 0; + + if (arm != 0) { + s->graphics.dest = VramMalloc(8 * 8); + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_ARM_RIGHT; + s->variant = 0; + } else { + s->graphics.dest = VramMalloc(8 * 8); + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_ARM_LEFT; + s->variant = 0; + } + + s->unk1A = SPRITE_OAM_ORDER(27 + (arm * 4)); + s->graphics.size = 0; + s->animCursor = 0; + s->timeUntilNextFrame = 0; + s->prevVariant = -1; + s->animSpeed = SPRITE_ANIM_SPEED(1.0); + s->palId = 0; + s->hitboxes[0].index = HITBOX_STATE_INACTIVE; + s->unk10 = SPRITE_FLAG(PRIORITY, 1); + } + + fade->window = 0; + fade->brightness = 0; + fade->flags = SCREEN_FADE_FLAG_2; + fade->speed = 0; + fade->bldCnt = ((BLDCNT_TGT2_ALL & ~BLDCNT_TGT2_BG3) | BLDCNT_EFFECT_LIGHTEN + | BLDCNT_TGT1_ALL); + fade->bldAlpha = 0; + + body = &boss->body; + body->graphics.dest = (void *)BG_CHAR_ADDR(3); + body->graphics.anim = 0; + body->layoutVram = (void *)BG_SCREEN_ADDR(20); + body->unk18 = 0; + body->unk1A = 0; + body->tilemapId = TM_REGULAR_FINAL_BOSS; + body->unk1E = 0; + body->unk20 = 0; + body->unk22 = 0; + body->unk24 = 0; + body->targetTilesX = 30; + body->targetTilesY = 20; + body->paletteOffset = 0; + body->flags = 0; + DrawBackground(body); + + s = &boss->bsHead.s; + s->x = 0; + s->y = 0; + s->graphics.dest = VramMalloc(8 * 8); + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD; + s->variant = 0; + s->unk1A = SPRITE_OAM_ORDER(31); + s->graphics.size = 0; + s->animCursor = 0; + s->timeUntilNextFrame = 0; + s->prevVariant = -1; + s->animSpeed = SPRITE_ANIM_SPEED(1.0); + s->palId = 0; + s->hitboxes[0].index = -1; + s->unk10 = SPRITE_FLAG(PRIORITY, 3); + gUnknown_030054A8.unk6 = 200; + gStageFlags |= EXTRA_STATE__DISABLE_PAUSE_MENU; +} + +void Task_804A9D8(void) +{ + SuperEggRoboZ *boss = TASK_DATA(gCurTask); + + if (boss->unk14 > 60) { + boss->qPos.y -= Q(1.0); + + if ((gStageTime % 32u) == 0) { + m4aSongNumStart(SE_260); + } + + if ((gStageTime % 8u) == 0) { + CreateScreenShake(0x100, 0x10, 0x80, 0x14, (SCREENSHAKE_VERTICAL | 0x3)); + } + + if (Mod(boss->unk14, 30) == 0) { + s8 v; + gPlayer.moveState = 0; + v = ((boss->unk14 - 60) / 30) - 2; + + if (v > 3) { + v = 3; + } + + if (v >= 0 && v <= 3) { + gPlayer.unk64 = 70 - v; + gPlayer.unk66 = -1; + } + } + } + + boss->unkB = 1; + sub_804C3AC(boss); + + gPlayer.moveState |= (MOVESTATE_IGNORE_INPUT | MOVESTATE_400000); + + if (--boss->unk14 == 0) { + gStageFlags &= ~EXTRA_STATE__DISABLE_PAUSE_MENU; + gPlayer.moveState &= ~(MOVESTATE_IGNORE_INPUT | MOVESTATE_400000); + + m4aSongNumStart(SE_260); + + gUnknown_030054A8.unk0 = 0; + gUnknown_030054A8.unk1 = 18; + gCamera.minX = 42820; + boss->unkB = 0; + gPlayer.moveState &= ~(MOVESTATE_IGNORE_INPUT); + + gUnknown_03005AF0.s.unk10 &= ~SPRITE_FLAG_MASK_PRIORITY; + gUnknown_03005AF0.s.unk10 |= SPRITE_FLAG(PRIORITY, 1); + gUnknown_03005AA0.s.unk10 &= ~SPRITE_FLAG_MASK_PRIORITY; + gUnknown_03005AA0.s.unk10 |= SPRITE_FLAG(PRIORITY, 1); + gCurTask->main = Task_804AB24; + } +} + +// (99.89%) https://decomp.me/scratch/kiah8 +NONMATCH("asm/non_matching/game/bosses/boss_8__Task_804AB24.inc", + void Task_804AB24(void)) +{ + s32 speed; + SuperEggRoboZ *boss = TASK_DATA(gCurTask); + ScreenFade *fade = &boss->fade; + + sub_804CC98(boss); + sub_804CA08(boss); + sub_804AE40(boss); + + gUnknown_080D8890[boss->unk3C[BOSS_8_ARM_LEFT]](boss, BOSS_8_ARM_LEFT); + gUnknown_080D8890[boss->unk3C[BOSS_8_ARM_RIGHT]](boss, BOSS_8_ARM_RIGHT); + + sub_804C5B8(boss); + sub_804C830(boss); + sub_804CA70(boss); + + if ((I(gPlayer.y) > 184) && (I(gPlayer.x) >= 43034)) { + sub_800CBA4(&gPlayer); + + speed = gPlayer.speedAirX; + if (speed > 0) { + gPlayer.speedAirX = -speed; + } + + speed = gPlayer.speedGroundX; + if (speed > 0) { + gPlayer.speedGroundX = -speed; + } + } + // _0804ABC0 + + if (I(gPlayer.x) >= 43088) { + sub_800CBA4(&gPlayer); + + speed = gPlayer.speedAirX; + if (speed > 0) { + gPlayer.speedAirX = -speed; + } + + speed = gPlayer.speedGroundX; + if (speed > 0) { + gPlayer.speedGroundX = -speed; + } + } + // _0804ABF2 + + if (boss->livesCockpit == 0) { + u8 arm; + // _0804ABF2 + + gFlags &= ~FLAGS_4; + gCurTask->main = Task_804AD68; + boss->unk14 = 0xFF; + + Player_DisableInputAndBossTimer_FinalBoss(); + + gPlayer.moveState |= MOVESTATE_IGNORE_INPUT; + gPlayer.unk5C = 0; + gPlayer.unk5E = 0; + + if (gPlayer.moveState & (MOVESTATE_8 | MOVESTATE_IN_AIR)) { + gPlayer.unk64 = 50; + gPlayer.speedAirX = -Q(2); + gPlayer.speedAirY = -Q(0); + gPlayer.transition = PLTRANS_PT5; + } else { + // _0804AC68 + gPlayer.speedGroundX = Q(0); + gPlayer.speedAirX = Q(0); + gPlayer.speedAirY = Q(0); + } + // _0804AC6E + + fade->window = 0; + fade->brightness = 0; + fade->flags = SCREEN_FADE_FLAG_LIGHTEN; + fade->speed = 16; + fade->bldCnt = (BLDCNT_TGT2_ALL | BLDCNT_EFFECT_LIGHTEN | BLDCNT_TGT1_ALL); + fade->bldAlpha = 0; + + for (arm = 0; arm < BOSS_8_ARM_COUNT; arm++) { + Sprite *sprArm; + u16 anim; + // _0804ACB2 + boss->qUnk18[arm].x += (COS(boss->rotation[arm]) * 15) >> 6; + boss->qUnk18[arm].y += (SIN(boss->rotation[arm]) * 15) >> 6; + + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3); + + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + + SWITCH_ARM_VARIANT(boss, arm, 2); + } + } +} +END_NONMATCH + +void Task_804AD68(void) +{ + SuperEggRoboZ *boss = TASK_DATA(gCurTask); + + if (UpdateScreenFade(&boss->fade) == SCREEN_FADE_COMPLETE) { + TasksDestroyInPriorityRange(0x5010, 0x5011); + TasksDestroyInPriorityRange(0x5431, 0x5434); + + gStageFlags |= EXTRA_STATE__TURN_OFF_HUD; + + gPlayer.moveState |= MOVESTATE_100000; + gPlayer.moveState |= MOVESTATE_400000; + gCurTask->main = Task_ShowResultsAndDelete; + } else { + sub_804CC98(boss); + sub_804CA08(boss); + + gUnknown_080D8890[boss->unk3C[BOSS_8_ARM_LEFT]](boss, BOSS_8_ARM_LEFT); + gUnknown_080D8890[boss->unk3C[BOSS_8_ARM_RIGHT]](boss, BOSS_8_ARM_RIGHT); + + sub_804C5B8(boss); + sub_804CA70(boss); + sub_804C080(boss); + } +} + +// (95.06%) https://decomp.me/scratch/of4k0 +// (98.77%) https://decomp.me/scratch/Kzx1m +// (99.59%) +NONMATCH("asm/non_matching/game/bosses/boss_8__sub_804AE40.inc", + void sub_804AE40(SuperEggRoboZ *boss)) +{ + Sprite *s; + + if (gPlayer.moveState & MOVESTATE_DEAD) { + if (boss->unkE == 0) { + gBldRegs.bldY = 0; + boss->fade.brightness = 0; + gFlags &= ~FLAGS_4; + } + boss->unkE = 2; + } + + if (boss->unkE > 0) { + if (--boss->unkE == 0) { + boss->unk12 = 120; + } + } else { + // _0804AEA0 + + if (boss->unkB > 0) { + if (boss->unk12 > 0) { + boss->unk12 = 120; + + boss->fade.brightness = Q(32); + UpdateScreenFade(&boss->fade); + } + // _0804AEC2 + + gFlags &= ~FLAGS_4; + } else { + // _0804AED4 + if (--boss->unk12 == 0) { + u32 livesCockpit; + gFlags &= ~FLAGS_4; + + boss->fade.brightness = Q(32); + UpdateScreenFade(&boss->fade); + + livesCockpit = boss->livesCockpit; + boss->unkE = (livesCockpit <= 4) ? 140 : 360; + + s = &boss->bsHead.s; + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD; + s->variant = 0; + s->prevVariant = -1; + } else { + // _0804AF34 + s32 r6; + s32 r8; + + r8 = I(boss->qPos.x + Q(190)); + r8 += ((COS(boss->unk10) * 11) >> 14); + r8 -= gCamera.x; + + r6 = I(boss->qPos.y + Q(40)); + r6 += ((SIN(boss->unk10) * 11) >> 14); + r6 -= gCamera.y; + + if (boss->unk12 > 90) { + s32 val; + s32 rand; + InitHBlankBgOffsets(0); + + sub_80075D0(0, 0, 160, r8, r6, ({ + rand = PseudoRandom32(); + I(SIN(((boss->unk12 - 90) * 8) % 256u)) + +(rand % 8u); + })); + + boss->fade.brightness = (boss->unk12 - 90) * 273; + UpdateScreenFade(&boss->fade); + } else { + s16 r4; + + if (boss->unk12 == 90) { + // _0804B008+4 + s = &boss->bsHead.s; + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD; + s->variant = 1; + s->prevVariant = -1; + m4aSongNumStart(SE_261); + } + // _0804B02A + + if (boss->unk12 < 70) { + s32 rand = (PseudoRandom32()); + r4 = (boss->unk12 >> 1) + ((rand % 8u) + 8); + + if (boss->unk12 > 60) { + sub_804CCD0(boss, Q(r4 - 10)); + } + } else { + // _0804B074 + s32 rand = PseudoRandom32(); + r4 = ((116 - boss->unk12) >> 2) + ((rand % 8u) + 30); + } + // _0804B096 + + sub_802E784(boss->unk10, r4, 6, r8, r6 + 1, 32); + + boss->fade.brightness = Q(32) - (boss->unk12 * 91); + UpdateScreenFade(&boss->fade); + } + } + } + } +} + +END_NONMATCH + +u8 sub_804B0EC(SuperEggRoboZ *boss, u8 arm) +{ + u8 result = 0; + s32 sp04, ip; + s32 r3; + s32 r4; + s32 r5; + s32 r6; + s32 r7; + +#if !NON_MATCHING + register s32 sl asm("sl"); +#else + s32 sl; +#endif + + if (boss->unk3E[arm] > 0) { + return result; + } + + sp04 = boss->qPos.x + boss->qUnk18[arm].x; + sl = gUnknown_080D8888[arm][0]; + r5 = sp04 + sl; + + ip = boss->qPos.y + boss->qUnk18[arm].y; + r7 = gUnknown_080D8888[arm][1]; + r4 = ip + r7; + + r6 = COS(boss->rotation[arm]); + r5 += (r6 * 190) >> 9; + + r3 = SIN(boss->rotation[arm]); + r4 += (r3 * 190) >> 9; + + r5 = (gPlayer.x - r5) >> 8; + r4 = (gPlayer.y - r4) >> 8; + + r5 = SQUARE(r5); + r4 = SQUARE(r4); + + if ((r5 + r4) < 200) { + sub_800CBA4(&gPlayer); + + boss->unk40[arm] = 1; + + if (boss->unk3C[arm] == 3) { + m4aSongNumStart(SE_263); + } + + return result; + } else { + s32 r0, r1; + Sprite *s = &gPlayer.unk90->s; + + r5 = sp04 + sl; + r4 = ip + r7; + + r1 = ((r6 * 95) >> 9); + r0 = ((r3 * 95) >> 9); + r6 = r5 + r1; + r7 = r4 + r0; + + if (gSelectedCharacter != CHARACTER_SONIC) { + Player_UpdateHomingPosition(r6, r7); + } + + if (PLAYER_IS_ALIVE && HITBOX_IS_ACTIVE(s->hitboxes[1])) { + r5 = I(gPlayer.x - r6); + r4 = I(gPlayer.y - r7); + + r5 = SQUARE(r5); + r4 = SQUARE(r4); + if ((r5 + r4) < 376) { + s32 speed; + result = sub_804C9B4(boss, arm); + + speed = -gPlayer.speedAirX; + gPlayer.speedAirX = speed; + + speed = -gPlayer.speedAirY; + gPlayer.speedAirY = speed; + + speed = -gPlayer.speedGroundX; + gPlayer.speedGroundX = speed; + + return result; + } + } + + if ((gCheese != NULL) && HITBOX_IS_ACTIVE(gCheese->reserved)) { + r6 -= gCheese->posX; + r6 = (r6) >> 8; + r7 -= gCheese->posY; + r7 = (r7) >> 8; + + if ((SQUARE(r6) + SQUARE(r7)) < 376) { + result = sub_804C9B4(boss, arm); + + gUnknown_03005498.t->unk15 = 0; + } + } + } + + return result; +} + +// Copy-paste of sub_804B0EC() aside from code above: +// if (gSelectedCharacter != CHARACTER_SONIC) { +// ... +// } +// (93.51%) https://decomp.me/scratch/ecqNB +NONMATCH("asm/non_matching/game/bosses/boss_8__sub_804B2EC.inc", + bool8 sub_804B2EC(SuperEggRoboZ *boss, u8 arm)) +{ + u8 result = 0; + s32 sp04, ip; + s32 r3; + s32 r4; + s32 r5; + s32 r6; + s32 r7; + s32 sl; + + if (boss->unk3E[arm] > 0) { + return result; + } + // _0804B314 + + { + s32 r0, r1; + Sprite *s = &gPlayer.unk90->s; + + r6 = boss->qPos.x + boss->qUnk18[arm].x; + r4 = r6 + gUnknown_080D8888[arm][0]; + + r5 = boss->qPos.y + boss->qUnk18[arm].y; + r5 = r5 + gUnknown_080D8888[arm][1]; + + if (gSelectedCharacter != CHARACTER_SONIC) { + Player_UpdateHomingPosition(r4, r5); + } + + if (PLAYER_IS_ALIVE && HITBOX_IS_ACTIVE(s->hitboxes[1])) { + r5 = I(gPlayer.x - r6); + r4 = I(gPlayer.y - r7); + + r5 = SQUARE(r5); + r4 = SQUARE(r4); + if ((r5 + r4) < 376) { + s32 speed; + result = sub_804C9B4(boss, arm); + + speed = -gPlayer.speedAirX; + gPlayer.speedAirX = speed; + + speed = -gPlayer.speedAirY; + gPlayer.speedAirY = speed; + + speed = -gPlayer.speedGroundX; + gPlayer.speedGroundX = speed; + + return result; + } + } + + if ((gCheese != NULL) && HITBOX_IS_ACTIVE(gCheese->reserved)) { + r6 -= gCheese->posX; + r6 = (r6) >> 8; + r7 -= gCheese->posY; + r7 = (r7) >> 8; + + if ((SQUARE(r6) + SQUARE(r7)) < 376) { + result = sub_804C9B4(boss, arm); + + gUnknown_03005498.t->unk15 = 0; + } + } + } + + return result; +} +END_NONMATCH + +void sub_804B43C(SuperEggRoboZ *boss, u8 arm) +{ + boss->qUnk18[arm].x = 0; + boss->qUnk18[arm].y = 0; + + if (boss->unk30[arm] == 300) { + SWITCH_ARM_VARIANT(boss, arm, 0); + } + + if (--boss->unk30[arm] == 0) { + boss->unk3C[arm] = 1; + boss->unk30[arm] = 180; + boss->unk40[arm] = 0; + } + + if (sub_804B0EC(boss, arm) != 0) { + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 15) >> 6); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 15) >> 6); + + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3.0); + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + + SWITCH_ARM_VARIANT(boss, arm, 2); + } +} + +void sub_804B594(SuperEggRoboZ *boss, u8 arm) +{ + u16 angle; + Vec2_32 pos; + + boss->qUnk18[arm].x = 0; + boss->qUnk18[arm].y = 0; + + // TODO: Seems like these were set through a macro? + // boss->qUnk18[arm][n] were just set to 0 after all + pos.x = boss->qPos.x + boss->qUnk18[arm].x + gUnknown_080D8888[arm][0]; + pos.y = boss->qPos.y + boss->qUnk18[arm].y + gUnknown_080D8888[arm][1]; + + angle = sub_8004418(I(gPlayer.y - pos.y), I(gPlayer.x - pos.x)); + + if (angle != boss->rotation[arm]) { + if (angle < boss->rotation[arm]) { + boss->rotation[arm]--; + } else { + boss->rotation[arm]++; + } + } + + if (--boss->unk30[arm] == 0) { + SWITCH_ARM_VARIANT(boss, arm, 1); + boss->unk3C[arm] = 2; + boss->unk30[arm] = 30; + } + + if (sub_804B0EC(boss, arm) != 0) { + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 15) >> 6); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 15) >> 6); + + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3.0); + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + + SWITCH_ARM_VARIANT(boss, arm, 2); + } +} + +void sub_804B734(SuperEggRoboZ *boss, u8 arm) +{ + ExplosionPartsInfo info; + s32 speed0; + s32 x, y; + u8 i, j; + + boss->qUnk18[arm].x = 0; + boss->qUnk18[arm].y = 0; + + if (--boss->unk30[arm] == 0) { + x = boss->qPos.x + boss->qUnk18[arm].x + gUnknown_080D8888[arm][0]; + y = boss->qPos.y + boss->qUnk18[arm].y + gUnknown_080D8888[arm][1]; + + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + s32 index; + + index = (boss->rotation[arm] - (SIN_PERIOD / 4)); + info.spawnX = I(x) - ((COS(index & ONE_CYCLE) * (i - 1)) >> 11); + index = (boss->rotation[arm] - (SIN_PERIOD / 4)); + info.spawnY = I(y) - ((SIN(index & ONE_CYCLE) * (i - 1)) >> 11); + + info.velocity = 0; + info.rotation = (boss->rotation[arm] + (SIN_PERIOD / 2)) & ONE_CYCLE; + speed0 = (Q(2) + (j * Q(0.5))); + + if ((1 - i) >= 0) { + s32 speedI = ((1 - i) * 3); + info.speed = speed0 - (speedI * Q(0.125)); + } else { + s32 speedI = ((i - 1) * 3); + info.speed = speed0 - (speedI * Q(0.125)); + } + + info.vram = boss->tilesCloud; + info.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_CLOUD; + info.variant = 0; + info.unk4 = 0; + + CreateBossParticleStatic(&info, &boss->unkC); + } + } + + boss->unk3C[arm] = 3; + boss->unk30[arm] = 10; + m4aSongNumStart(SE_262); + } + + if (sub_804B0EC(boss, arm) != 0) { + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 15) >> 6); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 15) >> 6); + + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3.0); + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + + SWITCH_ARM_VARIANT(boss, arm, 2); + } +} + +void sub_804B984(SuperEggRoboZ *boss, u8 arm) +{ + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 5) >> 5); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 5) >> 5); + + if (--boss->unk30[arm] == 0) { + boss->unk3C[arm] = 6; + boss->unk30[arm] = 30; + } + + if (sub_804B0EC(boss, arm) != 0) { + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 15) >> 6); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 15) >> 6); + + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3.0); + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + + SWITCH_ARM_VARIANT(boss, arm, 2); + } +} + +void sub_804BAC0(SuperEggRoboZ *boss, u8 arm) +{ + if (--boss->unk30[arm] == 0) { + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 15) >> 6); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 15) >> 6); + + if (boss->unk40[arm] != 0) { + boss->rotation2[arm] = boss->rotation[arm]; + boss->unk3C[arm] = 4; + boss->unk30[arm] = 50; + } else { + boss->unk3C[arm] = 5; + boss->unk30[arm] = 160; + } + + SWITCH_ARM_VARIANT(boss, arm, 2); + } else { + if (sub_804B0EC(boss, arm) != 0) { + boss->qUnk18[arm].x += ((COS(boss->rotation[arm]) * 15) >> 6); + boss->qUnk18[arm].y += ((SIN(boss->rotation[arm]) * 15) >> 6); + + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3.0); + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + + SWITCH_ARM_VARIANT(boss, arm, 2); + } + } +} + +// (81.31%) https://decomp.me/scratch/432q4 +NONMATCH("asm/non_matching/game/bosses/boss_8__sub_804BC44.inc", + void sub_804BC44(SuperEggRoboZ *boss, u8 arm)) +{ + ExplosionPartsInfo info; + s32 speed0; + s32 x, y; + u8 i, j; +#ifndef NON_MATCHING + register u16 *r3 asm("r3"); +#else + u16 *r3; +#endif + + boss->qUnk18[arm].x -= ((COS(boss->rotation2[arm]) * 31) >> 10); + boss->qUnk18[arm].y -= ((SIN(boss->rotation2[arm]) * 31) >> 10); + + r3 = &boss->unk30[arm]; + boss->rotation[arm] = ((*r3 * 4 + boss->rotation[arm]) & ONE_CYCLE); + + if (--boss->rotation2[arm] == 0) { + // _0804BCD6 + x = boss->qPos.x + boss->qUnk18[arm].x + gUnknown_080D8888[arm][0]; + y = boss->qPos.y + boss->qUnk18[arm].y + gUnknown_080D8888[arm][1]; + + x -= ((COS(boss->rotation2[arm]) * 15) >> 6); + y -= ((SIN(boss->rotation2[arm]) * 15) >> 6); + + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + s32 index; + + index = (boss->rotation[arm] - (SIN_PERIOD / 4)); + info.spawnX = I(x) - ((COS(index & ONE_CYCLE) * (i - 1)) >> 11); + index = (boss->rotation[arm] - (SIN_PERIOD / 4)); + info.spawnY = I(y) - ((SIN(index & ONE_CYCLE) * (i - 1)) >> 11); + + info.velocity = 0; + info.rotation + = (boss->rotation[arm] + 576 - boss->rotation2[arm]) & ONE_CYCLE; + speed0 = (Q(2) + (j * Q(0.5))); + + if ((1 - i) >= 0) { + s32 speedI = ((1 - i) * 3); + info.speed = speed0 - (speedI * Q(0.125)); + } else { + s32 speedI = ((i - 1) * 3); + info.speed = speed0 - (speedI * Q(0.125)); + } + + info.vram = boss->tilesCloud; + info.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_CLOUD; + info.variant = 0; + info.unk4 = 0; + + CreateBossParticleStatic(&info, &boss->unkC); + } + } + + boss->rotation2[arm] = boss->rotation[arm]; + boss->unk3C[arm] = 0; + boss->unk30[arm] = 300; + } +} +END_NONMATCH + +void sub_804BE6C(SuperEggRoboZ *boss, u8 arm) +{ + ExplosionPartsInfo info; + s32 qX, qY; + u8 i, j; + + boss->qUnk18[arm].x -= ((COS(boss->rotation[arm]) * 5) >> 9); + boss->qUnk18[arm].y -= ((SIN(boss->rotation[arm]) * 5) >> 9); + + if (--boss->unk30[arm] == 0) { + qX = boss->qPos.x + boss->qUnk18[arm].x + gUnknown_080D8888[arm][0]; + qY = boss->qPos.y + boss->qUnk18[arm].y + gUnknown_080D8888[arm][1]; + + qX -= ((COS(boss->rotation[arm]) * 15) >> 6); + qY -= ((SIN(boss->rotation[arm]) * 15) >> 6); + + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + s32 index; + index = COS((boss->rotation[arm] - (SIN_PERIOD / 4)) & ONE_CYCLE); + info.spawnX = I(qX) - ((index * (i - 1)) >> 11); + index = SIN((boss->rotation[arm] - (SIN_PERIOD / 4)) & ONE_CYCLE); + info.spawnY = I(qY) - ((index * (i - 1)) >> 11); + + info.velocity = Q(18. / 256.); + info.rotation = (boss->rotation[arm] + (SIN_PERIOD / 2)) & ONE_CYCLE; + + { + s32 speed; + speed = ((j * Q(0.375)) + Q(0.5)); + info.speed = ((1 - i) >= 0) ? speed - ((1 - i) * Q(0.125)) + : speed - ((i - 1) * Q(0.125)); + } + + info.vram = boss->tilesCloud; + info.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_CLOUD; + info.variant = 0; + info.unk4 = 0; + + CreateBossParticleStatic(&info, &boss->unkC); + } + } + + boss->unk3C[arm] = 0; + boss->unk30[arm] = 300; + } else if (sub_804B2EC(boss, arm)) { + boss->qUnk34[arm][0] = -Q(1.5); + boss->qUnk34[arm][1] = -Q(3.0); + boss->unk3C[arm] = 7; + boss->unk30[arm] = 60; + } +} + +void sub_804C080(SuperEggRoboZ *boss) +{ + ExplosionPartsInfo info; + + if ((gStageTime & 0x7) == 0) { + s32 rand = PseudoRandom32(); + info.spawnX = gCamera.x + (rand & 0xFF); + info.spawnY = gCamera.y + (PseudoRandom32() & 0xFF); + info.velocity = Q(18. / 256.); + info.rotation = (PseudoRandBetween(0, SIN_PERIOD - 1)); + // '= rand =' needed for matching + info.speed = rand = (PseudoRandBetween(Q(2), Q(4) - 1)); + info.vram = (OBJ_VRAM0 + 0x2980); + info.anim = SA2_ANIM_EXPLOSION; + info.variant = 0; + info.unk4 = 0; + + CreateBossParticleStatic(&info, &boss->unkC); + m4aSongNumStart(SE_144); + m4aMPlayImmInit(&gMPlayInfo_SE3); + } + + m4aMPlayVolumeControl(&gMPlayInfo_SE3, 0xFFFF, boss->unk14); + + if ((boss->unk14 > 0) && (gStageTime & 0x1)) { + --boss->unk14; + } + + if (((gStageTime + 3) & 0x7) == 0) { + s32 rand; + u8 r4 = PseudoRandom32(); + r4 &= 0xF; + r4 -= Div(r4, 6) * 6; + + rand = PseudoRandom32(); + info.spawnX = gCamera.x + (rand & 0xFF); + info.spawnY = gCamera.y + (PseudoRandom32() & 0xFF); + info.velocity = Q(0.125); + info.rotation = (PseudoRandom32() & ONE_CYCLE); + info.speed = Q(2); + + info.vram = (OBJ_VRAM0 + (gTileInfoBossScrews[r4][0] * TILE_SIZE_4BPP)); + info.anim = gTileInfoBossScrews[r4][1]; + info.variant = gTileInfoBossScrews[r4][2]; + info.unk4 = 0; + CreateBossParticleStatic(&info, &boss->unkC); + } +} + +// (87.37%) https://decomp.me/scratch/98Mjg +NONMATCH("asm/non_matching/game/bosses/boss_8__sub_804C240.inc", + void sub_804C240(SuperEggRoboZ *boss, u8 arm)) +{ + ExplosionPartsInfo info; + s32 x, y; + s32 index; + + if (boss->unk42[arm] != 0) { + return; + } + + y = I(boss->qPos.y + boss->qUnk18[arm].y + gUnknown_080D8888[arm][1]); + + if (y > 300) { + boss->unk42[arm] = 1; + return; + } + + boss->rotation[arm] = (boss->rotation[arm] + 800); + boss->rotation[arm] &= ONE_CYCLE; + boss->qUnk34[arm][1] += Q(0.125); + boss->qUnk18[arm].x += boss->qUnk34[arm][0]; + boss->qUnk18[arm].y += boss->qUnk34[arm][1]; + + if ((gStageTime & 0x3) == 0) { + s32 rand; + x = boss->qPos.x; + x += gUnknown_080D8888[arm][0]; + x += boss->qUnk18[arm].x; + y = boss->qPos.y; + y += boss->qUnk18[arm].y; + y += gUnknown_080D8888[arm][1]; + info.spawnX = I(x); + info.spawnY = I(y); + info.velocity = 0; + info.rotation + = sub_8004418(-(boss->qUnk34[arm][1] >> 3), -(boss->qUnk34[arm][0] >> 3)); + + rand = PseudoRandom32(); + index = (info.rotation + (rand & 0x1F)); + info.rotation = (index - 0x10) & ONE_CYCLE; + info.speed = SIN_24_8((gStageTime * 16) & ONE_CYCLE) + Q(3); + info.vram = (OBJ_VRAM0 + 0x12980); + info.anim = SA2_ANIM_EXPLOSION; + info.variant = 0; + info.unk4 = 0; + CreateBossParticleStatic(&info, &boss->unkC); + } +} +END_NONMATCH + +void sub_804C3AC(SuperEggRoboZ *boss) +{ + Sprite *s; + SpriteTransform *tf; + u8 i; + + Vec2_32 sp00; + Vec2_32 sp08; + + sp08.x = Q(PseudoRandBetween(-3, 4)); + sp08.y = Q(PseudoRandBetween(-3, 4)); + + gBgScrollRegs[0][0] = gCamera.x - I(boss->qPos.x + sp08.x); + gBgScrollRegs[0][1] = gCamera.y - I(boss->qPos.y + sp08.y); + + sp00.x = I(boss->qPos.x + Q(190)) - gCamera.x; + + if ((sp00.x + 50) > 330u) { + gDispCnt &= ~DISPCNT_BG0_ON; + } else { + gDispCnt |= DISPCNT_BG0_ON; + } + + s = &boss->bsHead.s; + tf = &boss->bsHead.transform; + + sp00.x = boss->qPos.x + sp08.x + Q(190); + sp00.y = boss->qPos.y + sp08.y + Q(40); + + s->x = I(sp00.x) - gCamera.x; + s->y = I(sp00.y) - gCamera.y; + + s->unk10 = (gUnknown_030054B8++ + | (SPRITE_FLAG(PRIORITY, 3) | SPRITE_FLAG_MASK_ROT_SCALE_ENABLE + | SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE)); + + tf->rotation = boss->unk10; + tf->width = Q(1); + tf->height = Q(1); + tf->x = s->x; + tf->y = s->y; + + UpdateSpriteAnimation(s); + sub_8004860(s, tf); + DisplaySprite(s); + + for (i = 0; i < BOSS_8_ARM_COUNT; i++) { + s = &boss->bsArms[i].s; + tf = &boss->bsArms[i].transform; + + sp00.x = boss->qPos.x + sp08.x + boss->qUnk18[i].x + gUnknown_080D8888[i][0]; + sp00.y = boss->qPos.y + sp08.y + boss->qUnk18[i].y + gUnknown_080D8888[i][1]; + + s->x = I(sp00.x) - gCamera.x; + s->y = I(sp00.y) - gCamera.y; + + s->unk10 = (gUnknown_030054B8++ + | (SPRITE_FLAG(PRIORITY, 1) | SPRITE_FLAG_MASK_ROT_SCALE_ENABLE + | SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE)); + + tf->rotation = boss->rotation[i]; + tf->width = Q(1); + tf->height = Q(1); + tf->x = s->x; + tf->y = s->y; + + UpdateSpriteAnimation(s); + sub_8004860(s, tf); + DisplaySprite(s); + } +} + +void sub_804C5B8(SuperEggRoboZ *boss) +{ + Sprite *s; + SpriteTransform *tf; + u8 r3; + u8 i; + + Vec2_32 sp00; + Vec2_32 sp08; + + if (boss->unkB > 0) { + if (boss->unkB < 32) { + sp08.x = Q(PseudoRandBetween(-3, 4)); + sp08.y = Q(PseudoRandBetween(-3, 4)); + } else { + sp08.x = Q(PseudoRandBetween(-7, 8)); + sp08.y = Q(PseudoRandBetween(-7, 8)); + } + } else { + sp08.x = 0; + sp08.y = 0; + } + + gBgScrollRegs[0][0] = gCamera.x - I(boss->qPos.x + sp08.x); + gBgScrollRegs[0][1] = gCamera.y - I(boss->qPos.y + sp08.y); + + sp00.x = I(boss->qPos.x + Q(190)) - gCamera.x; + + if ((sp00.x + 50) > 330u) { + gDispCnt &= ~DISPCNT_BG0_ON; + } else { + gDispCnt |= DISPCNT_BG0_ON; + } + + s = &boss->bsHead.s; + tf = &boss->bsHead.transform; + + if (boss->unkB < 32) { + r3 = boss->unkB >> 3; + } else { + r3 = (64 - boss->unkB) >> 3; + } + + sp00.x = boss->qPos.x + sp08.x + Q(190); + sp00.y = boss->qPos.y + sp08.y + Q(40); + + s->x = I(sp00.x) - gCamera.x; + s->y = I(sp00.y) - gCamera.y + r3; + + s->unk10 = (gUnknown_030054B8++ + | (SPRITE_FLAG(PRIORITY, 3) | SPRITE_FLAG_MASK_ROT_SCALE_ENABLE + | SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE)); + + tf->rotation = boss->unk10; + tf->width = Q(1); + tf->height = Q(1); + tf->x = s->x; + tf->y = s->y; + + UpdateSpriteAnimation(s); + sub_8004860(s, tf); + DisplaySprite(s); + + for (i = 0; i < BOSS_8_ARM_COUNT; i++) { + if (boss->unk42[i] != 0) { + continue; + } + + s = &boss->bsArms[i].s; + tf = &boss->bsArms[i].transform; + + sp00.x = boss->qPos.x + sp08.x + boss->qUnk18[i].x + gUnknown_080D8888[i][0]; + sp00.y = boss->qPos.y + sp08.y + boss->qUnk18[i].y + gUnknown_080D8888[i][1]; + + s->x = I(sp00.x) - gCamera.x; + s->y = I(sp00.y) - gCamera.y; + + s->unk10 = (gUnknown_030054B8++ + | (SPRITE_FLAG(PRIORITY, 1) | SPRITE_FLAG_MASK_ROT_SCALE_ENABLE + | SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE)); + + tf->rotation = boss->rotation[i]; + tf->width = Q(1); + tf->height = Q(1); + tf->x = s->x; + tf->y = s->y; + + UpdateSpriteAnimation(s); + sub_8004860(s, tf); + DisplaySprite(s); + } +} + +void sub_804C830(SuperEggRoboZ *boss) +{ + Sprite *s; + Player *p; + Vec2_32 headPos; +#ifdef BUG_FIX + // Define headPos before the if, so that + // Player_UpdateHomingPosition doesn't receive garbage values. + headPos.x = I(boss->qPos.x + Q(190)); + headPos.y = I(boss->qPos.y + Q(40)); + if (boss->unkB == 0) { +#else + if (boss->unkB == 0) { + headPos.x = I(boss->qPos.x + Q(190)); + headPos.y = I(boss->qPos.y + Q(40)); +#endif + + s = &boss->bsHead.s; + p = &gPlayer; + if (IsColliding_Cheese(s, headPos.x, headPos.y, 0, p) == TRUE) { + Boss8_HitCockpit(boss); + return; + } else if (sub_800C320(s, headPos.x, headPos.y, 0, p) == TRUE) { + Boss8_HitCockpit(boss); + + { + s32 speed = p->speedAirX; + if (speed > 0) { + p->speedAirX = -ABS(speed); + } + } + } else if (sub_800CA20(s, headPos.x, headPos.y, 0, p) == TRUE) { + s32 speed = p->speedAirX; + if (speed > 0) { + p->speedAirX = -speed; + } + } + } + + if (gSelectedCharacter != CHARACTER_SONIC) { + Player_UpdateHomingPosition(Q(headPos.x), Q(headPos.y)); + } +} + +void Boss8_HitCockpit(SuperEggRoboZ *boss) +{ + Sprite *s = &boss->bsHead.s; + + if ((--boss->livesCockpit & 0xFF) & 0x1) { + m4aSongNumStart(SE_143); + } else { + m4aSongNumStart(SE_235); + } + + if (boss->livesCockpit == 3) { + gUnknown_030054A8.unk1 = 19; + } + + if (boss->livesCockpit == 0) { + INCREMENT_SCORE_C(1000); + } + + boss->unkB = 64; + + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD; + s->variant = 2; + s->prevVariant = -1; +} + +bool8 sub_804C9B4(SuperEggRoboZ *boss, u8 arm) +{ + if (boss->livesArms[arm] > 0) { + if ((--boss->livesArms[arm] & 0xFF) & 0x1) { + m4aSongNumStart(SE_143); + } else { + m4aSongNumStart(SE_235); + } + + boss->unk3E[arm] = 64; + } + + return (boss->livesArms[arm] == 0) ? 1 : 0; +} + +void sub_804CA08(SuperEggRoboZ *boss) +{ + if ((boss->unkB != 0) && (--boss->unkB == 0)) { + Sprite *s = &boss->bsHead.s; + if (boss->livesCockpit > 0) { + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD; + s->variant = 0; + } else { + s->graphics.anim = SA2_ANIM_SUPER_EGG_ROBO_Z_HEAD; + s->variant = 3; + } + s->prevVariant = -1; + } + + if (boss->unk3E[0] > 0) { + boss->unk3E[0]--; + } + + if (boss->unk3E[1] > 0) { + boss->unk3E[1]--; + } +} + +void sub_804CA70(SuperEggRoboZ *boss) +{ + s32 pal = (gStageTime & 0x2) >> 1; + u8 i; + + if (boss->unkB != 0) { + for (i = 0; i < ARRAY_COUNT(sArmPalettes[0]); i++) { + gObjPalette[8 * 16 + i] = sArmPalettes[pal][i]; + } + } else { + for (i = 0; i < ARRAY_COUNT(sArmPalettes[0]); i++) { + gObjPalette[8 * 16 + i] = sArmPalettes[0][i]; + } + } + + if (boss->unk3E[0] > 0) { + for (i = 0; i < ARRAY_COUNT(sArmPalettes[0]); i++) { + gObjPalette[9 * 16 + i] = sArmPalettes[pal][i]; + } + } else { + for (i = 0; i < ARRAY_COUNT(sArmPalettes[0]); i++) { + gObjPalette[9 * 16 + i] = sArmPalettes[0][i]; + } + } + + if (boss->unk3E[1] > 0) { + for (i = 0; i < ARRAY_COUNT(sArmPalettes[0]); i++) { + gObjPalette[12 * 16 + i] = sArmPalettes[pal][i]; + } + } else { + for (i = 0; i < ARRAY_COUNT(sArmPalettes[0]); i++) { + gObjPalette[12 * 16 + i] = sArmPalettes[0][i]; + } + } + + gFlags |= FLAGS_UPDATE_SPRITE_PALETTES; +} + +void Task_SuperEggRoboZMain(void) +{ + SuperEggRoboZ *boss = TASK_DATA(gCurTask); + sub_804C5B8(boss); + + gPlayer.moveState |= MOVESTATE_IGNORE_INPUT; + + if ((gPlayer.speedGroundX == 0) && (--boss->unk14 == 0)) { + boss->unk14 = 300; + gCurTask->main = Task_804A9D8; + m4aSongNumStart(SE_260); + gPlayer.unk64 = 0; + gPlayer.transition = PLTRANS_PT1; + } +} + +void Task_ShowResultsAndDelete(void) +{ + SuperEggRoboZ *boss = TASK_DATA(gCurTask); + boss->fade.brightness = Q(32); + UpdateScreenFade(&boss->fade); + + CreateStageResults(gCourseTime, gRingCount, gSpecialRingCount); + m4aSongNumStop(SE_144); + m4aMPlayVolumeControl(&gMPlayInfo_SE3, 0xFFFF, 0xFF); + TaskDestroy(gCurTask); +} + +void sub_804CC98(SuperEggRoboZ *boss) +{ + u32 unkB = boss->unkB; + + if (unkB != 0) { + s32 sin = SIN(unkB * 8); + s32 val = (sin >> 7); + boss->unk10 = (val + (SIN_PERIOD / 2)) & ONE_CYCLE; + } else { + boss->unk10 = (SIN_PERIOD / 2); + } +} + +void sub_804CCD0(SuperEggRoboZ *boss, s32 qP1) +{ + Vec2_32 pos = { boss->qPos.x + Q(190), boss->qPos.y + Q(40) }; + + if ((I(gPlayer.y) < pos.x) && (gPlayer.y >= (pos.y - qP1)) + && (gPlayer.y <= (qP1 + pos.y))) { + sub_800CBA4(&gPlayer); + } +} + +void TaskDestructor_SuperEggRoboZMain(struct Task *t) +{ + SuperEggRoboZ *boss = TASK_DATA(t); + VramFree(boss->tilesCloud); + + VramFree(boss->bsArms[0].s.graphics.dest); + VramFree(boss->bsArms[1].s.graphics.dest); + VramFree(boss->bsHead.s.graphics.dest); + + gActiveBossTask = NULL; +} diff --git a/src/game/bosses/boss_9.c b/src/game/bosses/boss_9.c index 5c357e1fe..0fb42cf06 100644 --- a/src/game/bosses/boss_9.c +++ b/src/game/bosses/boss_9.c @@ -1,9 +1,11 @@ #include "global.h" -#include "gba/io_reg.h" +#include "flags.h" #include "sprite.h" #include "task.h" +#include "gba/io_reg.h" #include "game/bosses/common.h" #include "game/bosses/boss_9.h" +#include "sakit/globals.h" typedef struct { u8 filler0[0x4]; @@ -51,14 +53,34 @@ typedef struct { TA53_unkA8 unkA8[3]; } TA53_unk98; /* size: 0x190 */ +typedef struct TA53_unk558 { + /* 0x00 */ void (*func)(struct TA53_unk558 *); // void func (TA53_unk558 *) + /* 0x04 */ u8 unk4[0x4]; + /* 0x08 */ s32 unk8; + /* 0x0C */ Sprite s; +} TA53_unk558; /* size: ??? */ + typedef struct { - /* 0x000 */ u8 filler0[0x12]; + /* 0x000 */ u16 unk0; + /* 0x002 */ u16 unk2; + /* 0x004 */ u16 unk4; + /* 0x006 */ u16 unk6; + /* 0x008 */ u16 unk8; + /* 0x00A */ u16 unkA; + /* 0x00C */ u8 unkC; + /* 0x00D */ u8 unkD; + /* 0x00E */ u8 unkE; + /* 0x00F */ u8 unkF; + /* 0x010 */ u16 unk10; /* 0x012 */ u16 unk12; - /* 0x014 */ u8 filler14[0x8]; + /* 0x014 */ s32 unk14; + /* 0x018 */ s32 unk18; /* 0x01C */ TA53_unk1C unk1C; /* 0x048 */ TA53_unk48 unk48; /* 0x098 */ TA53_unk98 unk98; - /* 0x548 */ u8 filler548[0x26C]; + /* 0x548 */ u8 filler548[0x10]; + /* 0x558 */ TA53_unk558 unk558; + /* 0x548 */ u8 filler594[0x220]; /* 0x7B4 */ Sprite spr7B4; /* 0x7E4 */ u8 filler7E4[0x15C]; } TA53Boss; /* size: 0x940 */ @@ -76,6 +98,9 @@ extern TA53_Data0 gUnknown_080D8DCC[8]; extern void CreateTrueArea53Boss(void); extern void Task_EggmanKidnapsVanilla(void); extern void TaskDestructor_TrueArea53BossGfx(struct Task *); +void Task_TrueArea53BossMain(void); +void sub_8050DC8(struct TA53_unk558 *); +void TaskDestructor_TrueArea53BossGfx(struct Task *); // Used when Vanilla gets captured void SetupEggmanKidnapsVanillaTask(void) @@ -127,4 +152,40 @@ void SetupEggmanKidnapsVanillaTask(void) gDispCnt = (DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_1); -} \ No newline at end of file +} + +#if 0 +void CreateTrueArea53Boss(void) +{ + TA53Boss *boss; + TA53_unk558 *unk558; + + gStageFlags |= EXTRA_STATE__DISABLE_PAUSE_MENU; + + if(gActiveBossTask == NULL) { + gActiveBossTask = TaskCreate(Task_TrueArea53BossMain, sizeof(TA53Boss), 0x400, 0, TaskDestructor_TrueArea53BossGfx); + } + + boss = TASK_DATA(gActiveBossTask); + + boss->unkC = 12; + boss->unkD = 0; + boss->unk10 = 1; + boss->unk12 = 80; + boss->unkE = 0; + boss->unkF = 0; + boss->unk14 = 0; + boss->unk18 = 0; + boss->unk0 = 0; + boss->unk4 = 0; + boss->unk2 = 1; + boss->unk6 = 20; + boss->unk8 = 0xBF; + boss->unkA = 1; + + unk558 = &boss->unk558; + unk558->func = sub_8050DC8; + + +} +#endif \ No newline at end of file diff --git a/src/game/cheese.c b/src/game/cheese.c index fc617710e..98b75c188 100644 --- a/src/game/cheese.c +++ b/src/game/cheese.c @@ -121,7 +121,7 @@ void CreateCheese(Player *player) mpp = TASK_DATA(gMultiplayerPlayerTasks[j]); t = TaskCreate(sub_801420C, 0x70, 0x5010, 0, sub_8015360); cheese = TASK_DATA(t); - cheese->unk6C = mpp; + cheese->mpp = mpp; break; } } @@ -1017,37 +1017,37 @@ bool8 sub_8015118(Cheese *cheese) s32 temp, temp2; s16 x, y; - if (ABS(cheese->unk6C->unk50 - I(unk54->unk54)) > 0x1E) { + if (ABS(cheese->mpp->pos.x - I(unk54->unk54)) > 0x1E) { r7 = 1; } - if (ABS(cheese->unk6C->unk52 - I(unk54->unk58)) > 0x1E) { + if (ABS(cheese->mpp->pos.y - I(unk54->unk58)) > 0x1E) { r7 = 1; } - unk54->unk54 = QS(cheese->unk6C->unk50); - unk54->unk58 = QS(cheese->unk6C->unk52); + unk54->unk54 = QS(cheese->mpp->pos.x); + unk54->unk58 = QS(cheese->mpp->pos.y); - x = cheese->unk6C->unk50 - gCamera.x; + x = cheese->mpp->pos.x - gCamera.x; if ((u16)(x + 32) > 304) { return TRUE; } - y = cheese->unk6C->unk52 - gCamera.y; + y = cheese->mpp->pos.y - gCamera.y; if ((u16)(y + 32) > 224) { return TRUE; } unk54->unk5C = 1; unk54->unk5E = 1; - unk54->unk68 = &cheese->unk6C->s; + unk54->unk68 = &cheese->mpp->s; unk54->unk60 = 0; - if (!(cheese->unk6C->unk54 & 2)) { + if (!(cheese->mpp->unk54 & 2)) { unk54->unk60 = 1; } - if (cheese->unk6C->unk54 & 0x40) { + if (cheese->mpp->unk54 & 0x40) { unk54->unk60 |= 0x100000; } @@ -1057,9 +1057,9 @@ bool8 sub_8015118(Cheese *cheese) } if (!thing) { - unk54->unk64 = cheese->unk6C->transform.rotation >> 2; + unk54->unk64 = cheese->mpp->transform.rotation >> 2; - if (cheese->unk6C->unk54 & 8) { + if (cheese->mpp->unk54 & 8) { if (unk54->unk64) { unk54->unk64 = ~(unk54->unk64 + 0x80U); } diff --git a/src/game/game.c b/src/game/game.c index 43cb7bb21..f0fea83dd 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -33,7 +33,7 @@ void GameStart(void) // TODO: Fix cast gTilemapsRef = (struct MapHeader **)gTilemaps; - gUnknown_03002794 = &gSpriteTables; + gRefSpriteTables = &gSpriteTables; gUnknown_03004D54 = gBgOffsetsBuffer[0]; gUnknown_030022C0 = gBgOffsetsBuffer[1]; diff --git a/src/game/interactables_1/booster.c b/src/game/interactables_1/booster.c index f266359b2..e50b24fab 100644 --- a/src/game/interactables_1/booster.c +++ b/src/game/interactables_1/booster.c @@ -117,7 +117,7 @@ void Task_Interactable_Booster(void) if (!(gPlayer.moveState & (MOVESTATE_DEAD | MOVESTATE_IN_AIR)) && (sub_800C204(s, screenX, screenY, 0, &gPlayer, 0) == 1)) { - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); if (gPlayer.moveState & MOVESTATE_4) { sub_8023B5C(&gPlayer, 9); diff --git a/src/game/interactables_1/checkpoint.c b/src/game/interactables_1/checkpoint.c index e6b7c3ebe..675b74de0 100644 --- a/src/game/interactables_1/checkpoint.c +++ b/src/game/interactables_1/checkpoint.c @@ -41,7 +41,6 @@ static void TaskDestructor_8063214(struct Task *); static void Task_8063228(struct Task *); extern u32 gCheckpointTime; -extern const struct SpriteTables *gUnknown_03002794; #define CHECKPOINT_BALL_TILE_COUNT 4 @@ -214,7 +213,7 @@ void Task_8063228(struct Task *unused) offset = numColors >> 16; numColors %= 256; - DmaCopy32(3, &gUnknown_03002794->palettes[palId * 16], &gBgPalette[offset], + DmaCopy32(3, &gRefSpriteTables->palettes[palId * 16], &gBgPalette[offset], numColors * sizeof(u16)); gFlags |= FLAGS_UPDATE_BACKGROUND_PALETTES; diff --git a/src/game/interactables_1/incline_ramp.c b/src/game/interactables_1/incline_ramp.c index 5f4601df7..b138d4427 100644 --- a/src/game/interactables_1/incline_ramp.c +++ b/src/game/interactables_1/incline_ramp.c @@ -50,7 +50,7 @@ static void Task_InclineRamp(void) gPlayer.speedAirX += Q_8_8(17); sub_8023260(&gPlayer); - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; gPlayer.unk17 = 14; @@ -76,7 +76,7 @@ static void Task_InclineRamp(void) gPlayer.speedAirX += Q_8_8(-17); sub_8023260(&gPlayer); - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; gPlayer.unk17 = 14; diff --git a/src/game/interactables_1/platform_crumbling.c b/src/game/interactables_1/platform_crumbling.c index 9a6ddfeba..775eec1a1 100644 --- a/src/game/interactables_1/platform_crumbling.c +++ b/src/game/interactables_1/platform_crumbling.c @@ -27,7 +27,7 @@ static const u16 sInt019_AnimationIds[] = { [LEVEL_INDEX(ZONE_1, ACT_1)] = SA2_ANIM_PLATFORM_LF_WIDE, [LEVEL_INDEX(ZONE_1, ACT_2)] = SA2_ANIM_PLATFORM_LF_WIDE }; -extern const struct SpriteTables *gUnknown_03002794; +extern const struct SpriteTables *gRefSpriteTables; extern u32 sub_800C060(Sprite *, s32, s32, Player *); @@ -65,7 +65,7 @@ void CreateEntity_PlatformCrumbling(MapEntity *me, u16 spriteRegionX, u16 sprite s->y = TO_WORLD_POS(me->y, spriteRegionY); s->graphics.dest = VramMalloc(IA_019_NUM_TILES); -#ifdef UB_FIX +#ifdef BUG_FIX // Prevent overflow s->graphics.anim = sInt019_AnimationIds[gCurrentLevel % ARRAY_COUNT(sInt019_AnimationIds)]; @@ -194,11 +194,10 @@ void Task_805E480(void) return; } } - // _0805E52C - oam_ptr = gUnknown_03002794->oamData[s->graphics.anim]; + + oam_ptr = gRefSpriteTables->oamData[s->graphics.anim]; oam = &oam_ptr[s->dimensions->oamIndex * 3]; - // _0805E54C r6 = 0; for (y = 0; y < 4; y++) { for (x = 0; x < 8; r6++, x++) { @@ -216,7 +215,7 @@ void Task_805E480(void) gCurTask->main = Task_805E6A4; } - // _0805E590 + r4 = (((((s16)value * 42) * (s16)value) << 8) >> 16); if (r4 > otherPos) { @@ -225,10 +224,9 @@ void Task_805E480(void) return; } } else { - // _0805E5CC r4 = 0; } - // _0805E5CE + pointer = OamMalloc(GET_SPRITE_OAM_ORDER(s)); if (iwram_end == pointer) return; @@ -238,12 +236,11 @@ void Task_805E480(void) if (s->unk10 & 0x400) { pointer->all.attr1 = ((s->x - x * TILE_WIDTH - 8) & 0x1FF) | 0x1000; } else { - // _0805E62C pointer->all.attr1 = (s->x + x * TILE_WIDTH) & 0x1FF; } pointer->all.attr2 - = (((oam[2] + s->palId) & ~0xFFF) | ((s->unk10 & 0x3000) >> 2) + = (((oam[2] + s->palId) & ~0xFFF) | (SPRITE_FLAG_GET(s, PRIORITY) << 10) | (u16)(GET_TILE_NUM(s->graphics.dest) + r6)); } } @@ -280,7 +277,7 @@ void Task_805E6A4(void) } } - oam_ptr = gUnknown_03002794->oamData[s->graphics.anim]; + oam_ptr = gRefSpriteTables->oamData[s->graphics.anim]; oam = &oam_ptr[s->dimensions->oamIndex * 3]; r6 = 0; @@ -301,7 +298,7 @@ void Task_805E6A4(void) return; } - pointer = OamMalloc((s->unk1A & 0x7C0) >> 6); + pointer = OamMalloc(GET_SPRITE_OAM_ORDER(s)); if (iwram_end == pointer) { return; } diff --git a/src/game/interactables_1/rotating_handle.c b/src/game/interactables_1/rotating_handle.c index df1f22fa2..f29ac1370 100644 --- a/src/game/interactables_1/rotating_handle.c +++ b/src/game/interactables_1/rotating_handle.c @@ -87,7 +87,7 @@ static void sub_805EA94(void) #else s32 temp1, temp2; #endif - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); rotatingHandle->unk3C = 0; temp1 = abs(gPlayer.speedAirX); @@ -183,7 +183,7 @@ NONMATCH("asm/non_matching/game/interactables_1/sub_805ECA0.inc", #endif gPlayer.transition = PLTRANS_PT5; me->x = rotatingHandle->base.spriteX; - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 9); gPlayer.unk16 = 6; gPlayer.unk17 = 9; diff --git a/src/game/interactables_1/spring_bouncy.c b/src/game/interactables_1/spring_bouncy.c index fab8b0cce..e40544b66 100644 --- a/src/game/interactables_1/spring_bouncy.c +++ b/src/game/interactables_1/spring_bouncy.c @@ -120,7 +120,7 @@ static void Task_Interactable_BouncySpring() gPlayer.unk36 = 3; - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; diff --git a/src/game/interactables_2/egg_utopia/flying_handle.c b/src/game/interactables_2/egg_utopia/flying_handle.c index 7c8718674..d09e7d6a2 100644 --- a/src/game/interactables_2/egg_utopia/flying_handle.c +++ b/src/game/interactables_2/egg_utopia/flying_handle.c @@ -96,7 +96,7 @@ void CreateEntity_FlyingHandle(MapEntity *me, u16 spriteRegionX, u16 spriteRegio s->animCursor = 0; s->timeUntilNextFrame = 0; s->prevVariant = -1; - s->animSpeed = 0x10; + s->animSpeed = SPRITE_ANIM_SPEED(1.0); s->palId = 0; s->hitboxes[0].index = -1; s->unk10 = SPRITE_FLAG(PRIORITY, 2); @@ -163,7 +163,7 @@ static void ActivatePlayerGrab(Sprite_FlyingHandle *flyingHandle) static void sub_807F484(Sprite_FlyingHandle *flyingHandle) { gPlayer.moveState &= ~MOVESTATE_400000; - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; diff --git a/src/game/interactables_2/egg_utopia/launcher.c b/src/game/interactables_2/egg_utopia/launcher.c index 140e6c40f..63cf0787f 100644 --- a/src/game/interactables_2/egg_utopia/launcher.c +++ b/src/game/interactables_2/egg_utopia/launcher.c @@ -225,7 +225,7 @@ static void sub_807DC80(Sprite_EggUtopia_Launcher *launcher) gPlayer.speedAirX = 0; gPlayer.speedAirY = 0; - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; diff --git a/src/game/interactables_2/hot_crater/crane.c b/src/game/interactables_2/hot_crater/crane.c index d69740d26..5d84f526b 100644 --- a/src/game/interactables_2/hot_crater/crane.c +++ b/src/game/interactables_2/hot_crater/crane.c @@ -492,7 +492,7 @@ static void sub_8074088(Sprite_HCCrane *crane) { s16 v; - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 9); gPlayer.unk16 = 6; diff --git a/src/game/interactables_2/hot_crater/hook_rail.c b/src/game/interactables_2/hot_crater/hook_rail.c index 09504c898..925961f83 100644 --- a/src/game/interactables_2/hot_crater/hook_rail.c +++ b/src/game/interactables_2/hot_crater/hook_rail.c @@ -187,7 +187,7 @@ static void sub_8072DCC(Sprite_HookRail *hookRail) { gPlayer.moveState |= MOVESTATE_400000; gPlayer.unk64 = 55; - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; gPlayer.unk17 = 14; diff --git a/src/game/interactables_2/hot_crater/windup_stick.c b/src/game/interactables_2/hot_crater/windup_stick.c index 5792d6453..500b87cc2 100644 --- a/src/game/interactables_2/hot_crater/windup_stick.c +++ b/src/game/interactables_2/hot_crater/windup_stick.c @@ -83,7 +83,7 @@ static void sub_8072650(void) static void sub_80726E8(Sprite_WindUpStick *windUpStick) { - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 0xE); gPlayer.unk16 = 6; gPlayer.unk17 = 14; diff --git a/src/game/interactables_2/music_plant/german_flute.c b/src/game/interactables_2/music_plant/german_flute.c index bc5da8255..26843f7f6 100644 --- a/src/game/interactables_2/music_plant/german_flute.c +++ b/src/game/interactables_2/music_plant/german_flute.c @@ -191,7 +191,7 @@ static void Task_8076A6C(void) static void sub_8076B84(Sprite_GermanFlute *flute) { - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; diff --git a/src/game/interactables_2/sky_canyon/propeller.c b/src/game/interactables_2/sky_canyon/propeller.c index e15325a37..bde589f1c 100644 --- a/src/game/interactables_2/sky_canyon/propeller.c +++ b/src/game/interactables_2/sky_canyon/propeller.c @@ -253,7 +253,7 @@ static void StartPlayerFloatingTask(Sprite_Propeller *propeller) static void sub_807B8FC(Sprite_Propeller *propeller) { - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; gPlayer.unk17 = 14; diff --git a/src/game/multiboot/collect_rings/results.c b/src/game/multiboot/collect_rings/results.c index 79da79301..36a607eff 100644 --- a/src/game/multiboot/collect_rings/results.c +++ b/src/game/multiboot/collect_rings/results.c @@ -490,7 +490,7 @@ void sub_8082788(void) DisplaySprite(s); // TODO: Fix type - temp = sub_8004518(gMultiplayerCharRings[i]); + temp = Base10DigitsToHexNibbles(gMultiplayerCharRings[i]); s = &resultsScreen->unk160[((temp) >> 8) & 0xF]; if (s != &resultsScreen->unk160[0]) { @@ -522,7 +522,7 @@ void sub_8082788(void) if (gUnknown_03005428[i] > 99) { temp = 99; } else { - temp = sub_8004518(gUnknown_03005428[i]); + temp = Base10DigitsToHexNibbles(gUnknown_03005428[i]); } s = &resultsScreen->unk160[((temp) >> 4)]; diff --git a/src/game/multiboot/collect_rings/time_display.c b/src/game/multiboot/collect_rings/time_display.c index 54a50155d..093ebb1ba 100644 --- a/src/game/multiboot/collect_rings/time_display.c +++ b/src/game/multiboot/collect_rings/time_display.c @@ -110,11 +110,11 @@ void sub_8082E9C(TimeDisplay *timeDisplay) index = temp / 0x10000; temp2 *= 0x10000; temp2 /= 0x10000; - temp6 = sub_8004518(index); + temp6 = Base10DigitsToHexNibbles(index); temp3 = Div(temp2, 60); index = temp2 - (temp3 * 60); - temp4 = sub_8004518(index); + temp4 = Base10DigitsToHexNibbles(index); temp5 = 0; if (gCourseTime < 3600) { @@ -187,7 +187,7 @@ void sub_8083040(TimeDisplay *timeDisplay) s->palId = i; DisplaySprite(s); - j = sub_8004518(gMultiplayerCharRings[i]); + j = Base10DigitsToHexNibbles(gMultiplayerCharRings[i]); x = s->x + 0x17; y = s->y + 0x13; do { @@ -232,11 +232,11 @@ void sub_8083104(TimeDisplay *timeDisplay) index = temp / 0x10000; temp2 *= 0x10000; temp2 /= 0x10000; - temp6 = sub_8004518(index); + temp6 = Base10DigitsToHexNibbles(index); temp3 = Div(temp2, 60); index = temp2 - (temp3 * 60); - temp4 = sub_8004518(index); + temp4 = Base10DigitsToHexNibbles(index); x = 8; y = 54; diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index d8b5949a6..c996e3ca1 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -124,12 +124,12 @@ void Task_8019E70(void) Sprite *s = &finish->s; MultiplayerPlayer *mpp = TASK_DATA(gMultiplayerPlayerTasks[finish->unk30]); - s->x = mpp->unk50 - gCamera.x; + s->x = mpp->pos.x - gCamera.x; if (!GRAVITY_IS_INVERTED) { - s->y = (mpp->unk52 - gCamera.y) - 32; + s->y = (mpp->pos.y - gCamera.y) - 32; } else { - s->y = (mpp->unk52 - gCamera.y) + 32; + s->y = (mpp->pos.y - gCamera.y) + 32; } DisplaySprite(s); diff --git a/src/game/multiplayer/indicators.c b/src/game/multiplayer/indicators.c index 5a88a5705..9f05721b4 100644 --- a/src/game/multiplayer/indicators.c +++ b/src/game/multiplayer/indicators.c @@ -115,10 +115,10 @@ NONMATCH("asm/non_matching/game/multiplayer/indicators__Task_801951C.inc", spr = &pi->spr; transform = &pi->transform; - opponentX = mpp->unk50 - gCamera.x; + opponentX = mpp->pos.x - gCamera.x; if ((opponentX >= 0) && (opponentX <= DISPLAY_WIDTH)) { - opponentY = mpp->unk52 - gCamera.y; + opponentY = mpp->pos.y - gCamera.y; if ((opponentY >= 0) && (opponentY <= DISPLAY_HEIGHT)) { return; @@ -126,8 +126,8 @@ NONMATCH("asm/non_matching/game/multiplayer/indicators__Task_801951C.inc", } // _08019576 - opponentX2 = mpp->unk50 - (DISPLAY_WIDTH / 2); - opponentY2 = mpp->unk52 - (DISPLAY_HEIGHT / 2); + opponentX2 = mpp->pos.x - (DISPLAY_WIDTH / 2); + opponentY2 = mpp->pos.y - (DISPLAY_HEIGHT / 2); opponentX2 -= gCamera.x; opponentY2 -= gCamera.y; diff --git a/src/game/multiplayer/mp_player.c b/src/game/multiplayer/mp_player.c index 804599353..3c31e1144 100644 --- a/src/game/multiplayer/mp_player.c +++ b/src/game/multiplayer/mp_player.c @@ -48,69 +48,69 @@ void CreateMultiplayerPlayer(u8 id) Sprite *s; struct Task *t = TaskCreate(Task_CreateMultiplayerPlayer, sizeof(MultiplayerPlayer), 0x2000, 0, TaskDestructor_MultiplayerPlayer); - MultiplayerPlayer *player = TASK_DATA(t); - player->unk56 = id; - player->unk54 = 0x40; - player->unk44 = 0; - player->unk48 = 0; - player->unk66 = 0; - player->unk68 = 0; - player->unk6A = 0; + MultiplayerPlayer *mpp = TASK_DATA(t); + mpp->unk56 = id; + mpp->unk54 = 0x40; + mpp->unk44 = 0; + mpp->unk48 = 0; + mpp->unk66 = 0; + mpp->unk68 = 0; + mpp->unk6A = 0; if (id != SIO_MULTI_CNT->id) { - player->unk60 = 30; + mpp->unk60 = 30; } else { - player->unk60 = 0; + mpp->unk60 = 0; } - player->unk57 = 128; - player->unk61 = 0; - player->unk5C = 0; - player->unk64 = player->unk56; + mpp->unk57 = 128; + mpp->unk61 = 0; + mpp->unk5C = 0; + mpp->unk64 = mpp->unk56; if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { - player->unk5C |= 2; + mpp->unk5C |= 2; } - player->unk50 = 0; - player->unk52 = 0; + mpp->pos.x = 0; + mpp->pos.y = 0; if (gGameMode < GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { - player->unk50 = gSpawnPositions[gCurrentLevel][0]; - player->unk52 = gSpawnPositions[gCurrentLevel][1]; + mpp->pos.x = gSpawnPositions[gCurrentLevel][0]; + mpp->pos.y = gSpawnPositions[gCurrentLevel][1]; } else { switch (SIO_MULTI_CNT->id) { case 0: { - player->unk50 = 232; - player->unk52 = 829; + mpp->pos.x = 232; + mpp->pos.y = 829; break; } case 1: { - player->unk50 = 1585; - player->unk52 = 279; + mpp->pos.x = 1585; + mpp->pos.y = 279; break; } case 2: { - player->unk50 = 1585; - player->unk52 = 926; + mpp->pos.x = 1585; + mpp->pos.y = 926; break; } case 3: { - player->unk50 = 232; - player->unk52 = 348; + mpp->pos.x = 232; + mpp->pos.y = 348; break; } } } - s = &player->s; + s = &mpp->s; s->unk1A = SPRITE_OAM_ORDER(16); s->graphics.size = 0; s->animCursor = 0; s->timeUntilNextFrame = 0; s->prevVariant = -1; s->animSpeed = SPRITE_ANIM_SPEED(1.0); - s->palId = player->unk56; + s->palId = mpp->unk56; s->hitboxes[0].index = HITBOX_STATE_INACTIVE; s->unk10 = SPRITE_FLAG(PRIORITY, 2); @@ -119,10 +119,10 @@ void CreateMultiplayerPlayer(u8 id) s->x = 0; s->y = 0; - player->transform.height = 256; - s->graphics.anim = gPlayerCharacterIdleAnims[gMultiplayerCharacters[player->unk56]]; + mpp->transform.height = 256; + s->graphics.anim = gPlayerCharacterIdleAnims[gMultiplayerCharacters[mpp->unk56]]; - if (player->unk56 != SIO_MULTI_CNT->id) { + if (mpp->unk56 != SIO_MULTI_CNT->id) { s->graphics.dest = VramMalloc(64); s->unk10 |= SPRITE_FLAG_MASK_MOSAIC; } else { @@ -130,7 +130,7 @@ void CreateMultiplayerPlayer(u8 id) } UpdateSpriteAnimation(s); - gMultiplayerPlayerTasks[player->unk56] = t; + gMultiplayerPlayerTasks[mpp->unk56] = t; } // around 70%: https://decomp.me/scratch/KNjEN @@ -151,30 +151,30 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla s32 x; mpp->unk61 = 0; if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { - mpp->unk44 = recv->pat4.x - mpp->unk50; - mpp->unk48 = recv->pat4.y - mpp->unk52; - mpp->unk50 = recv->pat4.x; - mpp->unk52 = recv->pat4.y; + mpp->unk44 = recv->pat4.x - mpp->pos.x; + mpp->unk48 = recv->pat4.y - mpp->pos.y; + mpp->pos.x = recv->pat4.x; + mpp->pos.y = recv->pat4.y; } else { - mpp->unk44 = recv->pat4.x - mpp->unk50; - mpp->unk48 = recv->pat4.y - mpp->unk52; + mpp->unk44 = recv->pat4.x - mpp->pos.x; + mpp->unk48 = recv->pat4.y - mpp->pos.y; x = ABS(mpp->unk44); if (x > 15) { x = ABS(mpp->unk48); if (mpp->unk44 > 0 && mpp->unk48 > 0) { - mpp->unk44 = recv->pat4.x - mpp->unk50 - 1440; - mpp->unk48 = recv->pat4.y - mpp->unk52 - 864; + mpp->unk44 = recv->pat4.x - mpp->pos.x - 1440; + mpp->unk48 = recv->pat4.y - mpp->pos.y - 864; } else { if (mpp->unk44 < 0 && mpp->unk48 < 0) { - mpp->unk44 = recv->pat4.x - mpp->unk50 - 1440; - mpp->unk48 = recv->pat4.y - mpp->unk52 - 864; + mpp->unk44 = recv->pat4.x - mpp->pos.x - 1440; + mpp->unk48 = recv->pat4.y - mpp->pos.y - 864; } } } - mpp->unk50 = recv->pat4.x; - mpp->unk52 = recv->pat4.y; + mpp->pos.x = recv->pat4.x; + mpp->pos.y = recv->pat4.y; } if (ABS(mpp->unk44) < 0x41) { if (ABS(mpp->unk48) >= 0x40) { @@ -272,8 +272,8 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla } } else { goto thing; - // mpp->unk50 += I(mpp->unk66); - // mpp->unk52 += I(mpp->unk68); + // mpp->pos.x += I(mpp->unk66); + // mpp->pos.y += I(mpp->unk68); // if (mpp->unk61++ > 30) { // // TODO: macro this @@ -287,8 +287,8 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla } } else { thing: - mpp->unk50 += I(mpp->unk66); - mpp->unk52 += I(mpp->unk68); + mpp->pos.x += I(mpp->unk66); + mpp->pos.y += I(mpp->unk68); if (mpp->unk61++ > 30) { // TODO: macro this @@ -309,10 +309,10 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla } } - s->x = mpp->unk50 - gCamera.x; - s->y = mpp->unk52 - gCamera.y; - transform->x = mpp->unk50 - gCamera.x; - transform->y = mpp->unk52 - gCamera.y; + s->x = mpp->pos.x - gCamera.x; + s->y = mpp->pos.y - gCamera.y; + transform->x = mpp->pos.x - gCamera.x; + transform->y = mpp->pos.y - gCamera.y; if (mpp->unk54 & 0x800) { s->prevVariant = -1; @@ -550,10 +550,10 @@ void sub_8016D20(void) gPlayer.moveState |= MOVESTATE_IN_AIR; } - if (!GRAVITY_IS_INVERTED && I(gPlayer.y) > mpp->unk52) { + if (!GRAVITY_IS_INVERTED && I(gPlayer.y) > mpp->pos.y) { mpp->unk60 = 30; return; - } else if (GRAVITY_IS_INVERTED && I(gPlayer.y) < mpp->unk52) { + } else if (GRAVITY_IS_INVERTED && I(gPlayer.y) < mpp->pos.y) { mpp->unk60 = 30; return; } else if (s->unk10 & SPRITE_FLAG_MASK_X_FLIP) { @@ -580,7 +580,7 @@ void sub_8016D20(void) return; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 1); if (mpp->unk4C & MOVESTATE_20 && !(val & MOVESTATE_20)) { @@ -611,10 +611,10 @@ void sub_8016D20(void) gPlayer.moveState |= MOVESTATE_IN_AIR; } - if (!GRAVITY_IS_INVERTED && I(gPlayer.y) > mpp->unk52) { + if (!GRAVITY_IS_INVERTED && I(gPlayer.y) > mpp->pos.y) { mpp->unk60 = 30; return; - } else if (GRAVITY_IS_INVERTED && I(gPlayer.y) < mpp->unk52) { + } else if (GRAVITY_IS_INVERTED && I(gPlayer.y) < mpp->pos.y) { mpp->unk60 = 30; return; } else if (s->unk10 & SPRITE_FLAG_MASK_X_FLIP) { @@ -641,7 +641,7 @@ void sub_8016D20(void) return; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 0); if ((mpp->unk4C & MOVESTATE_20) && !(val & MOVESTATE_20)) { @@ -728,7 +728,7 @@ void sub_801707C(void) } someOtherBool = (gPlayer.moveState >> 1) & 1; - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 1); if ((mpp->unk4C & 0x20) && !(val & 0x20)) { @@ -754,11 +754,11 @@ void sub_801707C(void) s32 y; if (!GRAVITY_IS_INVERTED) { - result = sub_801E4E4(MAX(I(gPlayer.y), mpp->unk52) + gPlayer.unk17, + result = sub_801E4E4(MAX(I(gPlayer.y), mpp->pos.y) + gPlayer.unk17, I(gPlayer.x), gPlayer.unk38, 8, &unusedByte, sub_801EE64); } else { - result = sub_801E4E4(MIN(I(gPlayer.y), mpp->unk52) - gPlayer.unk17, + result = sub_801E4E4(MIN(I(gPlayer.y), mpp->pos.y) - gPlayer.unk17, I(gPlayer.x), gPlayer.unk38, -8, &unusedByte, sub_801EE64); } @@ -824,11 +824,11 @@ void sub_801707C(void) s32 x, y; bool32 invertedGravity = GRAVITY_IS_INVERTED; mpp->unk5C |= 4; - x = Q(mpp->unk50); + x = Q(mpp->pos.x); // TODO: potential macro if (!invertedGravity) { - y = Q(mpp->unk52 + (s->hitboxes[0].bottom) + 17); + y = Q(mpp->pos.y + (s->hitboxes[0].bottom) + 17); result = sub_801E4E4(I(gPlayer.y) + gPlayer.unk17, I(gPlayer.x), gPlayer.unk38, 8, &unusedByte, sub_801EE64); @@ -840,7 +840,7 @@ void sub_801707C(void) } } else { - y = Q(mpp->unk52 + (s->hitboxes[0].top) - 17); + y = Q(mpp->pos.y + (s->hitboxes[0].top) - 17); result = sub_801E4E4(I(gPlayer.y) - gPlayer.unk17, I(gPlayer.x), gPlayer.unk38, -8, &unusedByte, sub_801EE64); @@ -901,7 +901,7 @@ void sub_801707C(void) return; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 0); if ((mpp->unk4C & MOVESTATE_20) && !(val & MOVESTATE_20)) { @@ -979,7 +979,7 @@ void sub_8017670(void) { s8 rect[4] = { -gPlayer.unk16, -gPlayer.unk17, gPlayer.unk16, gPlayer.unk17 }; - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 1); if (mpp->unk4C & 0x20 && !(val & 0x20)) { @@ -992,7 +992,7 @@ void sub_8017670(void) mpp->unk60 = 30; } - if (CheckRectCollision_SpritePlayer(s, mpp->unk50, mpp->unk52, &gPlayer, + if (CheckRectCollision_SpritePlayer(s, mpp->pos.x, mpp->pos.y, &gPlayer, (struct Rect8 *)rect)) { u8 temp = ((mpp->unk54 >> 7) & 1); if ((temp == gPlayer.unk38) @@ -1003,8 +1003,8 @@ void sub_8017670(void) || s->graphics.anim == SA2_ANIM_CHAR(SA2_CHAR_ANIM_21, CHARACTER_KNUCKLES)) && !GRAVITY_IS_INVERTED == !(mpp->unk54 & 8)) { - if ((!GRAVITY_IS_INVERTED && I(gPlayer.y) > mpp->unk52) - || (GRAVITY_IS_INVERTED && I(gPlayer.y) < mpp->unk52)) { + if ((!GRAVITY_IS_INVERTED && I(gPlayer.y) > mpp->pos.y) + || (GRAVITY_IS_INVERTED && I(gPlayer.y) < mpp->pos.y)) { gPlayer.moveState |= MOVESTATE_400000; sub_8023B5C(&gPlayer, 14); gPlayer.unk16 = 6; @@ -1069,12 +1069,12 @@ void sub_8017670(void) s32 playerUnk17 = gPlayer.unk17; bool32 gravityInverted = GRAVITY_IS_INVERTED; // mpp->unk5C |= 4; - x = QS(mpp->unk50); + x = QS(mpp->pos.x); // TODO: potential macro if (!(gravityInverted)) { - y = QS((mpp->unk52 + (s->hitboxes[0].top)) - rect[3]); - result = sub_801F100((mpp->unk52 + (s->hitboxes[0].top) - rect[3]) + y = QS((mpp->pos.y + (s->hitboxes[0].top)) - rect[3]); + result = sub_801F100((mpp->pos.y + (s->hitboxes[0].top) - rect[3]) - playerUnk17, I(x), gPlayer.unk38, -8, sub_801EC3C); @@ -1085,9 +1085,9 @@ void sub_8017670(void) mpp->unk5C &= ~4; } } else { - y = QS(mpp->unk52 + (s->hitboxes[0].bottom) + rect[3]); + y = QS(mpp->pos.y + (s->hitboxes[0].bottom) + rect[3]); result = sub_801F100( - ((mpp->unk52 + (s->hitboxes[0].bottom) + rect[3]) + playerUnk17), + ((mpp->pos.y + (s->hitboxes[0].bottom) + rect[3]) + playerUnk17), I(x), gPlayer.unk38, 8, sub_801EC3C); if (result < 0) { @@ -1140,7 +1140,7 @@ void sub_8017670(void) return; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 0); if ((mpp->unk4C & MOVESTATE_20) && !(val & MOVESTATE_20)) { @@ -1186,7 +1186,7 @@ void sub_8017C28(void) return; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 1); if (mpp->unk4C & 0x20 && !(val & 0x20)) { @@ -1200,7 +1200,7 @@ void sub_8017C28(void) || gPlayer.character == CHARACTER_KNUCKLES)) { return; } - val = sub_800DA4C(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800DA4C(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1); if ((val & 2) && !(gPlayer.moveState & MOVESTATE_IN_AIR) && gPlayer.rotation == 0) { @@ -1247,7 +1247,7 @@ void sub_8017C28(void) mpp->unk60 = 30; return; } else { - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 1); if (mpp->unk4C & 0x20 && !(val & 0x20)) { @@ -1270,7 +1270,7 @@ void sub_8017C28(void) return; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 0); if (mpp->unk4C & 0x20 && !(val & 0x20)) { @@ -1377,7 +1377,7 @@ bool32 sub_80181E0(void) u32 val; if (HITBOX_IS_ACTIVE(playerS->hitboxes[1]) && HITBOX_IS_ACTIVE(s->hitboxes[1])) { - val = sub_800DA4C(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800DA4C(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1); if ((val & 1)) { @@ -1419,14 +1419,14 @@ bool32 sub_8018300(void) s = &mpp->s; if (mpp->unk60 == 0) { - u32 val2 = sub_800DA4C(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + u32 val2 = sub_800DA4C(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1); if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && !(val2 & 3)) { - if (mpp->unk50 > 960) { - val2 = sub_800DA4C(s, mpp->unk50 - 1440, mpp->unk52 - 864, mpp->unk66, + if (mpp->pos.x > 960) { + val2 = sub_800DA4C(s, mpp->pos.x - 1440, mpp->pos.y - 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1); } else { - val2 = sub_800DA4C(s, mpp->unk50 + 1440, mpp->unk52 + 864, mpp->unk66, + val2 = sub_800DA4C(s, mpp->pos.x + 1440, mpp->pos.y + 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1); } } @@ -1455,14 +1455,14 @@ bool32 sub_8018300(void) } if (val2 & 2) { if (val2 & 1) { - if (mpp->unk50 < I(gPlayer.x)) { + if (mpp->pos.x < I(gPlayer.x)) { gPlayer.moveState &= ~MOVESTATE_FACING_LEFT; } else { gPlayer.moveState |= MOVESTATE_FACING_LEFT; } sub_800DE44(&gPlayer); } else { - if (mpp->unk50 < I(gPlayer.x)) { + if (mpp->pos.x < I(gPlayer.x)) { gPlayer.moveState |= MOVESTATE_FACING_LEFT; } else { gPlayer.moveState &= ~MOVESTATE_FACING_LEFT; @@ -1480,18 +1480,18 @@ bool32 sub_8018300(void) Sprite *existingS = gPlayer.unk3C; s16 x, y; - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val2 & 2); if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && val == 0) { gPlayer.moveState = existingMoveState; gPlayer.unk3C = existingS; - if (mpp->unk50 > 960) { - val = sub_800D0A0(s, mpp->unk50 - 1440, mpp->unk52 - 864, mpp->unk66, + if (mpp->pos.x > 960) { + val = sub_800D0A0(s, mpp->pos.x - 1440, mpp->pos.y - 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val); } else { - val = sub_800D0A0(s, mpp->unk50 + 1440, mpp->unk52 + 864, mpp->unk66, + val = sub_800D0A0(s, mpp->pos.x + 1440, mpp->pos.y + 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val); } } @@ -1526,15 +1526,15 @@ bool32 sub_8018300(void) return FALSE; } - val = sub_800D0A0(s, mpp->unk50, mpp->unk52, mpp->unk66, mpp->unk68, + val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, mpp->unk54 >> 7 & 1, 0); if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && val == 0) { - if (mpp->unk50 > 960) { - val = sub_800D0A0(s, mpp->unk50 - 1440, mpp->unk52 - 864, mpp->unk66, + if (mpp->pos.x > 960) { + val = sub_800D0A0(s, mpp->pos.x - 1440, mpp->pos.y - 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val); } else { - val = sub_800D0A0(s, mpp->unk50 + 1440, mpp->unk52 + 864, mpp->unk66, + val = sub_800D0A0(s, mpp->pos.x + 1440, mpp->pos.y + 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val); } } diff --git a/src/game/multiplayer/multipak_connection.c b/src/game/multiplayer/multipak_connection.c index d01f1b00a..afb58a802 100644 --- a/src/game/multiplayer/multipak_connection.c +++ b/src/game/multiplayer/multipak_connection.c @@ -673,7 +673,7 @@ void MultiPakCommunicationError(void) // TODO: Fix cast! gTilemapsRef = (struct MapHeader **)gTilemaps; - gUnknown_03002794 = &gSpriteTables; + gRefSpriteTables = &gSpriteTables; gMultiplayerMissingHeartbeats[0] = 0; gMultiplayerMissingHeartbeats[1] = 0; gMultiplayerMissingHeartbeats[2] = 0; diff --git a/src/game/multiplayer/unknown_task.c b/src/game/multiplayer/unknown_task.c index c9b7472da..3bc5a8d82 100644 --- a/src/game/multiplayer/unknown_task.c +++ b/src/game/multiplayer/unknown_task.c @@ -116,8 +116,8 @@ void sub_8018AD8(union MultiSioData *recv, u8 i) | MOVESTATE_400000); if (!(prevMoveState)) { InitializePlayer(&gPlayer); - gPlayer.x = QS(mpp->unk50); - gPlayer.y = QS(mpp->unk52 - (s8)mpp->unk58[0]); + gPlayer.x = QS(mpp->pos.x); + gPlayer.y = QS(mpp->pos.y - (s8)mpp->unk58[0]); m4aMPlayTempoControl(&gMPlayInfo_BGM, 256); gPlayer.moveState = prevMoveState; gPlayer.unk90->s.unk10 &= ~0x3000; @@ -226,7 +226,7 @@ void sub_8018E00(union MultiSioData *recv, u8 i) == (gMultiplayerConnections & (0x10 << (i))) >> (i + 4)) { sub_8019CCC(j, count2); if (j == SIO_MULTI_CNT->id) { - sub_80218E4(&gPlayer); + Player_TransitionCancelFlyingAndBoost(&gPlayer); gPlayer.moveState &= ~MOVESTATE_8; gPlayer.moveState &= ~MOVESTATE_20; gPlayer.moveState &= ~MOVESTATE_4; diff --git a/src/game/player_callbacks.c b/src/game/player_callbacks.c index d75bcd19c..32e81b231 100644 --- a/src/game/player_callbacks.c +++ b/src/game/player_callbacks.c @@ -168,7 +168,7 @@ struct Task *sub_8011C98(s32 x, s32 y) void sub_8011D48(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -272,7 +272,7 @@ void PlayerCB_8011E88(Player *p) // for Sonic (Bound) & Amy (Mid-Air Hammer Swirl) void PlayerCB_8011F1C(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 9); p->moveState |= MOVESTATE_20000000; @@ -315,7 +315,7 @@ void PlayerCB_8011F94(Player *p) bounceSpeed = I(bounceImpactAccel * (COS_24_8((rot)))); p->speedAirY = -ABS(bounceSpeed); - p->speedAirX = p->speedAirX >> 1; + p->speedAirX = HALVE(p->speedAirX); PLAYERFN_SET(PlayerCB_8012460); @@ -363,7 +363,7 @@ void sub_80120C0(Player *p) p->moveState &= ~MOVESTATE_FACING_LEFT; } - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= MOVESTATE_IN_AIR; p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20 | MOVESTATE_4); @@ -396,7 +396,7 @@ void sub_8012194(Player *p) s32 six = Q(6.0); s32 cosVal, sinVal; - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_20000000 | MOVESTATE_BOOST_EFFECT_ON | MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -424,7 +424,7 @@ void sub_8012194(Player *p) void PlayerCB_801225C(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_100 | MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_20000000 | MOVESTATE_1000000 | MOVESTATE_20); @@ -578,7 +578,7 @@ bool32 sub_801251C(Player *p) void sub_8012548(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -621,7 +621,7 @@ void sub_80125BC(Player *p) void sub_8012644(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); if (p->moveState & MOVESTATE_4) { p->moveState &= ~MOVESTATE_4; @@ -715,7 +715,7 @@ void PlayerCB_80127F0(Player *p) void sub_8012830(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -730,7 +730,7 @@ void sub_8012830(Player *p) void sub_8012888(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -745,7 +745,7 @@ void sub_8012888(Player *p) void sub_80128E0(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -838,7 +838,7 @@ struct Task *sub_80129DC(s32 x, s32 y) void sub_8012AD0(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -881,7 +881,7 @@ void sub_8012B44(Player *p) void sub_8012BC0(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); if (p->moveState & MOVESTATE_4) { p->moveState &= ~MOVESTATE_4; @@ -958,7 +958,7 @@ void PlayerCB_8012D1C(Player *p) void sub_8012D3C(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -1035,7 +1035,7 @@ struct Task *sub_8012DF8(s32 x, s32 y, u16 p2) void sub_8012EEC(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -1123,7 +1123,7 @@ void PlayerCB_8013010(Player *p) void sub_8013070(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -1923,7 +1923,7 @@ void PlayerCB_8013DA8(Player *p); void PlayerCB_8013D18(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14); @@ -2048,7 +2048,7 @@ void PlayerCB_8013F60(Player *p); void sub_8013F04(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; diff --git a/src/game/race_progress.c b/src/game/race_progress.c index bbe6df947..b2764dddc 100644 --- a/src/game/race_progress.c +++ b/src/game/race_progress.c @@ -145,15 +145,14 @@ static void Task_UpdateAvatarPositions(void) { u8 i; Sprite *avatar; - MultiplayerPlayer *player; + MultiplayerPlayer *mpp; struct RaceProgressIndicator *progressIndicator = TASK_DATA(gCurTask); for (i = 0; i < progressIndicator->numPlayers; i++) { avatar = &progressIndicator->avatars[i]; - player = TASK_DATA(gMultiplayerPlayerTasks[i]); + mpp = TASK_DATA(gMultiplayerPlayerTasks[i]); avatar->x - = ((player->unk50 * sCourseStepSizes[progressIndicator->course]) >> 0x10) - + 6; + = ((mpp->pos.x * sCourseStepSizes[progressIndicator->course]) >> 0x10) + 6; } RenderUI(progressIndicator); diff --git a/src/game/special_stage/utils.c b/src/game/special_stage/utils.c index 36a6e2c78..646962630 100644 --- a/src/game/special_stage/utils.c +++ b/src/game/special_stage/utils.c @@ -11,7 +11,7 @@ void *gUnknown_03005B58 = NULL; void *gUnknown_03005B5C = NULL; void sub_806CA88(Sprite *obj, s8 target, u32 size, u16 anim, u32 unk10, s16 xPos, - s16 yPos, u16 g, u8 variant, u8 palId) + s16 yPos, u16 oamOrder, u8 variant, u8 palId) { Sprite newObj; Sprite *s; @@ -35,12 +35,12 @@ void sub_806CA88(Sprite *obj, s8 target, u32 size, u16 anim, u32 unk10, s16 xPos s->unk10 = unk10; s->x = xPos; s->y = yPos; - s->unk1A = g << 6; + s->unk1A = SPRITE_OAM_ORDER(oamOrder); s->timeUntilNextFrame = 0; - s->prevAnim = 0xffff; + s->prevAnim = -1; s->variant = variant; s->prevVariant = -1; - s->animSpeed = 0x10; + s->animSpeed = SPRITE_ANIM_SPEED(1.0); s->palId = palId; s->hitboxes[0].index = -1; @@ -70,12 +70,12 @@ bool16 sub_806CB84(struct UNK_806CB84 *a, { u16 deg = -stage->cameraBearing & 0x3FF; - s32 r2 = (gSineTable[deg] * 4); - s32 r5 = gSineTable[(deg) + 0x100]; + s32 r2 = SIN(deg) * 4; + s32 r5 = COS(deg) * 4; s32 temp_r4 = (-unk874->unk0 + stage->cameraX); s32 r3 = (-unk874->unk4 + stage->cameraY); - r9 = (((r2 >> 8) * (r3 >> 8)) + ((r5 >> 6) * (temp_r4 >> 8))) >> 2; - r4 = (((-r2 >> 8) * (temp_r4 >> 8)) + ((r5 >> 6) * (r3 >> 8))) >> 1; + r9 = ((I(r2) * I(r3)) + (I(r5) * I(temp_r4))) >> 2; + r4 = ((I(-r2) * I(temp_r4)) + (I(r5) * I(r3))) >> 1; } { @@ -91,7 +91,7 @@ bool16 sub_806CB84(struct UNK_806CB84 *a, val = stage->unk5D3; while (val2 != 0) { - if (val >= 0xA0) { + if (val >= 160) { val -= val2 >> 1; } else if (val < stage->unk5D1) { val += val2 >> 1; @@ -108,7 +108,7 @@ bool16 sub_806CB84(struct UNK_806CB84 *a, { s32 r2 = (-(stage->unk94[val][0] >> 1) * 9) >> 3; - s32 r8 = ((stage->unk94[val][0] >> 1) * 9) >> 3; + s32 r8 = (+(stage->unk94[val][0] >> 1) * 9) >> 3; if (r9 <= r2 || r9 >= r8) { return FALSE; @@ -119,7 +119,7 @@ bool16 sub_806CB84(struct UNK_806CB84 *a, a->unk8 = (0x78 - ((r9 * 0x87) / r8)); a->screenX = a->unk8 - unk874->unkC; if (unk874->unk8 != 0) { - a->unk6 = (((unk874->unk8 << 3) / world->unkC[val]) * 9) >> 2; + a->unk6 = (((unk874->unk8 * 8) / world->unkC[val]) * 9) >> 2; } else { a->unk6 = 0; } @@ -155,8 +155,9 @@ void sub_806CD68(Sprite *s) numSubframes = sprDims->numSubframes; for (i = 0; i < numSubframes; i++) { u32 attr1_2; - reference = gUnknown_03002794->oamData[s->graphics.anim]; - oam = OamMalloc((s->unk1A & 0x7C0) >> 6); + reference = gRefSpriteTables->oamData[s->graphics.anim]; + + oam = OamMalloc(GET_SPRITE_OAM_ORDER(s)); if (oam == iwram_end) { return; } @@ -172,7 +173,7 @@ void sub_806CD68(Sprite *s) oam->all.attr1 &= 0xfe00; oam->all.attr1 |= ((s->unk10 & 0x1f) << 9); oam->all.attr1 |= ((unk16 + attr1_2) & 0x1ff); - oam->all.attr2 += s->palId * 0x1000; + oam->all.attr2 += s->palId << 12; oam->all.attr2 |= ((s->unk10 & 0x3000) >> 2); oam->all.attr2 += GET_TILE_NUM(s->graphics.dest); } diff --git a/src/game/stage/background/zone_7_1.c b/src/game/stage/background/zone_7_1.c index 485e5b72e..b20ae2665 100644 --- a/src/game/stage/background/zone_7_1.c +++ b/src/game/stage/background/zone_7_1.c @@ -35,7 +35,8 @@ void CreateStageBg_Zone7(void) gDispCnt = DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; - gBgCntRegs[0] = 0x160F; + gBgCntRegs[0] + = (BGCNT_TXT256x256 | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_PRIORITY(15)); src = gStageCameraBgTemplates; memcpy(bg, &src[3], sizeof(Background)); diff --git a/src/game/stage/collision.c b/src/game/stage/collision.c index 0034efefa..e91555189 100644 --- a/src/game/stage/collision.c +++ b/src/game/stage/collision.c @@ -821,11 +821,12 @@ s32 sub_801EF94(s32 p0, s32 p1, s32 layer) coll = gRefCollision; mtIndex = ((u16 *)coll->map[layer])[(r3 * coll->levelX) + r8]; -#ifndef NON_MATCHING // ((r5 << 3) + (r5 << 2)) == r5 * TILES_PER_METATILE_AXIS r1 = ((r5 << 3) + (r5 << 2) + r7); +#ifndef NON_MATCHING asm("" ::"r"(r5)); +#endif r3 = mtIndex * 256; mtIndex *= 32; @@ -835,10 +836,6 @@ s32 sub_801EF94(s32 p0, s32 p1, s32 layer) pMeta += mtIndex; pMeta += i; result = *(u16 *)pMeta; -#else - mtIndex = mtIndex * 288 + ((r5 * 12) + r7) * 2; - result = coll->metatiles[mtIndex]; -#endif return result; } diff --git a/src/game/stage/dust_effect_spindash.c b/src/game/stage/dust_effect_spindash.c index 8ce4161eb..80098512f 100644 --- a/src/game/stage/dust_effect_spindash.c +++ b/src/game/stage/dust_effect_spindash.c @@ -71,8 +71,8 @@ void Task_SpindashDustEffect(void) if (IS_MULTI_PLAYER) { struct Task *t = gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]; MultiplayerPlayer *mpp = TASK_DATA(t); - s->x = (mpp->unk50 - cam->x); - s->y = ((mpp->unk52 + offY) - cam->y); + s->x = (mpp->pos.x - cam->x); + s->y = ((mpp->pos.y + offY) - cam->y); } else { s->x = I(p->x) - cam->x; s->y = (I(p->y) + offY) - cam->y; @@ -126,8 +126,8 @@ void Task_SpindashDustEffectBig(void) if (IS_MULTI_PLAYER) { struct Task *t = gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]; MultiplayerPlayer *mpp = TASK_DATA(t); - s->x = (mpp->unk50 - cam->x); - s->y = ((mpp->unk52 + offY) - cam->y); + s->x = (mpp->pos.x - cam->x); + s->y = ((mpp->pos.y + offY) - cam->y); } else { s->x = I(p->x) - cam->x; s->y = (I(p->y) + offY) - cam->y; diff --git a/src/game/stage/game_2.c b/src/game/stage/game_2.c index b05605a7f..b7ac07662 100644 --- a/src/game/stage/game_2.c +++ b/src/game/stage/game_2.c @@ -81,8 +81,8 @@ void Task_801F214(void) s8 id = SIO_MULTI_CNT->id; struct Task *tmpp = gMultiplayerPlayerTasks[id]; MultiplayerPlayer *mpp = TASK_DATA(tmpp); - ts->x = mpp->unk50; - ts->y = mpp->unk52; + ts->x = mpp->pos.x; + ts->y = mpp->pos.y; } else { ts->x = I(gPlayer.x); ts->y = I(gPlayer.y); diff --git a/src/game/stage/item_tasks.c b/src/game/stage/item_tasks.c index 306a561cd..1380bce5c 100644 --- a/src/game/stage/item_tasks.c +++ b/src/game/stage/item_tasks.c @@ -283,8 +283,8 @@ void Task_Item_Invincibility(void) MultiplayerPlayer *mpp = TASK_DATA(gMultiplayerPlayerTasks[(s8)param]); if (mpp->unk57 & 0x2) { - x = mpp->unk50; - y = mpp->unk52; + x = mpp->pos.x; + y = mpp->pos.y; priority = mpp->s.unk10; } else { TaskDestroy(gCurTask); @@ -339,8 +339,8 @@ void Task_Item_Confusion(void) return; } - s->x = mpp->unk50 - cam->x; - s->y = mpp->unk52 - cam->y; + s->x = mpp->pos.x - cam->x; + s->y = mpp->pos.y - cam->y; s->unk10 &= ~SPRITE_FLAG_MASK_PRIORITY; s->unk10 |= mpp->s.unk10 & SPRITE_FLAG_MASK_PRIORITY; diff --git a/src/game/stage/player.c b/src/game/stage/player.c index 8e1805563..caf70ab45 100644 --- a/src/game/stage/player.c +++ b/src/game/stage/player.c @@ -62,6 +62,8 @@ PlayerSpriteInfo ALIGNED(16) gUnknown_03005AF0 = {}; // sakit extern void InitNewInputCounters(void); +void sub_8022218(Player *); +void sub_8022284(Player *); void Task_8023FC0(void); void AllocateCharacterStageGfx(Player *, PlayerSpriteInfo *); void AllocateCharacterMidAirGfx(Player *, PlayerSpriteInfo *); @@ -69,6 +71,7 @@ void TaskDestructor_802A07C(struct Task *); void sub_802486C(Player *p, PlayerSpriteInfo *p2); void sub_8024B10(Player *p, PlayerSpriteInfo *s); void sub_8024F74(Player *p, PlayerSpriteInfo *s); +void PlayerCB_8026BCC(Player *); s32 sub_8029BB8(Player *p, u8 *p1, s32 *out); @@ -120,14 +123,14 @@ bool32 sub_802A0FC(Player *); bool32 sub_802A184(Player *); bool32 sub_802A2A8(Player *); void PlayerCB_802A228(Player *); -void sub_802A360(Player *); +void Player_InitIceSlide(Player *); void PlayerCB_802A3B8(Player *); void PlayerCB_802A3C4(Player *); -void PlayerCB_802A3F0(Player *); +void PlayerCB_CameraShift(Player *); void sub_802A40C(Player *); void sub_802A468(Player *); void sub_802A4B8(Player *); -void PlayerCB_802A4FC(Player *); +void PlayerCB_Nop(Player *); void PlayerCB_802A5C4(Player *); void PlayerCB_802A620(Player *); void PlayerCB_802A714(Player *); @@ -406,6 +409,40 @@ static const s16 sSpringAccelX[4] = { static const u8 gUnknown_080D69C2[4] = { 4, 3, 2, 2 }; +// TODO: Find a compiler-flag or another way to inline without defining functions twice. + +static inline void Player_InitIceSlide_inline(Player *p) +{ + Player_TransitionCancelFlyingAndBoost(p); + p->moveState &= ~MOVESTATE_4; + + PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14); + + p->unk64 = 62; + p->moveState &= ~(MOVESTATE_FACING_LEFT); + + m4aSongNumStart(SE_ICE_PARADISE_SLIDE); + + PLAYERFN_SET_AND_CALL(PlayerCB_8026BCC, p); +} + +static inline void sub_802A500_inline(Player *p) +{ + if (p->speedAirY >= 0) { + sub_8022218(p); + sub_8022284(p); + } else { + sub_8022284(p); + sub_8022218(p); + } +} + +static inline void PlayerCB_CameraShift_inline(Player *p) +{ + if (gCamera.shiftY > -56) + gCamera.shiftY--; +} + void sub_80213C0(u32 UNUSED characterId, u32 UNUSED levelId, Player *player) { #ifndef NON_MATCHING @@ -513,14 +550,12 @@ void AllocateCharacterMidAirGfx(Player *p, PlayerSpriteInfo *param2) s->graphics.dest = VramMalloc(16); s->graphics.anim = SA2_ANIM_CHAR(SA2_CHAR_ANIM_SPIN_ATTACK, CHARACTER_CREAM); extraSprite->s.variant = 1; - } else { - if (character != CHARACTER_TAILS) { - return; - } - + } else if (character == CHARACTER_TAILS) { s->graphics.dest = VramMalloc(16); s->graphics.anim = SA2_ANIM_CHAR(SA2_CHAR_ANIM_SPIN_ATTACK, CHARACTER_TAILS); extraSprite->s.variant = 1; + } else { + return; } s->graphics.size = 0; @@ -556,7 +591,6 @@ void SetStageSpawnPos(u32 character, u32 level, u32 p2, Player *p) p->checkPointX = gSpawnPositions[level][0]; p->checkPointY = gSpawnPositions[level][1]; } else { - // _08021640 p->checkPointX = 360 - (SIO_MULTI_CNT->id * 20); p->checkPointY = 177; p->x = -1; @@ -697,8 +731,10 @@ NONMATCH("asm/non_matching/game/InitializePlayer.inc", void InitializePlayer(Pla } END_NONMATCH -// PlayerCancelMidAir? (Not only used for transitioning to ground) -void sub_80218E4(Player *p) +// Called anytime the player actively jumps, "autojumps" through touching an IA, +// touches a Boost Pad or a Rotating Handle, touches the ground, etc. +// TODO: Find a better name. +void Player_TransitionCancelFlyingAndBoost(Player *p) { if (p->moveState & MOVESTATE_20000) { m4aSongNumStop(SE_281); @@ -2951,21 +2987,53 @@ void sub_8023878(Player *p) } } -// TODO: incomplete -NONMATCH("asm/non_matching/sub_8023B5C.inc", - void sub_8023B5C(Player *p, s8 spriteOffsetY)) +void sub_8023B5C(Player *p, s32 spriteOffsetY) { - s8 rot; + u8 rot; if (p->unk17 == spriteOffsetY) { return; } rot = p->rotation; if (GRAVITY_IS_INVERTED) { - rot -= 0x40; + rot += Q(1. / 4.); + rot = -rot; + rot -= Q(1. / 4.); + } + + if ((s32)(rot + Q(1. / 8.)) > 0) { + if (rot != 0) { + rot = (rot + Q(1. / 8.)) - 1; + ; + } else { + rot = Q(1. / 8.); + } + } else { + if (rot != 0) { + rot = (rot + Q(1. / 8.)); + } else { + rot = Q(1. / 8.) - 1; + } + } + + switch ((rot >> 6)) { + case 0: { + p->y -= Q(spriteOffsetY - p->unk17); + } break; + + case 2: { + p->y += Q(spriteOffsetY - p->unk17); + } break; + + case 1: { + p->x += Q(spriteOffsetY - p->unk17); + } break; + + case 3: { + p->x -= Q(spriteOffsetY - p->unk17); + } break; } } -END_NONMATCH void sub_8023C10(Player *p) { @@ -3022,11 +3090,11 @@ void Task_8023D08(void) if (IS_SINGLE_PLAYER) { TaskDestroy(gCurTask); if ((!gLoadedSaveGame->timeLimitDisabled - && (gCourseTime > 36000 + && (gCourseTime > MAX_COURSE_TIME || (gStageFlags & EXTRA_STATE__4 && gCourseTime == 0))) || ((gGameMode == GAME_MODE_TIME_ATTACK || gGameMode == GAME_MODE_BOSS_TIME_ATTACK) - && gCourseTime > 36000)) { + && gCourseTime > MAX_COURSE_TIME)) { sub_801B6B4(); } else { gRingCount = 0; @@ -3888,9 +3956,9 @@ void PlayerCB_8025318(Player *p) mask = (MOVESTATE_800 | MOVESTATE_8 | MOVESTATE_IN_AIR); if ((p->moveState & mask) == MOVESTATE_800) { - sub_802A360(p); + Player_InitIceSlide(p); } else { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~(MOVESTATE_4 | MOVESTATE_IN_AIR); @@ -3914,7 +3982,7 @@ void PlayerCB_Idle(Player *p) PlayerCB_80273D0(p); } else if ((p->moveState & (MOVESTATE_800 | MOVESTATE_8 | MOVESTATE_IN_AIR)) == MOVESTATE_800) { - sub_802A360(p); + Player_InitIceSlide(p); } else if (!sub_802A0C8(p) && !sub_802A0FC(p) && !sub_8029E6C(p) && !sub_802A2A8(p)) { sub_802966C(p); @@ -4071,7 +4139,7 @@ void PlayerCB_8025A0C(Player *p) if ((p->moveState & (MOVESTATE_800 | MOVESTATE_8 | MOVESTATE_IN_AIR)) == MOVESTATE_800) { - sub_802A360(p); + Player_InitIceSlide(p); } else { p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; p->unk64 = 4; @@ -4091,7 +4159,7 @@ void PlayerCB_8025AB8(Player *p) PlayerCB_80273D0(p); } else if ((p->moveState & (MOVESTATE_800 | MOVESTATE_8 | MOVESTATE_IN_AIR)) == MOVESTATE_800) { - sub_802A360(p); + Player_InitIceSlide(p); } else { if (p->unk99[0] != 0) { p->unk99[0]--; @@ -4189,7 +4257,7 @@ void PlayerCB_Jump(Player *p) s32 jumpHeight; s32 accelX, accelY; - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_100 | MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -4266,7 +4334,7 @@ void PlayerCB_Jumping(Player *p) void PlayerCB_8025F84(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_100 | MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -4298,7 +4366,7 @@ void PlayerCB_8025F84(Player *p) void PlayerCB_8026060(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -4326,7 +4394,7 @@ void PlayerCB_8026060(Player *p) void PlayerCB_802611C(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -4574,7 +4642,7 @@ void sub_802669C(Player *p) void PlayerCB_8026764(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; p->moveState |= MOVESTATE_1000000; @@ -4655,7 +4723,7 @@ void PlayerCB_8026810(Player *p) void PlayerCB_80269C0(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; p->moveState &= ~(MOVESTATE_100 | MOVESTATE_IN_AIR); @@ -4677,7 +4745,7 @@ void PlayerCB_80269C0(Player *p) void PlayerCB_8026A4C(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; p->moveState |= (MOVESTATE_100 | MOVESTATE_IN_AIR); @@ -4783,20 +4851,14 @@ void PlayerCB_8026D2C(Player *p) PLAYERFN_UPDATE_POSITION(p); PLAYERFN_UPDATE_ROTATION(p); - if (p->speedAirY >= 0) { - sub_8022218(p); - sub_8022284(p); - } else { - sub_8022284(p); - sub_8022218(p); - } + sub_802A500_inline(p); PLAYERFN_MAYBE_TRANSITION_TO_GROUND_BASE(p); } void PlayerCB_8026E24(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_80000 | MOVESTATE_200 | MOVESTATE_4); @@ -4851,17 +4913,7 @@ void PlayerCB_8026F10(Player *p) { if ((p->moveState & (MOVESTATE_800 | MOVESTATE_8 | MOVESTATE_IN_AIR)) == MOVESTATE_800) { - sub_80218E4(p); - p->moveState &= ~MOVESTATE_4; - - PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14); - - p->unk64 = 62; - - p->moveState &= ~MOVESTATE_FACING_LEFT; - m4aSongNumStart(SE_ICE_PARADISE_SLIDE); - - PLAYERFN_SET_AND_CALL(PlayerCB_8026BCC, p); + Player_InitIceSlide_inline(p); } else { //_08026F74 p->unk90->s.unk10 &= ~SPRITE_FLAG_MASK_ANIM_OVER; @@ -4879,7 +4931,7 @@ void PlayerCB_8026F10(Player *p) void PlayerCB_8026FC8(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; @@ -4917,7 +4969,7 @@ void PlayerCB_8027040(Player *p) void PlayerCB_8027114(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); if ((!(p->moveState & MOVESTATE_4) || (p->unk64 != 4))) { p->unk64 = 47; @@ -5009,7 +5061,7 @@ void PlayerCB_8027250(Player *p) p->speedAirX >>= 1; } - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= MOVESTATE_IN_AIR; p->moveState &= ~(MOVESTATE_200 | MOVESTATE_8 | MOVESTATE_4); @@ -5042,7 +5094,7 @@ void PlayerCB_80273D0(Player *p) && (gSpecialRingCount >= SPECIAL_STAGE_REQUIRED_SP_RING_COUNT)) { sub_802A40C(p); } else { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~(MOVESTATE_4 | MOVESTATE_FACING_LEFT); @@ -5093,8 +5145,7 @@ void PlayerCB_GoalSlowdown(Player *p) if (p->speedGroundX <= 0) { sub_802785C(p); } else { - if (gCamera.shiftY > -56) - gCamera.shiftY--; + PlayerCB_CameraShift_inline(p); sub_80232D0(p); sub_8023260(p); @@ -5112,8 +5163,7 @@ void PlayerCB_GoalBrake(Player *p) { u16 cAnim = GET_CHARACTER_ANIM(p); - if (gCamera.shiftY > -56) - gCamera.shiftY--; + PlayerCB_CameraShift_inline(p); if (cAnim == SA2_CHAR_ANIM_31) { if ((p->variant == 0) && (p->unk90->s.unk10 & SPRITE_FLAG_MASK_ANIM_OVER)) { @@ -5167,8 +5217,7 @@ void PlayerCB_GoalBrake(Player *p) void sub_802785C(Player *p) { - if (gCamera.shiftY > -56) - gCamera.shiftY--; + PlayerCB_CameraShift_inline(p); p->unk72 = 90; @@ -5195,8 +5244,7 @@ void sub_802785C(Player *p) void PlayerCB_80278D4(Player *p) { - if (gCamera.shiftY > -56) - gCamera.shiftY--; + PlayerCB_CameraShift_inline(p); if (--p->unk72 == 0) { if (gGameMode == GAME_MODE_TIME_ATTACK) { @@ -5204,7 +5252,7 @@ void PlayerCB_80278D4(Player *p) } else { CreateStageResults(gCourseTime, gRingCount, gSpecialRingCount); } - PLAYERFN_SET(PlayerCB_802A3F0); + PLAYERFN_SET(PlayerCB_CameraShift); } sub_80232D0(p); @@ -5251,8 +5299,7 @@ void PlayerCB_80279F8(Player *p) PLAYERFN_UPDATE_UNK2A(p); - if (gCamera.shiftY > -56) - gCamera.shiftY--; + PlayerCB_CameraShift_inline(p); if (p->moveState & MOVESTATE_4000000) { p->unk5A = 1; @@ -5305,6 +5352,7 @@ void PlayerCB_8027C5C(Player *p) PLAYERFN_UPDATE_UNK2A(p); } +// Multiplayer-only void PlayerCB_8027D3C(Player *p) { s8 *someSio = gUnknown_030054B4; @@ -5361,7 +5409,7 @@ void PlayerCB_8027D3C(Player *p) p->unk72 = 0; p->unk5C = 0; - PLAYERFN_SET(PlayerCB_802A4FC); + PLAYERFN_SET(PlayerCB_Nop); } } @@ -5514,7 +5562,7 @@ void PlayerCB_80286F0(Player *p) u16 character = p->character; u8 mask = sTrickMasks[dir][character]; - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_2000 | MOVESTATE_100 | MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -5672,7 +5720,7 @@ void DoTrickIfButtonPressed(Player *p) void PlayerCB_8028D74(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= (MOVESTATE_100 | MOVESTATE_IN_AIR); p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20); @@ -5700,7 +5748,7 @@ void PlayerCB_TouchNormalSpring(Player *p) u8 r5 = (u6E >> 4); u8 r6 = u6E % 4; - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); if (((r5 == 2) || (r5 == 3)) && !(p->moveState & MOVESTATE_IN_AIR)) { p->moveState &= ~(MOVESTATE_100 | MOVESTATE_IN_AIR); @@ -5818,7 +5866,7 @@ void PlayerCB_8029074(Player *p) void PlayerCB_8029158(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= MOVESTATE_IN_AIR; p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20 | MOVESTATE_8); @@ -6749,7 +6797,7 @@ bool32 sub_802A2A8(Player *p) void PlayerCB_802A300(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState |= MOVESTATE_IN_AIR; p->moveState &= ~(MOVESTATE_1000000 | MOVESTATE_20 | MOVESTATE_8); @@ -6764,20 +6812,7 @@ void PlayerCB_802A300(Player *p) PLAYERFN_SET_AND_CALL(PlayerCB_802940C, p); } -void sub_802A360(Player *p) -{ - sub_80218E4(p); - p->moveState &= ~MOVESTATE_4; - - PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14); - - p->unk64 = 62; - p->moveState &= ~(MOVESTATE_FACING_LEFT); - - m4aSongNumStart(SE_ICE_PARADISE_SLIDE); - - PLAYERFN_SET_AND_CALL(PlayerCB_8026BCC, p); -} +void Player_InitIceSlide(Player *p) { Player_InitIceSlide_inline(p); } void PlayerCB_802A3B8(Player *p) { sub_802808C(p); } @@ -6789,15 +6824,11 @@ void PlayerCB_802A3C4(Player *p) PLAYERFN_SET(PlayerCB_8025A0C); } -void PlayerCB_802A3F0(Player *p) -{ - if (gCamera.shiftY > -56) - gCamera.shiftY--; -} +void PlayerCB_CameraShift(Player *p) { PlayerCB_CameraShift_inline(p); } void sub_802A40C(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14); @@ -6810,9 +6841,10 @@ void sub_802A40C(Player *p) PLAYERFN_SET_AND_CALL(PlayerCB_80279F8, p); } +// Boss-Stage-only void sub_802A468(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14); @@ -6823,9 +6855,10 @@ void sub_802A468(Player *p) PLAYERFN_SET_AND_CALL(PlayerCB_8027C5C, p); } +// Multiplayer-only void sub_802A4B8(Player *p) { - sub_80218E4(p); + Player_TransitionCancelFlyingAndBoost(p); p->moveState &= ~MOVESTATE_4; p->moveState |= MOVESTATE_IGNORE_INPUT; @@ -6834,18 +6867,9 @@ void sub_802A4B8(Player *p) PLAYERFN_SET_AND_CALL(PlayerCB_8027D3C, p); } -void PlayerCB_802A4FC(Player *p) { } +void PlayerCB_Nop(Player *p) { } -void sub_802A500(Player *p) -{ - if (p->speedAirY >= 0) { - sub_8022218(p); - sub_8022284(p); - } else { - sub_8022284(p); - sub_8022218(p); - } -} +void sub_802A500(Player *p) { sub_802A500_inline(p); } void sub_802A52C(Player *p) { PLAYERFN_MAYBE_TRANSITION_TO_GROUND_BASE(p); } diff --git a/src/game/stage/results.c b/src/game/stage/results.c index c6f74db5d..9ca6974cb 100644 --- a/src/game/stage/results.c +++ b/src/game/stage/results.c @@ -253,7 +253,7 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount) s->animCursor = 0; s->timeUntilNextFrame = 0; s->prevVariant = -1; - s->animSpeed = 0x10; + s->animSpeed = SPRITE_ANIM_SPEED(1.0); s->palId = 0; s->hitboxes[0].index = -1; s->unk10 = 0; @@ -548,16 +548,13 @@ void sub_80310F0(void) } } -// (90.87%) https://decomp.me/scratch/ju0GI -NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u16 p0)) +void sub_8031138(u16 p0) { StageResults *outro = TASK_DATA(gCurTask); u32 counter = outro->counter; u32 i; Sprite *s; - s32 bonusVal; - s16 xPos; - s16 r4; + s32 r4; if (counter < 24) { s32 x; @@ -568,14 +565,11 @@ NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u x = (16 - counter) * 24; } - x = x - p0; - for (i = 0; i < 8; i++) { - s->x = x + i * 32; + s->x = (x - p0) + i * 32; DisplaySprite(s); } } else { - // _08031198 s = &outro->s7; for (i = 0; i < 8; i++) { @@ -583,7 +577,6 @@ NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u DisplaySprite(s); } } - // _080311B2 if (counter > 28) { u32 numDisplayedBonuses = (ACT_INDEX(gCurrentLevel) == ACT_BOSS) ? 2 : 3; @@ -594,14 +587,13 @@ NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u DisplaySprite(s); } } - // _080311F4 if (counter >= 39) { - // Time Score + s = &outro->sprScores[0]; if (counter < 56) { - s32 innerX = DISPLAY_WIDTH - ((counter - 39) * 12); + u16 innerX = DISPLAY_WIDTH - ((counter - 39) * 12); r4 = innerX; } else { r4 = 48; @@ -609,31 +601,33 @@ NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u s->x = r4 - p0; DisplaySprite(s); - bonusVal = outro->timeBonusScore; - xPos = p0; - xPos -= 144; - StageUI_PrintIntegerAt(bonusVal, (r4 - xPos), OUTRO_TIME_BONUS_Y_POS, 0); + { + s16 r4_2 = r4; + s16 pp = p0; + StageUI_PrintIntegerAt(outro->timeBonusScore, r4_2 + 144 - pp, + OUTRO_TIME_BONUS_Y_POS, 0); + } } - // _0803124C if (counter >= 49) { - // Ring Score s = &outro->sprScores[1]; if (counter <= 65) { - r4 = DISPLAY_WIDTH - ((counter - 49) * 12); + u16 innerX = DISPLAY_WIDTH - ((counter - 49) * 12); + r4 = innerX; } else { r4 = 48; } s->x = r4 - p0; DisplaySprite(s); - bonusVal = outro->ringBonusScore; - xPos = p0; - xPos -= 144; - StageUI_PrintIntegerAt(bonusVal, (r4 - xPos), OUTRO_RING_BONUS_Y_POS, 0); + { + s16 r4_2 = r4; + s16 pp = p0; + StageUI_PrintIntegerAt(outro->ringBonusScore, r4_2 + 144 - pp, + OUTRO_RING_BONUS_Y_POS, 0); + } } - // _0803129C if ((ACT_INDEX(gCurrentLevel) != ACT_BOSS) && (gCurrentLevel < LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)) @@ -641,7 +635,7 @@ NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u s = &outro->sprScores[2]; if (counter <= 75) { - s32 innerX = DISPLAY_WIDTH - ((counter - 59) * 12); + u16 innerX = DISPLAY_WIDTH - ((counter - 59) * 12); r4 = innerX; } else { r4 = 48; @@ -650,13 +644,14 @@ NONMATCH("asm/non_matching/game/stage/outro/sub_8031138.inc", void sub_8031138(u s->x = r4 - p0; DisplaySprite(s); - bonusVal = outro->spRingBonusScore; - xPos = p0; - xPos -= 144; - StageUI_PrintIntegerAt(bonusVal, (r4 - xPos), OUTRO_SP_RING_BONUS_Y_POS, 0); + { + s16 r4_2 = r4; + s16 pp = p0; + StageUI_PrintIntegerAt(outro->spRingBonusScore, r4_2 + 144 - pp, + OUTRO_SP_RING_BONUS_Y_POS, 0); + } } } -END_NONMATCH void sub_8031314(void) { diff --git a/src/game/stage/screen_shake.c b/src/game/stage/screen_shake.c index 3cdf74352..eae13a599 100644 --- a/src/game/stage/screen_shake.c +++ b/src/game/stage/screen_shake.c @@ -33,7 +33,7 @@ void Task_ScreenShake(void) } else { struct Camera *cam = &gCamera; - if (shake->flags & 0x10) { + if (shake->flags & SCREENSHAKE_RANDOM_VALUE) { factor = ((u32)(PseudoRandom32() << 15) >> 23) - 0xFF; } else { factor = SIN_24_8(shake->unk14); @@ -41,22 +41,17 @@ void Task_ScreenShake(void) r2 = (shake->p0 * factor) >> 16; - switch (shake->flags & 0x3) { - case 1: { - if (r2 < 0) - r2 = -r2; + switch (shake->flags & SCREENSHAKE_FACTOR_MASK) { + case SCREENSHAKE_FACTOR_POSITIVE: { + r2 = +ABS(r2); } break; - case 2: { - s32 r2_2 = r2; - if (r2 < 0) - r2_2 = -r2; - - r2 = -r2_2; + case SCREENSHAKE_FACTOR_NEGATIVE: { + r2 = -ABS(r2); } break; } - if (!(shake->flags & 0x20) || !(gStageTime & 0x1)) { + if (!(shake->flags & 0x20) || ((gStageTime % 2u) == 0)) { if (shake->flags & SCREENSHAKE_HORIZONTAL) { cam->unk60 = r2; } diff --git a/src/platform/shared/stub.c b/src/platform/shared/stub.c index b0757c514..3d8b8d0bf 100644 --- a/src/platform/shared/stub.c +++ b/src/platform/shared/stub.c @@ -15,8 +15,6 @@ void *iwram_end = 0; char gNumMusicPlayers = 4; int gMaxLines = 0; -void sub_8004E14(Sprite *s, SpriteTransform *transform) { } - // collision u32 sub_800D0A0(Sprite *s, s16 x, s16 y, s16 param3, s16 param4, u8 param5, u32 param6) { @@ -26,39 +24,13 @@ u32 sub_800D0A0(Sprite *s, s16 x, s16 y, s16 param3, s16 param4, u8 param5, u32 // boss_5 void sub_802E784(u16 p0, u16 p1, u16 p2, s16 x, s16 y, s16 p5) { } -typedef struct { - u8 unk0[6]; - u8 unk6; - u8 unk7; - u8 filler8[6]; - u8 unkE; - u8 unkF; - u8 filler0[2]; - u8 unk12; - u8 unk13; - u8 filler1[6]; - u8 unk1A; - u8 unk1B; - u8 filler2[6]; - u8 unk22; - u8 unk23; - u8 filler3[10]; - u8 unk2E; - u8 unk2F; - u8 unk[6]; - u8 unk36; - u8 unk37; - u16 unk38; - u8 unk3A; - u8 unk3B; -} UNK_80D8710; - extern void sub_8048C7C(void *boss); // boss run const u16 gUnknown_080D87E6[][2] = { { 0, 0 } }; void sub_80499D8(void) {}; void sub_8049D1C(void) {}; +void sub_8049D20(void *vramTiles, void *boss) { } // boss_9 const s16 gUnknown_080D8A94[4] = { 0 }; @@ -86,23 +58,7 @@ void sub_8083B88(struct UNK_8085F1C_1 *p0, struct UNK_8085F1C_1 *p1, void sub_8084B54(struct UNK_8085F1C_1 *p0, u16 p1, u16 p2, u16 p3) { } // TEMP -void CreateSuperEggRoboZ(void) { } void RealClearChain(void) { } void SoundMainBTM(void) { } double sqrt(double v) { return 0; } float atan2f(float a, float b) { return 0; } - -// #ifdef WIN32 -// void *memset(void *_dst, int value, unsigned int size) -// { -// u8 *dst = (u8 *)_dst; -// u8 *end = dst + size; - -// while (dst < end) { -// *dst = value; -// dst++; -// } - -// return dst; -// } -// #endif diff --git a/src/sakit/collision_1.c b/src/sakit/collision_1.c index 9c7a6b3c9..8a1ae9f16 100644 --- a/src/sakit/collision_1.c +++ b/src/sakit/collision_1.c @@ -21,7 +21,7 @@ u32 sub_800DA4C(Sprite *opponent, s16 oppX, s16 oppY, UNUSED s32 param3, UNUSED s32 param4, u8 layer) { - MultiplayerPlayer *mpPlayer; + MultiplayerPlayer *mpp; Sprite *mpPlayerSprite; u32 res2; u32 result = COLL_NONE; @@ -35,8 +35,8 @@ u32 sub_800DA4C(Sprite *opponent, s16 oppX, s16 oppY, UNUSED s32 param3, return COLL_NONE; } - mpPlayer = TASK_DATA(gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]); - mpPlayerSprite = &mpPlayer->s; + mpp = TASK_DATA(gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]); + mpPlayerSprite = &mpp->s; if (layer != p->unk38) { return COLL_NONE; @@ -45,8 +45,8 @@ u32 sub_800DA4C(Sprite *opponent, s16 oppX, s16 oppY, UNUSED s32 param3, if ((p->speedAirX == 0 && p->speedAirY == 0) && HITBOX_IS_ACTIVE(opponent->hitboxes[1])) { - if (HB_COLLISION(oppX, oppY, opponent->hitboxes[1], mpPlayer->unk50, - mpPlayer->unk52, mpPlayerSprite->hitboxes[0])) { + if (HB_COLLISION(oppX, oppY, opponent->hitboxes[1], mpp->pos.x, mpp->pos.y, + mpPlayerSprite->hitboxes[0])) { // _0800DB68 result |= COLL_FLAG_2; } @@ -54,17 +54,17 @@ u32 sub_800DA4C(Sprite *opponent, s16 oppX, s16 oppY, UNUSED s32 param3, // _0800DB70 if (HITBOX_IS_ACTIVE(mpPlayerSprite->hitboxes[1]) && HITBOX_IS_ACTIVE(opponent->hitboxes[0]) - && HB_COLLISION(oppX, oppY, opponent->hitboxes[0], mpPlayer->unk50, - mpPlayer->unk52, mpPlayerSprite->hitboxes[1])) { + && HB_COLLISION(oppX, oppY, opponent->hitboxes[0], mpp->pos.x, mpp->pos.y, + mpPlayerSprite->hitboxes[1])) { // _0800DC34 - if (mpPlayer->unk50 > oppX) { + if (mpp->pos.x > oppX) { result |= COLL_FLAG_40000; } else { result |= COLL_FLAG_20000; } // _0800DC66 - if (mpPlayer->unk52 > oppY) { + if (mpp->pos.y > oppY) { result |= COLL_FLAG_10000; } else { result |= COLL_FLAG_100000; @@ -73,8 +73,8 @@ u32 sub_800DA4C(Sprite *opponent, s16 oppX, s16 oppY, UNUSED s32 param3, result |= COLL_FLAG_1; } else if (HITBOX_IS_ACTIVE(mpPlayerSprite->hitboxes[0]) && HITBOX_IS_ACTIVE(opponent->hitboxes[1]) - && HB_COLLISION(oppX, oppY, opponent->hitboxes[1], mpPlayer->unk50, - mpPlayer->unk52, mpPlayerSprite->hitboxes[0])) { + && HB_COLLISION(oppX, oppY, opponent->hitboxes[1], mpp->pos.x, mpp->pos.y, + mpPlayerSprite->hitboxes[0])) { result |= COLL_FLAG_2; } diff --git a/src/sakit/input_buffer_1.c b/src/sakit/input_buffer_1.c deleted file mode 100644 index 8ff57564c..000000000 --- a/src/sakit/input_buffer_1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "global.h" -#include "sakit/globals.h" -#include "sakit/input_buffer.h" -#include "sakit/player.h" - -#include "constants/characters.h" - -/* TODO: Merge this file with input_buffer.c once sub_800DF8C matches */ diff --git a/src/sakit/item_box.c b/src/sakit/item_box.c index 6cc0a7860..334278739 100644 --- a/src/sakit/item_box.c +++ b/src/sakit/item_box.c @@ -292,8 +292,8 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox) continue; mpp = TASK_DATA(gMultiplayerPlayerTasks[playerId]); - boxToPlayerX = SQUARE(I(gPlayer.x) - mpp->unk50); - boxToPlayerY = SQUARE(I(gPlayer.y) - mpp->unk52); + boxToPlayerX = SQUARE(I(gPlayer.x) - mpp->pos.x); + boxToPlayerY = SQUARE(I(gPlayer.y) - mpp->pos.y); boxToPlayerMagnitude = boxToPlayerX + boxToPlayerY; if (smallestMagnitude < boxToPlayerMagnitude) { diff --git a/src/sakit/rings_manager.c b/src/sakit/rings_manager.c index 35ede8630..711a7a262 100644 --- a/src/sakit/rings_manager.c +++ b/src/sakit/rings_manager.c @@ -289,22 +289,22 @@ NONMATCH("asm/non_matching/game/stage/Task_RingsMgrMain.inc", if ((i == playerId) && (gMultiplayerPlayerTasks[i] != NULL)) { // _08008258 - MultiplayerPlayer *mpPlayer = TASK_DATA(gMultiplayerPlayerTasks[i]); - s16 px, py = mpPlayer->unk52; + MultiplayerPlayer *mpp = TASK_DATA(gMultiplayerPlayerTasks[i]); + s16 px, py = mpp->pos.y; s32 hbBottom, hbLeft, hbRight; sl = Q(py + s->hitboxes[0].top); hbBottom = Q(py + s->hitboxes[0].bottom); while ((sl <= ((hbBottom + 8) >> 8)) && ((unsigned)sl < regions_y)) { // _080082E2 - // sp28 = mpPlayer->unk50; - // sp2C = mpPlayer->s.hitboxes[0].left; - // sp48 = mpPlayer->s.hitboxes[0].right; - px = mpPlayer->unk50; - sb = Q(px + mpPlayer->s.hitboxes[0].left - 8); + // sp28 = mpp->pos.x; + // sp2C = mpp->s.hitboxes[0].left; + // sp48 = mpp->s.hitboxes[0].right; + px = mpp->pos.x; + sb = Q(px + mpp->s.hitboxes[0].left - 8); - hbRight = Q((px + mpPlayer->s.hitboxes[0].right) + 16); - // hbLeft = Q((px + mpPlayer->s.hitboxes[0].left) + 16); + hbRight = Q((px + mpp->s.hitboxes[0].right) + 16); + // hbLeft = Q((px + mpp->s.hitboxes[0].left) + 16); while (((sb << 8) < (gCamera.x + DISPLAY_WIDTH)) && (sb < regions_x)) { @@ -326,22 +326,18 @@ NONMATCH("asm/non_matching/game/stage/Task_RingsMgrMain.inc", s32 ry = TO_WORLD_POS(meRing->y, sl); if ((((rx - 8) - <= (mpPlayer->unk50 - + mpPlayer->s.hitboxes[0].left)) - && ((rx + 8) - > mpPlayer->s.hitboxes[0].right)) - && (((ry - 8) - >= (mpPlayer->unk52 - + mpPlayer->s.hitboxes[0].top)) - && ((rx + 8) <= mpPlayer->s.hitboxes[0] - .bottom))) { + <= (mpp->pos.x + mpp->s.hitboxes[0].left)) + && ((rx + 8) > mpp->s.hitboxes[0].right)) + && (((ry - 8) >= (mpp->pos.y + + mpp->s.hitboxes[0].top)) + && ((rx + 8) + <= mpp->s.hitboxes[0].bottom))) { u8 anim = rm->s.graphics.anim - gPlayerCharacterIdleAnims - [gMultiplayerCharacters - [mpPlayer->unk56]]; + [gMultiplayerCharacters[mpp->unk56]]; if ((anim != SA2_CHAR_ANIM_28 && anim != SA2_CHAR_ANIM_29) - || !(mpPlayer->unk54 & 0x4)) { + || !(mpp->unk54 & 0x4)) { CreateCollectRingEffect(rx, ry); meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; diff --git a/src/sprite.c b/src/sprite.c new file mode 100644 index 000000000..1ca18c569 --- /dev/null +++ b/src/sprite.c @@ -0,0 +1,982 @@ +#include +#include "global.h" +#include "core.h" +#include "flags.h" +#include "sprite.h" +#include "trig.h" +#include "lib/m4a.h" +#include "data/sprite_data.h" +#include "animation_commands.h" + +extern const AnimationCommandFunc animCmdTable[]; + +#define ReadInstruction(script, cursor) ((void *)(script) + (cursor * sizeof(s32))) + +static AnimCmdResult animCmd_GetTiles(void *cursor, Sprite *s); +static AnimCmdResult animCmd_GetPalette(void *cursor, Sprite *s); +static AnimCmdResult animCmd_JumpBack(void *cursor, Sprite *s); +static AnimCmdResult animCmd_End(void *cursor, Sprite *s); +static AnimCmdResult animCmd_PlaySoundEffect(void *cursor, Sprite *s); +static AnimCmdResult animCmd_AddHitbox(void *cursor, Sprite *s); +static AnimCmdResult animCmd_TranslateSprite(void *cursor, Sprite *s); +static AnimCmdResult animCmd_8(void *cursor, Sprite *s); +static AnimCmdResult animCmd_SetIdAndVariant(void *cursor, Sprite *s); +static AnimCmdResult animCmd_10(void *cursor, Sprite *s); +static AnimCmdResult animCmd_SetSpritePriority(void *cursor, Sprite *s); +static AnimCmdResult animCmd_SetOamOrder(void *cursor, Sprite *s); + +static const u8 unkFractions[8] = { + /* 0x00 */ I(Q(0.5 * 2)), + /* 0x01 */ I(Q(0.0 * 2)), + /* 0x02 */ I(Q(1.0 * 2)), + /* 0x03 */ I(Q(1.5 * 2)), + /* 0x04 */ I(Q(3.0 * 2)), + /* 0x05 */ I(Q(3.5 * 2)), + /* 0x06 */ I(Q(2.5 * 2)), + /* 0x07 */ I(Q(2.0 * 2)), +}; + +// TODO: Make static +const AnimationCommandFunc animCmdTable[] = { + // 0x080984AC + animCmd_GetTiles, animCmd_GetPalette, + animCmd_JumpBack, animCmd_End, + animCmd_PlaySoundEffect, animCmd_AddHitbox, + animCmd_TranslateSprite, animCmd_8, + animCmd_SetIdAndVariant, animCmd_10, + animCmd_SetSpritePriority, animCmd_SetOamOrder, +}; + +const u8 gOamShapesSizes[12][2] = { + // Square + { 8, 8 }, + { 16, 16 }, + { 32, 32 }, + { 64, 64 }, + + // Horizontal + { 16, 8 }, + { 32, 8 }, + { 32, 16 }, + { 64, 32 }, + + // Vertical + { 8, 16 }, + { 8, 32 }, + { 16, 32 }, + { 32, 64 }, +}; + +// This function gets called as long as an enemy is on-screen. +// Potentially something to do with collision/distance? +// +// Vector-to-rotation(0-1023) ? +s16 sub_8004418(s16 x, s16 y) +{ + s16 fraction; + s32 result; + u8 index = 0; + u8 array[8]; + memcpy(array, unkFractions, sizeof(array)); + + if ((x | y) == 0) { + result = -1; + } else { + if (x <= 0) { + x = -x; + index = 4; + } + if (y <= 0) { + y = -y; + index += 2; + } + if (x >= y) { + // fraction = y*0.5 / x + y *= Q(0.5); + + if (x == 0) { + fraction = y; + } else { + fraction = y / x; + } + } else { + index += 1; + + x *= Q(0.5); + + if (y == 0) { + fraction = x; + } else { + fraction = x / y; + } + } + + if (array[index] & 0x01) { + fraction = Q(0.5) - fraction; + } + + { + s32 val = array[index] * Q(0.5); + fraction += val; + result = ((u32)(fraction << 22) >> 22); + } + } + + return result; +} + +void numToTileIndices(u8 *digits, u16 number) +{ + u8 i; + + for (i = 0; i < 4; number <<= 4, i++) { + u16 value = ((number & 0xF000) >> 12); + if (value > 9) { + digits[i] = value + 87; + } else { + digits[i] = value + '0'; + } + } + + digits[i] = 0; +} + +// This function takes a 16bit decimal number +// and returns a 32bit number which, viewed as hex, +// will contain the input number's digits in the lower 5 nibbles. +// Base10DigitsToHexNibbles(12345) -> 0x00012345 +u32 Base10DigitsToHexNibbles(u16 num) +{ + u8 i; + u16 result; + u8 lowDigit; + u16 remainder = num; + + result = 0; + for (i = 0; i < 4; i++) { + s32 divisor = Div(remainder, 10); + lowDigit = remainder - (divisor * 10); + remainder = divisor; + + result |= lowDigit << (i * 4); + } + + return result; +} + +AnimCmdResult UpdateSpriteAnimation(Sprite *s) +{ + SPRITE_MAYBE_SWITCH_ANIM(s); + + if (s->unk10 & SPRITE_FLAG_MASK_ANIM_OVER) + return 0; + + if (s->timeUntilNextFrame > 0) + s->timeUntilNextFrame -= s->animSpeed * 16; + else { + /* Call all commands for the new frame */ + s32 ret; + const ACmd *cmd; + const ACmd *script; + const ACmd **variants; + + // Handle all the "regular" Animation commands with an ID < 0 + variants = gRefSpriteTables->animations[s->graphics.anim]; + script = variants[s->variant]; + cmd = ReadInstruction(script, s->animCursor); + while (cmd->id < 0) { + // TODO: make this const void* + ret = animCmdTable[~cmd->id]((void *)cmd, s); + if (ret != ACMD_RESULT__RUNNING) { +#ifndef NON_MATCHING + register const ACmd *newScript asm("r2"); +#else + const ACmd *newScript; +#endif + if (ret != ACMD_RESULT__ANIM_CHANGED) { + return ret; + } + + // animation has changed + variants = gRefSpriteTables->animations[s->graphics.anim]; + newScript = variants[s->variant]; + + // reset cursor + s->animCursor = 0; + + // load the new script + script = newScript; + } + cmd = ReadInstruction(script, s->animCursor); + } + + // Display the image 'index' for 'delay' frames + s->timeUntilNextFrame += Q_8_8(((ACmd_ShowFrame *)cmd)->delay); + s->timeUntilNextFrame -= s->animSpeed * 16; + { + s32 frame = ((ACmd_ShowFrame *)cmd)->index; + if (frame != -1) { + const struct SpriteTables *sprTables = gRefSpriteTables; + + s->dimensions = &sprTables->dimensions[s->graphics.anim][frame]; + } else { + s->dimensions = (void *)-1; + } + } + + s->animCursor += 2; + } + return 1; +} + +// (-1) +static AnimCmdResult animCmd_GetTiles(void *cursor, Sprite *s) +{ + ACmd_GetTiles *cmd = (ACmd_GetTiles *)cursor; + s->animCursor += AnimCommandSizeInWords(ACmd_GetTiles); + + if ((s->unk10 & SPRITE_FLAG_MASK_19) == 0) { + if (cmd->tileIndex < 0) { + s->graphics.src + = &gRefSpriteTables->tiles_8bpp[cmd->tileIndex * TILE_SIZE_8BPP]; + s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_8BPP; + } else { + s->graphics.src + = &gRefSpriteTables->tiles_4bpp[cmd->tileIndex * TILE_SIZE_4BPP]; + s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_4BPP; + } + + gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &s->graphics; + gVramGraphicsCopyQueueIndex + = (gVramGraphicsCopyQueueIndex + 1) % ARRAY_COUNT(gVramGraphicsCopyQueue); + } + + return 1; +} + +// (-6) +static AnimCmdResult animCmd_AddHitbox(void *cursor, Sprite *s) +{ + ACmd_Hitbox *cmd = (ACmd_Hitbox *)cursor; + s32 hitboxId = cmd->hitbox.index % 16u; + s->animCursor += AnimCommandSizeInWords(ACmd_Hitbox); + + DmaCopy32(3, &cmd->hitbox, &s->hitboxes[hitboxId].index, 8); + + if ((cmd->hitbox.left == 0) && (cmd->hitbox.top == 0) && (cmd->hitbox.right == 0) + && (cmd->hitbox.bottom == 0)) { + s->hitboxes[hitboxId].index = -1; + } else { + if (s->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { + SWAP_AND_NEGATE(s->hitboxes[hitboxId].top, s->hitboxes[hitboxId].bottom); + } + + if (s->unk10 & SPRITE_FLAG_MASK_X_FLIP) { + SWAP_AND_NEGATE(s->hitboxes[hitboxId].left, s->hitboxes[hitboxId].right); + } + } + + return 1; +} + +void sub_80047A0(u16 angle, s16 p1, s16 p2, u16 affineIndex) +{ + u16 *affine = &gOamBuffer[affineIndex * 4].all.affineParam; + s16 res; + + res = Div(0x10000, p1); + affine[0] = I(COS_24_8(angle) * res); + + res = Div(0x10000, p1); + affine[4] = I(SIN_24_8(angle) * res); + + res = Div(0x10000, p2); + affine[8] = I((-(SIN(angle)) >> 6) * res); + + res = Div(0x10000, p2); + affine[12] = I(COS_24_8(angle) * res); +} + +// Similar to sub_8004ABC and sub_8004E14 +// (53.42%) https://decomp.me/scratch/llwGy +// (56.74%) https://decomp.me/scratch/rXgtp +NONMATCH("asm/non_matching/engine/sub_8004860.inc", + void sub_8004860(Sprite *s, SpriteTransform *transform)) +{ + // sp24 = s + UnkSpriteStruct big; + const SpriteOffset *dimensions = s->dimensions; + + if (dimensions != (SpriteOffset *)-1) { + s16 res; + u16 *affine; + big.affineIndex = s->unk10 % 32u; + affine = &gOamBuffer[big.affineIndex * 4].all.affineParam; + +#if 01 + sub_80047A0(transform->rotation & ONE_CYCLE, transform->width, transform->height, + big.affineIndex); +#else + big.qDirX = COS_24_8(transform->rotation & ONE_CYCLE); + big.qDirY = SIN_24_8(transform->rotation & ONE_CYCLE); + + big.unkC[0] = transform->width; + big.unkC[1] = transform->height; + + res = Div(0x10000, big.unkC[0]); + affine[0] = Q_8_8_TO_INT(((big.qDirX << 16) >> 16) * res); + + res = Div(0x10000, big.unkC[0]); + affine[4] = I(big.qDirY * res); + + res = Div(0x10000, big.unkC[1]); + affine[8] = I(-big.qDirX * res); + + res = Div(0x10000, big.unkC[1]); + affine[12] = I(big.qDirY * res); +#endif + + if (transform->height < 0) + big.unkC[0] = -transform->height; + + if (transform->width < 0) + big.unkC[1] = -transform->width; + + // _0800497A + big.unk0[0] = I(big.qDirX * big.unkC[0]); + big.unk0[1] = I(-big.qDirY * big.unkC[0]); + big.unk0[2] = I(big.qDirY * big.unkC[1]); + big.unk0[3] = I(big.unkC[0] * big.unkC[1]); + + big.unk18[0][0] = 0x100; + big.unk18[0][1] = 0; + big.unk18[1][0] = 0; + big.unk18[1][1] = 0x100; + + big.posX = transform->x; + big.posY = transform->y; + + // _08004A20 + { + s32 r0; + s16 r1_16; + s32 r1; + s32 r2; + s16 r4; + s16 r3; + u32 r5; + + if (transform->width > 0) { + r4 = (u16)dimensions->offsetX; + r2 = dimensions->width; + } else { + s32 w = dimensions->width; + r4 = w - (u16)dimensions->offsetX; + r2 = w; + } + + // _08004A2E + r3 = transform->height; + + if (r3 > 0) { + r3 = (u16)dimensions->offsetY; + r5 = dimensions->height; + } else { + // _08004A3E + s32 h = dimensions->height; + r3 = h - (u16)dimensions->offsetY; + r5 = h; + } + + // _08004A4C + r1_16 = big.unk0[0] * (r4 - dimensions->width / 2); + r0 = big.unk0[1] * (r3 - dimensions->height / 2); + r1_16 += r0; + r1_16 = r1_16 + (r2 << 8); + big.posX -= (r1_16 >> 8); + + // __080004A7E + r1 = big.unk0[2]; + r1 *= r4; + r0 = big.unkC[0]; + r0 *= r3; + r1 += r0; + r1 += Q(r5); + r1 >>= 8; + + big.posY -= r1; + + s->x = big.posX; + s->y = big.posY; + } + } +} +END_NONMATCH + +// (0.00%) +NONMATCH("asm/non_matching/engine/unused_transform.inc", + void UnusedTransform(Sprite *sprite, SpriteTransform *transform)) +{ + // TODO +} +END_NONMATCH + +// VERY similar to sub_8004860 and sub_8004ABC +// (41.14%) https://decomp.me/scratch/n3NXz +NONMATCH("asm/non_matching/engine/sub_8004E14.inc", + void sub_8004E14(Sprite *sprite, SpriteTransform *transform)) +{ + UnkSpriteStruct us; + if (sprite->dimensions != (void *)-1) { + const SpriteOffset *sprDims = sprite->dimensions; + u16 *affine; + + us.affineIndex = sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE; + affine = (u16 *)&gOamBuffer[us.affineIndex * 4 + 3]; + + us.qDirX = COS_24_8((transform->rotation + gUnknown_03001944) & ONE_CYCLE); + us.qDirY = SIN_24_8((transform->rotation + gUnknown_03001944) & ONE_CYCLE); + us.unkC[0] = I(transform->width * gUnknown_030017F0); + us.unkC[1] = I(transform->height * gUnknown_03005394); + + affine[0] = I(Div(Q(256), us.unkC[0]) * us.qDirX); + affine[4] = I(Div(Q(256), us.unkC[0]) * us.qDirY); + affine[8] = I(Div(Q(256), us.unkC[1]) * -us.qDirY); + affine[12] = I(Div(Q(256), us.unkC[1]) * us.qDirX); + + if (transform->width < 0) { + us.unkC[0] = I(-transform->width * gUnknown_030017F0); + } + // _08004F48 + + if (transform->height < 0) { + us.unkC[1] = I(-transform->height * gUnknown_03005394); + } + // _08004F6A + + us.unk0[0] = I(+us.qDirX * us.unkC[0]); + us.unk0[1] = I(-us.qDirY * us.unkC[0]); + us.unk0[2] = I(+us.qDirY * us.unkC[1]); + us.unk0[3] = I(+us.qDirX * us.unkC[1]); + + // 2D Rotation matrix: + // { +cos(a), -sin(a) } + // { +sin(a), +cos(a) } + us.unk18[0][0] = I((Q(+COS_24_8(gUnknown_03001944) * gUnknown_030017F0) >> 16) + * (Q(us.unkC[0] * gUnknown_03005398) >> 16)); + us.unk18[0][1] = I((Q(-SIN_24_8(gUnknown_03001944) * gUnknown_030017F0) >> 16) + * (Q(us.unkC[0] * gUnknown_03005398) >> 16)); + us.unk18[1][0] = I((Q(+SIN_24_8(gUnknown_03001944) * gUnknown_03005394) >> 16) + * (Q(us.unkC[1] * gUnknown_03005398) >> 16)); + us.unk18[1][1] = I((Q(+COS_24_8(gUnknown_03001944) * gUnknown_03005394) >> 16) + * (Q(us.unkC[1] * gUnknown_03005398) >> 16)); + + us.posX = I(transform->x * us.unk18[0][0] + transform->y * us.unk18[0][1] + + Q(gUnknown_0300194C)); + us.posY = I(transform->x * us.unk18[1][0] + transform->y * us.unk18[1][1] + + Q(gUnknown_03002820)); + + { + u16 width, height; + u16 halfWidth, halfHeight; + s16 offsetX, offsetY; + s32 x, y; + + if (transform->width > 0) { + offsetX = sprDims->offsetX; + width = sprDims->width; + } else { + offsetX = sprDims->width - sprDims->offsetX; + width = sprDims->width; + } + // _0800515A + + if (transform->height > 0) { + offsetY = sprDims->offsetY; + height = sprDims->height; + } else { + offsetY = sprDims->height - sprDims->offsetY; + height = sprDims->height; + } + // _0800517A + + halfWidth = width / 2; + offsetX -= halfWidth; + x = offsetX * us.unk0[0]; + + halfHeight = height / 2; + offsetY -= halfHeight; + x += offsetY * us.unk0[1]; + x = (x + Q(halfWidth)); + us.posX -= I(x); + + y = offsetX * us.unk0[2]; + y += offsetY * us.unk0[3]; + y = (y + Q(halfHeight)); + us.posY -= I(y); + + sprite->x = us.posX; + sprite->y = us.posY; + } + } +} +END_NONMATCH + +void DisplaySprite(Sprite *sprite) +{ + OamData *oam; + s32 x, y, sprWidth, sprHeight; + u8 i; + u32 r5, r7; + const u16 *oamData; + + if (sprite->dimensions != (void *)-1) { + const SpriteOffset *sprDims = sprite->dimensions; + + sprite->numSubFrames = sprDims->numSubframes; + x = sprite->x; + y = sprite->y; + + if (sprite->unk10 & SPRITE_FLAG_MASK_17) { + x -= gUnknown_030017F4[0]; + y -= gUnknown_030017F4[1]; + } + + sprWidth = sprDims->width; + sprHeight = sprDims->height; + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { + x -= sprDims->width / 2; + y -= sprDims->height / 2; + sprWidth *= 2; + sprHeight *= 2; + } + } else { + if (sprite->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { + y -= sprHeight - sprDims->offsetY; + } else { + y -= sprDims->offsetY; + } + + if (sprite->unk10 & SPRITE_FLAG_MASK_X_FLIP) { + x -= sprWidth - sprDims->offsetX; + } else { + x -= sprDims->offsetX; + } + } + + if (x + sprWidth >= 0 && x <= DISPLAY_WIDTH && // fmt + y + sprHeight >= 0 && y <= DISPLAY_HEIGHT) { + u8 unk6D0 = gMosaicReg >> 8; + + for (i = 0; i < sprDims->numSubframes; i++) { + oamData = gRefSpriteTables->oamData[sprite->graphics.anim]; + + // oam gets zero-initialized(?) + oam = OamMalloc(GET_SPRITE_OAM_ORDER(sprite)); + if (iwram_end == oam) { + return; + } + + if (i == 0) { + sprite->oamBaseIndex = gOamFreeIndex - 1; + } + + // oamIndex is a byte, why are they ANDing with 0x3FFF? + DmaCopy16(3, &oamData[3 * ((sprDims->oamIndex & 0x3FFF) + i)], oam, 6); + r7 = oam->all.attr1 & 0x1FF; + r5 = oam->all.attr0 & 0xFF; + oam->all.attr1 &= 0xFE00; + oam->all.attr0 &= 0xFE00; + + oam->all.attr2 += sprite->palId << 12; + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { + oam->all.attr0 |= 0x100; + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { + oam->all.attr0 |= 0x200; + } + oam->all.attr1 |= (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE) << 9; + } else { + u32 shapeAndSize = ((oam->all.attr0 & 0xC000) >> 12); + u32 flipY; + u32 r6; + + shapeAndSize |= ((oam->all.attr1 & 0xC000) >> 14); + flipY = sprite->unk10 >> SPRITE_FLAG_SHIFT_Y_FLIP; + r6 = 1; + + // y-flip + if ((((sprDims->flip >> 1) ^ flipY) & r6) != 0) { + oam->all.attr1 ^= 0x2000; + r5 = sprHeight - gOamShapesSizes[shapeAndSize][1] - r5; + } + + // x-flip + if (((sprite->unk10 >> SPRITE_FLAG_SHIFT_X_FLIP) & r6) + != (sprDims->flip & 1)) { + oam->all.attr1 ^= 0x1000; + r7 = sprWidth - gOamShapesSizes[shapeAndSize][0] - r7; + } + } + + if (unk6D0 != 0 && (sprite->unk10 & SPRITE_FLAG_MASK_MOSAIC) != 0) { + oam->all.attr0 |= 0x1000; + } + + oam->all.attr0 |= (sprite->unk10 & SPRITE_FLAG_MASK_OBJ_MODE) * 8; + oam->all.attr2 |= (sprite->unk10 & SPRITE_FLAG_MASK_PRIORITY) >> 2; + oam->all.attr0 += ((y + r5) & 0xFF); + oam->all.attr1 += ((x + r7) & 0x1FF); + + if (oam->all.attr0 & (ST_OAM_8BPP << 13)) { + oam->all.attr2 += oam->all.attr2 & 0x3FF; + } + oam->all.attr2 += GET_TILE_NUM(sprite->graphics.dest); + } + } + } +} + +void sub_081569A0(Sprite *sprite, u16 *sp08, u8 sp0C) +{ + vs32 x, y; + s32 sprWidth, sprHeight; + u8 sp18, i; + u32 x1, y1, sp24, sp28; + + if (sprite->dimensions != (void *)-1) { + const SpriteOffset *sprDims = sprite->dimensions; + + sprite->numSubFrames = sprDims->numSubframes; + x = sprite->x; + y = sprite->y; + + if (sprite->unk10 & SPRITE_FLAG_MASK_17) { + x -= gUnknown_030017F4[0]; + y -= gUnknown_030017F4[1]; + } + + sprWidth = sprDims->width; + sprHeight = sprDims->height; + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { + x -= sprDims->width / 2; + y -= sprDims->height / 2; + sprWidth *= 2; + sprHeight *= 2; + } + } else { + if (sprite->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { + y -= sprHeight - sprDims->offsetY; + } else { + y -= sprDims->offsetY; + } + + if (sprite->unk10 & SPRITE_FLAG_MASK_X_FLIP) { + x -= sprWidth - sprDims->offsetX; + } else { + x -= sprDims->offsetX; + } + } + + sp24 = x - sprite->x; + sp28 = y - sprite->y; + if (x + sprWidth >= 0 && x <= 240 && y + sprHeight >= 0 && y <= 160) { + for (sp18 = 0; sp18 < sprDims->numSubframes; ++sp18) { + const u16 *oamData = gRefSpriteTables->oamData[sprite->graphics.anim]; + OamData *oam = OamMalloc(GET_SPRITE_OAM_ORDER(sprite)); + + if (iwram_end == oam) { + return; + } + + DmaCopy16(3, &oamData[3 * ((sprDims->oamIndex & 0x3FFF) + sp18)], oam, + 6); // excluding affine params + x1 = oam->all.attr1 & 0x1FF; + y1 = oam->all.attr0 & 0xFF; + oam->all.attr1 &= 0xFE00; + oam->all.attr0 &= 0xFE00; + oam->all.attr2 += sprite->palId << 12; + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { + oam->all.attr0 |= 0x100; + if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { + oam->all.attr0 |= 0x200; + } + oam->all.attr1 |= (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE) << 9; + } else { + u32 shapeAndSize = ((oam->all.attr0 & 0xC000) >> 12); + u32 flipY; + u32 r6; + + shapeAndSize |= ((oam->all.attr1 & 0xC000) >> 14); + flipY = sprite->unk10 >> 11; + r6 = 1; + + // y-flip + if ((((sprDims->flip >> 1) ^ flipY) & r6) != 0) { + oam->all.attr1 ^= 0x2000; + y1 = sprHeight - gOamShapesSizes[shapeAndSize][1] - y1; + } + + // x-flip + if (((sprite->unk10 >> 10) & r6) != (sprDims->flip & 1)) { + oam->all.attr1 ^= 0x1000; + x1 = sprWidth - gOamShapesSizes[shapeAndSize][0] - x1; + } + } + + oam->all.attr0 |= (sprite->unk10 & SPRITE_FLAG_MASK_OBJ_MODE) * 8; + oam->all.attr2 |= (sprite->unk10 & SPRITE_FLAG_MASK_PRIORITY) >> 2; + oam->all.attr0 += ((y + y1) & 0xFF); + oam->all.attr1 += ((x + x1) & 0x1FF); + + if (oam->all.attr0 & (ST_OAM_8BPP << 13)) { + oam->all.attr2 += oam->all.attr2 & 0x3FF; + } + oam->all.attr2 += GET_TILE_NUM(sprite->graphics.dest); + + for (i = 0; i < sp0C; ++i) { + OamData *r5 = OamMalloc(GET_SPRITE_OAM_ORDER(sprite)); + + if (iwram_end == oam) + return; + DmaCopy16(3, oam, r5, 6); + r5->all.attr1 &= 0xFE00; + r5->all.attr0 &= 0xFF00; + r5->all.attr0 += (sp08[2 * i + 1] + sp28 + y1) & 0xFF; + r5->all.attr1 += (sp08[2 * i + 0] + sp24 + x1) & 0x1FF; + } + } + } + } +} + +// The parameter to this determines the order this sprite is expected to be drawn at. +// +// If you have created n Sprite instances, and you want them to be drawn in a certain +// order, you'd set their OAM order value (inside Sprite.unk1A) accordingly. +// A higher value gets drawn first +// (Higher order value == Higher Priority -> Drawn first). +// This only applies if these sprites all have the same priority value (0-3) in OAM. +// For OAM priority values the same rule (Higher value == Higher Priority) applies. +// +// This behavior is used by the Pause Menu, whereby all existing OAM values get put to +// the end of the OAM buffer, while the pause menu itself gets put to the beginning. +OamData *OamMalloc(u8 order) +{ + OamData *result; + + if (order > 31) { + order = 31; + } + + if (gOamFreeIndex > OAM_ENTRY_COUNT - 1) { + result = (OamData *)iwram_end; + } else { + if (gUnknown_03001850[order] == 0xFF) { + gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF; + gUnknown_03001850[order] = gOamFreeIndex; + gUnknown_03004D60[order] = gOamFreeIndex; + } else { + gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF; + gOamBuffer2[gUnknown_03004D60[order]].split.fractional = gOamFreeIndex; + gUnknown_03004D60[order] = gOamFreeIndex; + } + + gOamFreeIndex++; + result = &gOamBuffer2[gOamFreeIndex - 1]; + } + + return result; +} + +void CopyOamBufferToOam(void) +{ + OamData *dstOam = &gOamBuffer[0]; + u8 i = 0; + s32 r3; + + for (r3 = 0; r3 < 32; r3++) { + s8 index = gUnknown_03001850[r3]; + + while (index != -1) { + u8 newI; + u8 *byteArray = gUnknown_03002710; + DmaCopy16(3, &gOamBuffer2[index], dstOam, sizeof(OamDataShort)); + dstOam++; + + byteArray += index; + newI = i++; + *byteArray = newI; + index = gOamBuffer2[index].split.fractional; + }; + } + + if (gFlags & FLAGS_800) { + r3 = gOamFreeIndex; + dstOam = &gOamBuffer[r3]; + + while (r3 < gOamFirstPausedIndex) { + DmaFill16(3, 0x200, dstOam, sizeof(OamDataShort)); + dstOam++; + r3++; + } + } else if (gFlags & FLAGS_PAUSE_GAME) { + /* Push all active OAM entries to te end of OAM temporarily while + * the game is paused */ + s32 k, l; + r3 = gOamFreeIndex - 1; + dstOam = &gOamBuffer[r3]; + + for (k = l = 0; r3 >= 0;) { + s32 size = sizeof(OamDataShort); + DmaCopy16(3, dstOam - k, &gOamBuffer[OAM_ENTRY_COUNT - 1 - l], size); + k++, r3--, l++; + } + + // _08005A5E + + gOamFirstPausedIndex = OAM_ENTRY_COUNT - gOamFreeIndex; + + for (r3 = 0; r3 < gOamFirstPausedIndex; r3++) { + DmaFill16(3, 0x200, &gOamBuffer[r3], sizeof(OamDataShort)); +#ifndef NON_MATCHING + // unlike when using --, using ++ changes the condition to something entirely + // different unless we tell the compiler that we want to use r3's values + // (without actually doing so) + asm("" ::"r"(r3)); +#endif + } + + } else { + gOamFirstPausedIndex = 0; + } + + gOamFreeIndex = 0; + if (gFlags & FLAGS_4000) { + CpuFill32(-1, gUnknown_03001850, sizeof(gUnknown_03001850)); + CpuFill32(-1, gUnknown_03004D60, sizeof(gUnknown_03004D60)); + } else { + DmaFill32(3, -1, gUnknown_03001850, sizeof(gUnknown_03001850)); + DmaFill32(3, -1, gUnknown_03004D60, sizeof(gUnknown_03004D60)); + } +} + +// (-2) +static AnimCmdResult animCmd_GetPalette(void *cursor, Sprite *s) +{ + ACmd_GetPalette *cmd = (ACmd_GetPalette *)cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + if (!(s->unk10 & SPRITE_FLAG_MASK_18)) { + s32 paletteIndex = cmd->palId; + + DmaCopy32(3, &gRefSpriteTables->palettes[paletteIndex * 16], + &gObjPalette[s->palId * 16 + cmd->insertOffset], cmd->numColors * 2); + + gFlags |= FLAGS_UPDATE_SPRITE_PALETTES; + } + + return ACMD_RESULT__RUNNING; +} + +// (-3) +static AnimCmdResult animCmd_JumpBack(void *cursor, Sprite *s) +{ + ACmd_JumpBack *cmd = cursor; + s->animCursor -= cmd->offset; + + return ACMD_RESULT__RUNNING; +} + +// (-4) +static AnimCmdResult animCmd_End(void *cursor, Sprite *s) +{ + SPRITE_FLAG_SET(s, ANIM_OVER); + + return ACMD_RESULT__ENDED; +} + +// (-5) +static AnimCmdResult animCmd_PlaySoundEffect(void *cursor, Sprite *s) +{ + ACmd_PlaySoundEffect *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + m4aSongNumStart(cmd->songId); + + return ACMD_RESULT__RUNNING; +} + +// (-7) +static AnimCmdResult animCmd_TranslateSprite(void *cursor, Sprite *s) +{ + ACmd_TranslateSprite *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + s->x += cmd->x; + s->y += cmd->y; + + return ACMD_RESULT__RUNNING; +} + +// (-8) +static AnimCmdResult animCmd_8(void *cursor, Sprite *s) +{ + ACmd_8 *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + return ACMD_RESULT__RUNNING; +} + +// (-9) +static AnimCmdResult animCmd_SetIdAndVariant(void *cursor, Sprite *s) +{ + ACmd_SetIdAndVariant *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + s->graphics.anim = cmd->animId; + s->prevVariant = -1; + s->variant = cmd->variant; + + return ACMD_RESULT__ANIM_CHANGED; +} + +// (-10) +static AnimCmdResult animCmd_10(void *cursor, Sprite *s) +{ + ACmd_10 *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + +#ifdef BUG_FIX + return ACMD_RESULT__RUNNING; // I think this should be the correct behavior? +#else + return (s32)cursor; +#endif +} + +// (-11) +// Sets the priority the sprite has in OAM (0 - 3) +static AnimCmdResult animCmd_SetSpritePriority(void *cursor, Sprite *s) +{ + ACmd_SetSpritePriority *cmd = cursor; + s->animCursor += AnimCommandSizeInWords(*cmd); + + SPRITE_FLAG_CLEAR(s, PRIORITY); + SPRITE_FLAG_SET_VALUE(s, PRIORITY, cmd->priority); + + return ACMD_RESULT__RUNNING; +} + +// (-12) +// Sets the index 's' is expected to be put at in OAM +// compared to sprites with a lower/higher value (0 - 31) +static AnimCmdResult animCmd_SetOamOrder(void *cursor, Sprite *s) +{ + ACmd_SetOamOrder *cmd = cursor; + + s->animCursor += AnimCommandSizeInWords(*cmd); + s->unk1A = SPRITE_OAM_ORDER(cmd->orderIndex); + + return ACMD_RESULT__RUNNING; +} diff --git a/src/sprite_2.c b/src/sprite_2.c deleted file mode 100644 index 78f29074b..000000000 --- a/src/sprite_2.c +++ /dev/null @@ -1,377 +0,0 @@ -#include "global.h" -#include "flags.h" -#include "core.h" -#include "sprite.h" -#include "data/sprite_data.h" -#include "trig.h" -#include "animation_commands.h" - -extern const AnimationCommandFunc animCmdTable[]; - -#define ReadInstruction(script, cursor) ((void *)(script) + (cursor * sizeof(s32))) - -// This function gets called as long as an enemy is on-screen. -// Potentially something to do with collision/distance? -// -// Vector-to-rotation(0-1023) ? -s16 sub_8004418(s16 x, s16 y) -{ - s16 fraction; - s32 result; - u8 index = 0; - u8 array[] = { - /* 0x00 */ I(Q(0.5 * 2)), - /* 0x01 */ I(Q(0.0 * 2)), - /* 0x02 */ I(Q(1.0 * 2)), - /* 0x03 */ I(Q(1.5 * 2)), - /* 0x04 */ I(Q(3.0 * 2)), - /* 0x05 */ I(Q(3.5 * 2)), - /* 0x06 */ I(Q(2.5 * 2)), - /* 0x07 */ I(Q(2.0 * 2)), - }; - - if ((x | y) == 0) { - result = -1; - } else { - // _0800444C - if (x <= 0) { - x = -x; - index = 4; - } - if (y <= 0) { - y = -y; - index += 2; - } - if (x >= y) { - // fraction = y*0.5 / x - y *= Q(0.5); - - if (x == 0) { - // _0800447C - fraction = y; - } else { - // _08004480 - fraction = y / x; - } - } else { - // _08004488 - index += 1; - - x *= Q(0.5); - - if (y == 0) { - fraction = x; - } else { - fraction = x / y; - } - } - - if (array[index] & 0x01) { - fraction = Q(0.5) - fraction; - } - - { - s32 val = array[index] * Q(0.5); - fraction += val; - result = ((u32)(fraction << 22) >> 22); - } - } - return result; -} - -void numToTileIndices(u8 *digits, u16 number) -{ - u8 i; - - for (i = 0; i < 4; number <<= 4, i++) { - u16 value = ((number & 0xF000) >> 12); - if (value > 9) { - digits[i] = value + 87; - } else { - digits[i] = value + '0'; - } - } - - digits[i] = 0; -} - -u32 sub_8004518(u16 num) -{ - u8 i; - u16 result; - u8 lowDigit; - u16 remainder = num; - - result = 0; - for (i = 0; i < 4; i++) { - s32 divisor = Div(remainder, 10); - lowDigit = remainder - (divisor * 10); - remainder = divisor; - - result |= lowDigit << (i * 4); - } - - return result; -} - -AnimCmdResult UpdateSpriteAnimation(Sprite *s) -{ - SPRITE_MAYBE_SWITCH_ANIM(s); - - if (s->unk10 & SPRITE_FLAG_MASK_ANIM_OVER) - return 0; - - if (s->timeUntilNextFrame > 0) - s->timeUntilNextFrame -= s->animSpeed * 16; - else { - /* Call all commands for the new frame */ - s32 ret; - const ACmd *cmd; - const ACmd *script; - const ACmd **variants; - - // Handle all the "regular" Animation commands with an ID < 0 - variants = gUnknown_03002794->animations[s->graphics.anim]; - script = variants[s->variant]; - cmd = ReadInstruction(script, s->animCursor); - while (cmd->id < 0) { - // TODO: make this const void* - ret = animCmdTable[~cmd->id]((void *)cmd, s); - if (ret != ACMD_RESULT__RUNNING) { -#ifndef NON_MATCHING - register const ACmd *newScript asm("r2"); -#else - const ACmd *newScript; -#endif - if (ret != ACMD_RESULT__ANIM_CHANGED) { - return ret; - } - - // animation has changed - variants = gUnknown_03002794->animations[s->graphics.anim]; - newScript = variants[s->variant]; - - // reset cursor - s->animCursor = 0; - - // load the new script - script = newScript; - } - cmd = ReadInstruction(script, s->animCursor); - } - - // Display the image 'index' for 'delay' frames - s->timeUntilNextFrame += Q_8_8(((ACmd_ShowFrame *)cmd)->delay); - s->timeUntilNextFrame -= s->animSpeed * 16; - { - s32 frame = ((ACmd_ShowFrame *)cmd)->index; - if (frame != -1) { - const struct SpriteTables *sprTables = gUnknown_03002794; - - s->dimensions = &sprTables->dimensions[s->graphics.anim][frame]; - } else { - s->dimensions = (void *)-1; - } - } - - s->animCursor += 2; - } - return 1; -} - -// (-1) -AnimCmdResult animCmd_GetTiles(void *cursor, Sprite *s) -{ - ACmd_GetTiles *cmd = (ACmd_GetTiles *)cursor; - s->animCursor += AnimCommandSizeInWords(ACmd_GetTiles); - - if ((s->unk10 & SPRITE_FLAG_MASK_19) == 0) { - if (cmd->tileIndex < 0) { - s->graphics.src - = &gUnknown_03002794->tiles_8bpp[cmd->tileIndex * TILE_SIZE_8BPP]; - s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_8BPP; - } else { - s->graphics.src - = &gUnknown_03002794->tiles_4bpp[cmd->tileIndex * TILE_SIZE_4BPP]; - s->graphics.size = cmd->numTilesToCopy * TILE_SIZE_4BPP; - } - - gVramGraphicsCopyQueue[gVramGraphicsCopyQueueIndex] = &s->graphics; - gVramGraphicsCopyQueueIndex = (gVramGraphicsCopyQueueIndex + 1) & 0x1F; - } - - return 1; -} - -// (-6) -AnimCmdResult animCmd_AddHitbox(void *cursor, Sprite *s) -{ - ACmd_Hitbox *cmd = (ACmd_Hitbox *)cursor; - s32 hitboxId = cmd->hitbox.index % 16u; - s->animCursor += AnimCommandSizeInWords(ACmd_Hitbox); - - DmaCopy32(3, &cmd->hitbox, &s->hitboxes[hitboxId].index, 8); - - if ((cmd->hitbox.left == 0) && (cmd->hitbox.top == 0) && (cmd->hitbox.right == 0) - && (cmd->hitbox.bottom == 0)) { - s->hitboxes[hitboxId].index = -1; - } else { - if (s->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { - SWAP_AND_NEGATE(s->hitboxes[hitboxId].top, s->hitboxes[hitboxId].bottom); - } - - if (s->unk10 & SPRITE_FLAG_MASK_X_FLIP) { - SWAP_AND_NEGATE(s->hitboxes[hitboxId].left, s->hitboxes[hitboxId].right); - } - } - - return 1; -} - -void sub_80047A0(u16 angle, s16 p1, s16 p2, u16 affineIndex) -{ - u16 *affine = &gOamBuffer[affineIndex * 4].all.affineParam; - s16 res; - - res = Div(0x10000, p1); - affine[0] = I(COS_24_8(angle) * res); - - res = Div(0x10000, p1); - affine[4] = I(SIN_24_8(angle) * res); - - res = Div(0x10000, p2); - affine[8] = I((-(SIN(angle)) >> 6) * res); - - res = Div(0x10000, p2); - affine[12] = I(COS_24_8(angle) * res); -} - -typedef struct { - /* 0x00 */ u16 unk0[8]; - /* 0x08 */ s16 unk8; - /* 0x0A */ s16 unkA; - - /* 0x0C */ s16 unkC[2]; - - /* 0x10 */ s32 posX; - /* 0x14 */ s32 posY; - - /* 0x18 */ s16 unk18[2][2]; - u16 affineIndex; -} UnkStruct; - -// Similar to sub_8004ABC and sub_8004E14 -// (53.42%) https://decomp.me/scratch/llwGy -// (56.74%) https://decomp.me/scratch/rXgtp -NONMATCH("asm/non_matching/engine/sub_8004860.inc", - void sub_8004860(Sprite *s, SpriteTransform *transform)) -{ - // sp24 = s - UnkStruct big; - const SpriteOffset *dimensions = s->dimensions; - - if (dimensions != (SpriteOffset *)-1) { - s16 res; - u16 *affine; - big.affineIndex = s->unk10 % 32u; - affine = &gOamBuffer[big.affineIndex * 4].all.affineParam; - -#if 01 - sub_80047A0(transform->rotation & ONE_CYCLE, transform->width, transform->height, - big.affineIndex); -#else - big.unk0[4] = COS_24_8(transform->rotation & ONE_CYCLE); - big.unk0[5] = SIN_24_8(transform->rotation & ONE_CYCLE); - - big.unk0[6] = transform->width; - big.unk0[7] = transform->height; - - res = Div(0x10000, big.unk0[6]); - affine[0] = Q_8_8_TO_INT(((big.unk0[4] << 16) >> 16) * res); - - res = Div(0x10000, big.unk0[6]); - affine[4] = I(big.unk0[5] * res); - - res = Div(0x10000, big.unk0[7]); - affine[8] = I(-big.unk0[4] * res); - - res = Div(0x10000, big.unk0[7]); - affine[12] = I(big.unk0[5] * res); -#endif - - if (transform->height < 0) - big.unk0[6] = -transform->height; - - if (transform->width < 0) - big.unk0[7] = -transform->width; - - // _0800497A - big.unk0[0] = I(big.unk0[4] * big.unk0[6]); - big.unk0[1] = I(-big.unk0[5] * big.unk0[6]); - big.unk0[2] = I(big.unk0[5] * big.unk0[7]); - big.unk0[3] = I(big.unk0[6] * big.unk0[7]); - - big.unk18[0][0] = 0x100; - big.unk18[0][1] = 0; - big.unk18[1][0] = 0; - big.unk18[1][1] = 0x100; - - big.posX = transform->x; - big.posY = transform->y; - - // _08004A20 - { - s32 r0; - s16 r1_16; - s32 r1; - s32 r2; - s16 r4; - s16 r3; - u32 r5; - - if (transform->width > 0) { - r4 = (u16)dimensions->offsetX; - r2 = dimensions->width; - } else { - s32 w = dimensions->width; - r4 = w - (u16)dimensions->offsetX; - r2 = w; - } - - // _08004A2E - r3 = transform->height; - - if (r3 > 0) { - r3 = (u16)dimensions->offsetY; - r5 = dimensions->height; - } else { - // _08004A3E - s32 h = dimensions->height; - r3 = h - (u16)dimensions->offsetY; - r5 = h; - } - - // _08004A4C - r1_16 = big.unk0[0] * (r4 - dimensions->width / 2); - r0 = big.unk0[1] * (r3 - dimensions->height / 2); - r1_16 += r0; - r1_16 = r1_16 + (r2 << 8); - big.posX -= (r1_16 >> 8); - - // __080004A7E - r1 = big.unk0[2]; - r1 *= r4; - r0 = big.unk0[7]; - r0 *= r3; - r1 += r0; - r1 += Q(r5); - r1 >>= 8; - - big.posY -= r1; - - s->x = big.posX; - s->y = big.posY; - } - } -} -END_NONMATCH diff --git a/src/sprite_3.c b/src/sprite_3.c deleted file mode 100644 index 1c9f68bb2..000000000 --- a/src/sprite_3.c +++ /dev/null @@ -1,366 +0,0 @@ -#include "global.h" -#include "core.h" -#include "sprite.h" -#include "flags.h" - -#include "data/sprite_data.h" - -const u8 gOamShapesSizes[12][2] = { - // Square - { 8, 8 }, - { 16, 16 }, - { 32, 32 }, - { 64, 64 }, - - // Horizontal - { 16, 8 }, - { 32, 8 }, - { 32, 16 }, - { 64, 32 }, - - // Vertical - { 8, 16 }, - { 8, 32 }, - { 16, 32 }, - { 32, 64 }, -}; - -void DisplaySprite(Sprite *sprite) -{ - OamData *oam; - s32 x, y, sprWidth, sprHeight; - u8 i; - u32 r5, r7; - const u16 *oamData; - - if (sprite->dimensions != (void *)-1) { - const SpriteOffset *sprDims = sprite->dimensions; - - sprite->numSubFrames = sprDims->numSubframes; - x = sprite->x; - y = sprite->y; - - if (sprite->unk10 & SPRITE_FLAG_MASK_17) { - x -= gUnknown_030017F4[0]; - y -= gUnknown_030017F4[1]; - } - - sprWidth = sprDims->width; - sprHeight = sprDims->height; - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { - x -= sprDims->width / 2; - y -= sprDims->height / 2; - sprWidth *= 2; - sprHeight *= 2; - } - } else { - if (sprite->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { - y -= sprHeight - sprDims->offsetY; - } else { - y -= sprDims->offsetY; - } - - if (sprite->unk10 & SPRITE_FLAG_MASK_X_FLIP) { - x -= sprWidth - sprDims->offsetX; - } else { - x -= sprDims->offsetX; - } - } - - if (x + sprWidth >= 0 && x <= DISPLAY_WIDTH && // fmt - y + sprHeight >= 0 && y <= DISPLAY_HEIGHT) { - u8 unk6D0 = gMosaicReg >> 8; - - for (i = 0; i < sprDims->numSubframes; i++) { - oamData = gUnknown_03002794->oamData[sprite->graphics.anim]; - - // oam gets zero-initialized(?) - oam = OamMalloc(GET_SPRITE_OAM_ORDER(sprite)); - if (iwram_end == oam) { - return; - } - - if (i == 0) { - sprite->oamBaseIndex = gOamFreeIndex - 1; - } - - // oamIndex is a byte, why are they ANDing with 0x3FFF? - DmaCopy16(3, &oamData[3 * ((sprDims->oamIndex & 0x3FFF) + i)], oam, 6); - r7 = oam->all.attr1 & 0x1FF; - r5 = oam->all.attr0 & 0xFF; - oam->all.attr1 &= 0xFE00; - oam->all.attr0 &= 0xFE00; - - oam->all.attr2 += sprite->palId << 12; - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { - oam->all.attr0 |= 0x100; - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { - oam->all.attr0 |= 0x200; - } - oam->all.attr1 |= (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE) << 9; - } else { - u32 shapeAndSize = ((oam->all.attr0 & 0xC000) >> 12); - u32 flipY; - u32 r6; - - shapeAndSize |= ((oam->all.attr1 & 0xC000) >> 14); - flipY = sprite->unk10 >> SPRITE_FLAG_SHIFT_Y_FLIP; - r6 = 1; - - // y-flip - if ((((sprDims->flip >> 1) ^ flipY) & r6) != 0) { - oam->all.attr1 ^= 0x2000; - r5 = sprHeight - gOamShapesSizes[shapeAndSize][1] - r5; - } - - // x-flip - if (((sprite->unk10 >> SPRITE_FLAG_SHIFT_X_FLIP) & r6) - != (sprDims->flip & 1)) { - oam->all.attr1 ^= 0x1000; - r7 = sprWidth - gOamShapesSizes[shapeAndSize][0] - r7; - } - } - - if (unk6D0 != 0 && (sprite->unk10 & SPRITE_FLAG_MASK_MOSAIC) != 0) { - oam->all.attr0 |= 0x1000; - } - - oam->all.attr0 |= (sprite->unk10 & SPRITE_FLAG_MASK_OBJ_MODE) * 8; - oam->all.attr2 |= (sprite->unk10 & SPRITE_FLAG_MASK_PRIORITY) >> 2; - oam->all.attr0 += ((y + r5) & 0xFF); - oam->all.attr1 += ((x + r7) & 0x1FF); - - if (oam->all.attr0 & (ST_OAM_8BPP << 13)) { - oam->all.attr2 += oam->all.attr2 & 0x3FF; - } - oam->all.attr2 += GET_TILE_NUM(sprite->graphics.dest); - } - } - } -} - -void sub_081569A0(Sprite *sprite, u16 *sp08, u8 sp0C) -{ - vs32 x, y; - s32 sprWidth, sprHeight; - u8 sp18, i; - u32 x1, y1, sp24, sp28; - - if (sprite->dimensions != (void *)-1) { - const SpriteOffset *sprDims = sprite->dimensions; - - sprite->numSubFrames = sprDims->numSubframes; - x = sprite->x; - y = sprite->y; - - if (sprite->unk10 & SPRITE_FLAG_MASK_17) { - x -= gUnknown_030017F4[0]; - y -= gUnknown_030017F4[1]; - } - - sprWidth = sprDims->width; - sprHeight = sprDims->height; - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { - x -= sprDims->width / 2; - y -= sprDims->height / 2; - sprWidth *= 2; - sprHeight *= 2; - } - } else { - if (sprite->unk10 & SPRITE_FLAG_MASK_Y_FLIP) { - y -= sprHeight - sprDims->offsetY; - } else { - y -= sprDims->offsetY; - } - - if (sprite->unk10 & SPRITE_FLAG_MASK_X_FLIP) { - x -= sprWidth - sprDims->offsetX; - } else { - x -= sprDims->offsetX; - } - } - - sp24 = x - sprite->x; - sp28 = y - sprite->y; - if (x + sprWidth >= 0 && x <= 240 && y + sprHeight >= 0 && y <= 160) { - for (sp18 = 0; sp18 < sprDims->numSubframes; ++sp18) { - const u16 *oamData = gUnknown_03002794->oamData[sprite->graphics.anim]; - OamData *oam = OamMalloc(GET_SPRITE_OAM_ORDER(sprite)); - - if (iwram_end == oam) { - return; - } - - DmaCopy16(3, &oamData[3 * ((sprDims->oamIndex & 0x3FFF) + sp18)], oam, - 6); // excluding affine params - x1 = oam->all.attr1 & 0x1FF; - y1 = oam->all.attr0 & 0xFF; - oam->all.attr1 &= 0xFE00; - oam->all.attr0 &= 0xFE00; - oam->all.attr2 += sprite->palId << 12; - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) { - oam->all.attr0 |= 0x100; - if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) { - oam->all.attr0 |= 0x200; - } - oam->all.attr1 |= (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE) << 9; - } else { - u32 shapeAndSize = ((oam->all.attr0 & 0xC000) >> 12); - u32 flipY; - u32 r6; - - shapeAndSize |= ((oam->all.attr1 & 0xC000) >> 14); - flipY = sprite->unk10 >> 11; - r6 = 1; - - // y-flip - if ((((sprDims->flip >> 1) ^ flipY) & r6) != 0) { - oam->all.attr1 ^= 0x2000; - y1 = sprHeight - gOamShapesSizes[shapeAndSize][1] - y1; - } - - // x-flip - if (((sprite->unk10 >> 10) & r6) != (sprDims->flip & 1)) { - oam->all.attr1 ^= 0x1000; - x1 = sprWidth - gOamShapesSizes[shapeAndSize][0] - x1; - } - } - - oam->all.attr0 |= (sprite->unk10 & SPRITE_FLAG_MASK_OBJ_MODE) * 8; - oam->all.attr2 |= (sprite->unk10 & SPRITE_FLAG_MASK_PRIORITY) >> 2; - oam->all.attr0 += ((y + y1) & 0xFF); - oam->all.attr1 += ((x + x1) & 0x1FF); - - if (oam->all.attr0 & (ST_OAM_8BPP << 13)) { - oam->all.attr2 += oam->all.attr2 & 0x3FF; - } - oam->all.attr2 += GET_TILE_NUM(sprite->graphics.dest); - - for (i = 0; i < sp0C; ++i) { - OamData *r5 = OamMalloc(GET_SPRITE_OAM_ORDER(sprite)); - - if (iwram_end == oam) - return; - DmaCopy16(3, oam, r5, 6); - r5->all.attr1 &= 0xFE00; - r5->all.attr0 &= 0xFF00; - r5->all.attr0 += (sp08[2 * i + 1] + sp28 + y1) & 0xFF; - r5->all.attr1 += (sp08[2 * i + 0] + sp24 + x1) & 0x1FF; - } - } - } - } -} - -// The parameter to this determines the order this sprite is expected to be drawn at. -// -// If you have created n Sprite instances, and you want them to be drawn in a certain -// order, you'd set their OAM order value (inside Sprite.unk1A) accordingly. -// A higher value gets drawn first -// (Higher order value == Higher Priority -> Drawn first). -// This only applies if these sprites all have the same priority value (0-3) in OAM. -// For OAM priority values the same rule (Higher value == Higher Priority) applies. -// -// This behavior is used by the Pause Menu, whereby all existing OAM values get put to -// the end of the OAM buffer, while the pause menu itself gets put to the beginning. -OamData *OamMalloc(u8 order) -{ - OamData *result; - - if (order > 31) { - order = 31; - } - - if (gOamFreeIndex > OAM_ENTRY_COUNT - 1) { - result = (OamData *)iwram_end; - } else { - if (gUnknown_03001850[order] == 0xFF) { - gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF; - gUnknown_03001850[order] = gOamFreeIndex; - gUnknown_03004D60[order] = gOamFreeIndex; - } else { - gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF; - gOamBuffer2[gUnknown_03004D60[order]].split.fractional = gOamFreeIndex; - gUnknown_03004D60[order] = gOamFreeIndex; - } - - gOamFreeIndex++; - result = &gOamBuffer2[gOamFreeIndex - 1]; - } - - return result; -} - -void CopyOamBufferToOam(void) -{ - OamData *dstOam = &gOamBuffer[0]; - u8 i = 0; - s32 r3; - - for (r3 = 0; r3 < 32; r3++) { - s8 index = gUnknown_03001850[r3]; - - while (index != -1) { - u8 newI; - u8 *byteArray = gUnknown_03002710; - DmaCopy16(3, &gOamBuffer2[index], dstOam, sizeof(OamDataShort)); - dstOam++; - - byteArray += index; - newI = i++; - *byteArray = newI; - index = gOamBuffer2[index].split.fractional; - }; - } - - if (gFlags & FLAGS_800) { - r3 = gOamFreeIndex; - dstOam = &gOamBuffer[r3]; - - while (r3 < gOamFirstPausedIndex) { - DmaFill16(3, 0x200, dstOam, sizeof(OamDataShort)); - dstOam++; - r3++; - } - } else if (gFlags & FLAGS_PAUSE_GAME) { - /* Push all active OAM entries to te end of OAM temporarily while - * the game is paused */ - s32 k, l; - r3 = gOamFreeIndex - 1; - dstOam = &gOamBuffer[r3]; - - for (k = l = 0; r3 >= 0;) { - s32 size = sizeof(OamDataShort); - DmaCopy16(3, dstOam - k, &gOamBuffer[OAM_ENTRY_COUNT - 1 - l], size); - k++, r3--, l++; - } - - // _08005A5E - - gOamFirstPausedIndex = OAM_ENTRY_COUNT - gOamFreeIndex; - - for (r3 = 0; r3 < gOamFirstPausedIndex; r3++) { - DmaFill16(3, 0x200, &gOamBuffer[r3], sizeof(OamDataShort)); -#ifndef NON_MATCHING - // unlike when using --, using ++ changes the condition to something entirely - // different unless we tell the compiler that we want to use r3's values - // (without actually doing so) - asm("" ::"r"(r3)); -#endif - } - - } else { - gOamFirstPausedIndex = 0; - } - - gOamFreeIndex = 0; - if (gFlags & FLAGS_4000) { - CpuFill32(-1, gUnknown_03001850, sizeof(gUnknown_03001850)); - CpuFill32(-1, gUnknown_03004D60, sizeof(gUnknown_03004D60)); - } else { - DmaFill32(3, -1, gUnknown_03001850, sizeof(gUnknown_03001850)); - DmaFill32(3, -1, gUnknown_03004D60, sizeof(gUnknown_03004D60)); - } -}