diff --git a/asm/code_0_2.s b/asm/code_0_2.s index 8b3d12893..a6dcb69a7 100644 --- a/asm/code_0_2.s +++ b/asm/code_0_2.s @@ -11034,7 +11034,7 @@ _080269E0: lsrs r0, r0, #0x16 cmp r1, r0 bhs _08026A06 - bl sub_8029BB0 + bl PlayRingCollectSE _08026A06: ldrh r0, [r7, #0xe] lsls r0, r0, #0x16 @@ -11080,7 +11080,7 @@ _08026A32: cmp r0, #0 bne _08026AA0 adds r6, r1, #0 - bl sub_8029BB0 + bl PlayRingCollectSE ldrh r0, [r7, #0xe] lsls r0, r0, #0x16 lsrs r0, r0, #0x16 diff --git a/asm/code_0_3.s b/asm/code_0_3.s index 846bc1965..34db73c67 100644 --- a/asm/code_0_3.s +++ b/asm/code_0_3.s @@ -700,7 +700,7 @@ _0802B2AA: lsls r1, r7, #0x10 asrs r0, r0, #0x10 asrs r1, r1, #0x10 - bl sub_8029C54 + bl CreateCollectRingEffect cmp r5, #0 beq _0802B2CA mov r2, r8 diff --git a/asm/game__sa1_sa2_shared__rings_manager.s b/asm/game__sa1_sa2_shared__rings_manager.s deleted file mode 100644 index bc41d78ce..000000000 --- a/asm/game__sa1_sa2_shared__rings_manager.s +++ /dev/null @@ -1,2448 +0,0 @@ -.include "asm/macros.inc" -.include "constants/constants.inc" - -.text -.syntax unified -.arm - -@ --- src/game/sa1_sa2_shared/rings_manager.c --- - - thumb_func_start CreateStageRingsManager -CreateStageRingsManager: @ 0x08029AE0 - push {r4, r5, r6, lr} - sub sp, #4 - ldr r0, _08029AFC @ =gStageData - ldrh r1, [r0, #0xe] - ldrb r0, [r0, #3] - cmp r0, #7 - beq _08029B32 - lsls r0, r1, #0x10 - asrs r1, r0, #0x10 - adds r4, r0, #0 - cmp r1, #0x48 - beq _08029B04 - ldr r0, _08029B00 @ =sub_8029DE0 - b _08029B06 - .align 2, 0 -_08029AFC: .4byte gStageData -_08029B00: .4byte sub_8029DE0 -_08029B04: - ldr r0, _08029B4C @ =sub_802A6C4 -_08029B06: - movs r2, #0xa0 - lsls r2, r2, #6 - ldr r1, _08029B50 @ =TaskDestructor_RingsMgr - str r1, [sp] - movs r1, #0x2c - movs r3, #0 - bl TaskCreate - adds r6, r0, #0 - ldr r0, _08029B54 @ =gUnknown_080CEF58 - asrs r4, r4, #0xe - adds r4, r4, r0 - ldr r0, [r4] - ldr r0, [r0] - lsrs r0, r0, #8 - bl EwramMalloc - adds r5, r0, #0 - ldr r0, [r4] - adds r1, r5, #0 - bl RLUnCompWram -_08029B32: - ldrh r0, [r6, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - str r5, [r0, #0x28] - adds r3, r0, #0 - ldr r0, _08029B58 @ =gStageData - ldrb r0, [r0, #3] - cmp r0, #5 - bhi _08029B60 - ldr r0, _08029B5C @ =0x06014180 - b _08029B66 - .align 2, 0 -_08029B4C: .4byte sub_802A6C4 -_08029B50: .4byte TaskDestructor_RingsMgr -_08029B54: .4byte gUnknown_080CEF58 -_08029B58: .4byte gStageData -_08029B5C: .4byte 0x06014180 -_08029B60: - cmp r0, #6 - bne _08029B68 - ldr r0, _08029BA0 @ =0x060141A0 -_08029B66: - str r0, [r3] -_08029B68: - ldr r0, _08029BA4 @ =0x00041200 - str r0, [r3, #8] - movs r2, #0 - movs r1, #0 - ldr r0, _08029BA8 @ =0x00000535 - strh r0, [r3, #0xc] - movs r0, #0x78 - strh r0, [r3, #0x10] - movs r0, #0x50 - strh r0, [r3, #0x12] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r3, #0x14] - strh r1, [r3, #0x16] - ldr r0, _08029BAC @ =0x0000FFFF - strh r0, [r3, #0x18] - strb r2, [r3, #0x1a] - movs r0, #0xff - strb r0, [r3, #0x1b] - movs r0, #0x10 - strb r0, [r3, #0x1c] - strb r2, [r3, #0x1f] - subs r0, #0x11 - str r0, [r3, #0x20] - add sp, #4 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_08029BA0: .4byte 0x060141A0 -_08029BA4: .4byte 0x00041200 -_08029BA8: .4byte 0x00000535 -_08029BAC: .4byte 0x0000FFFF - - thumb_func_start sub_8029BB0 -sub_8029BB0: @ 0x08029BB0 - push {r4, r5, lr} - ldr r0, _08029C0C @ =gStageData - ldrb r1, [r0, #3] - adds r2, r0, #0 - cmp r1, #2 - beq _08029C42 - ldrb r0, [r2, #4] - cmp r0, #9 - beq _08029BCE - cmp r0, #4 - beq _08029BCE - cmp r0, #5 - beq _08029BCE - cmp r0, #6 - bne _08029BD4 -_08029BCE: - ldrb r0, [r2, #9] - cmp r0, #7 - beq _08029C42 -_08029BD4: - adds r0, r2, #0 - adds r0, #0xac - ldrh r1, [r0] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08029C1C - ldr r4, _08029C10 @ =gMPlayInfo_SE2 - ldr r1, _08029C14 @ =song117 (SE_RING_OLD_2) - adds r0, r4, #0 - bl MPlayStart - adds r0, r4, #0 - bl m4aMPlayImmInit - ldr r5, _08029C18 @ =0x0000FFFF - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x80 - bl m4aMPlayVolumeControl - movs r2, #0x40 - rsbs r2, r2, #0 - adds r0, r4, #0 - adds r1, r5, #0 - bl m4aMPlayPanpotControl - b _08029C42 - .align 2, 0 -_08029C0C: .4byte gStageData -_08029C10: .4byte gMPlayInfo_SE2 -_08029C14: .4byte song117 @ SE_RING_OLD_2 -_08029C18: .4byte 0x0000FFFF -_08029C1C: - ldr r4, _08029C48 @ =gMPlayInfo_SE1 - ldr r1, _08029C4C @ =song117 - adds r0, r4, #0 - bl MPlayStart - adds r0, r4, #0 - bl m4aMPlayImmInit - ldr r5, _08029C50 @ =0x0000FFFF - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x80 - bl m4aMPlayVolumeControl - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x40 - bl m4aMPlayPanpotControl -_08029C42: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_08029C48: .4byte gMPlayInfo_SE1 -_08029C4C: .4byte song117 -_08029C50: .4byte 0x0000FFFF - - thumb_func_start sub_8029C54 -sub_8029C54: @ 0x08029C54 - push {r4, r5, r6, r7, lr} - sub sp, #4 - lsls r0, r0, #0x10 - lsrs r7, r0, #0x10 - lsls r1, r1, #0x10 - lsrs r6, r1, #0x10 - ldr r5, _08029CA4 @ =gStageData - adds r0, r5, #0 - adds r0, #0xb5 - ldrb r0, [r0] - cmp r0, #7 - bhi _08029CFE - ldr r0, _08029CA8 @ =sub_802ACF0 - ldr r2, _08029CAC @ =0x00002810 - movs r4, #0 - str r4, [sp] - movs r1, #0x2c - movs r3, #0 - bl TaskCreate - ldrh r2, [r0, #6] - movs r3, #0xc0 - lsls r3, r3, #0x12 - ldr r1, _08029CB0 @ =0x03000029 - adds r0, r2, r1 - strb r4, [r0] - adds r0, r5, #0 - adds r0, #0xac - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - ldr r4, _08029CB4 @ =0x03000028 - adds r1, r2, r4 - strb r0, [r1] - orrs r3, r2 - ldrb r0, [r5, #3] - cmp r0, #5 - bhi _08029CBC - ldr r0, _08029CB8 @ =0x06014380 - b _08029CC2 - .align 2, 0 -_08029CA4: .4byte gStageData -_08029CA8: .4byte sub_802ACF0 -_08029CAC: .4byte 0x00002810 -_08029CB0: .4byte 0x03000029 -_08029CB4: .4byte 0x03000028 -_08029CB8: .4byte 0x06014380 -_08029CBC: - cmp r0, #6 - bne _08029CC4 - ldr r0, _08029D08 @ =0x060143A0 -_08029CC2: - str r0, [r3] -_08029CC4: - ldr r0, _08029D0C @ =0x00041200 - str r0, [r3, #8] - movs r2, #0 - movs r1, #0 - ldr r0, _08029D10 @ =0x00000536 - strh r0, [r3, #0xc] - strh r7, [r3, #0x10] - strh r6, [r3, #0x12] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r3, #0x14] - strh r1, [r3, #0x16] - ldr r0, _08029D14 @ =0x0000FFFF - strh r0, [r3, #0x18] - strb r2, [r3, #0x1a] - movs r0, #0xff - strb r0, [r3, #0x1b] - movs r0, #0x10 - strb r0, [r3, #0x1c] - strb r2, [r3, #0x1f] - subs r0, #0x11 - str r0, [r3, #0x20] - ldr r1, _08029D18 @ =gStageData - adds r1, #0xb5 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - bl sub_8029BB0 -_08029CFE: - add sp, #4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08029D08: .4byte 0x060143A0 -_08029D0C: .4byte 0x00041200 -_08029D10: .4byte 0x00000536 -_08029D14: .4byte 0x0000FFFF -_08029D18: .4byte gStageData - -@ --- entities_manager ? --- - - thumb_func_start sub_8029D1C -sub_8029D1C: @ 0x08029D1C - push {r4, r5, r6, r7, lr} - sub sp, #4 - lsls r0, r0, #0x10 - lsrs r7, r0, #0x10 - lsls r1, r1, #0x10 - lsrs r6, r1, #0x10 - ldr r5, _08029D6C @ =gStageData - adds r0, r5, #0 - adds r0, #0xb5 - ldrb r0, [r0] - cmp r0, #7 - bhi _08029DC2 - ldr r0, _08029D70 @ =sub_802ACF0 - ldr r2, _08029D74 @ =0x00002810 - movs r4, #0 - str r4, [sp] - movs r1, #0x2c - movs r3, #0 - bl TaskCreate - ldrh r2, [r0, #6] - movs r3, #0xc0 - lsls r3, r3, #0x12 - ldr r1, _08029D78 @ =0x03000029 - adds r0, r2, r1 - strb r4, [r0] - adds r0, r5, #0 - adds r0, #0xac - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - ldr r4, _08029D7C @ =0x03000028 - adds r1, r2, r4 - strb r0, [r1] - orrs r3, r2 - ldrb r0, [r5, #3] - cmp r0, #5 - bhi _08029D84 - ldr r0, _08029D80 @ =0x06014380 - b _08029D8A - .align 2, 0 -_08029D6C: .4byte gStageData -_08029D70: .4byte sub_802ACF0 -_08029D74: .4byte 0x00002810 -_08029D78: .4byte 0x03000029 -_08029D7C: .4byte 0x03000028 -_08029D80: .4byte 0x06014380 -_08029D84: - cmp r0, #6 - bne _08029D8C - ldr r0, _08029DCC @ =0x060143A0 -_08029D8A: - str r0, [r3] -_08029D8C: - ldr r0, _08029DD0 @ =0x00041200 - str r0, [r3, #8] - movs r2, #0 - movs r1, #0 - ldr r0, _08029DD4 @ =0x00000536 - strh r0, [r3, #0xc] - strh r7, [r3, #0x10] - strh r6, [r3, #0x12] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r3, #0x14] - strh r1, [r3, #0x16] - ldr r0, _08029DD8 @ =0x0000FFFF - strh r0, [r3, #0x18] - strb r2, [r3, #0x1a] - movs r0, #0xff - strb r0, [r3, #0x1b] - movs r0, #0x10 - strb r0, [r3, #0x1c] - strb r2, [r3, #0x1f] - subs r0, #0x11 - str r0, [r3, #0x20] - ldr r1, _08029DDC @ =gStageData - adds r1, #0xb5 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] -_08029DC2: - add sp, #4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08029DCC: .4byte 0x060143A0 -_08029DD0: .4byte 0x00041200 -_08029DD4: .4byte 0x00000536 -_08029DD8: .4byte 0x0000FFFF -_08029DDC: .4byte gStageData - - thumb_func_start sub_8029DE0 -sub_8029DE0: @ 0x08029DE0 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x4c - ldr r0, _08029E2C @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r1, r1, r0 - str r1, [sp, #4] - ldr r0, [r1, #0x28] - str r0, [sp, #8] - movs r1, #0 - str r1, [sp, #0x18] - ldr r0, [sp, #4] - bl UpdateSpriteAnimation - ldr r3, [sp, #4] - ldr r2, [r3, #4] - lsrs r0, r2, #0x1c - cmp r0, #0 - bne _08029E34 - ldr r0, _08029E30 @ =gRefSpriteTables - ldr r0, [r0] - ldrh r1, [r3, #0xc] - ldr r0, [r0, #4] - lsls r1, r1, #2 - adds r1, r1, r0 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, [r1] - adds r1, r1, r0 - str r1, [sp, #0xc] - b _08029E4A - .align 2, 0 -_08029E2C: .4byte gCurTask -_08029E30: .4byte gRefSpriteTables -_08029E34: - ldr r0, _08029E80 @ =gRefSpriteTables - ldr r1, [r0] - ldr r4, [sp, #4] - ldrh r0, [r4, #0xc] - ldr r1, [r1, #4] - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r1, r2, #4 - ldr r0, [r0] - adds r0, r0, r1 - str r0, [sp, #0xc] -_08029E4A: - ldr r6, [sp, #8] - adds r6, #4 - ldm r6!, {r0} - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x10] - ldm r6!, {r0} - str r6, [sp, #8] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x14] - ldr r0, _08029E84 @ =gStageData - ldrb r0, [r0, #3] - cmp r0, #5 - bls _08029E6A - b _0802A2BC -_08029E6A: - movs r0, #0 - str r0, [sp, #0x1c] - mov r1, sp - str r1, [sp, #0x20] -_08029E72: - ldr r2, [sp, #0x1c] - cmp r2, #0 - bne _08029E88 - ldr r0, _08029E84 @ =gStageData - ldrb r1, [r0, #6] - b _08029E92 - .align 2, 0 -_08029E80: .4byte gRefSpriteTables -_08029E84: .4byte gStageData -_08029E88: - mov r0, sb - adds r0, #0x2b - ldrb r1, [r0] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e -_08029E92: - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - ldr r1, _08029FB0 @ =gPlayers - adds r0, r0, r1 - mov sb, r0 - adds r4, r1, #0 - mov r3, sb - ldr r0, [r3, #4] - movs r3, #0x80 - lsls r3, r3, #1 - ands r0, r3 - cmp r0, #0 - beq _08029EB4 - b _0802A292 -_08029EB4: - mov r6, sb - movs r1, #0x30 - ldrsh r0, [r6, r1] - cmp r0, #0x66 - bne _08029EC0 - b _0802A292 -_08029EC0: - mov r0, sb - adds r0, #0x48 - movs r2, #0 - ldrsh r0, [r0, r2] - cmp r0, #0 - beq _08029ECE - b _0802A292 -_08029ECE: - mov r1, sb - adds r1, #0x2b - ldrb r2, [r1] - movs r0, #0x1c - ands r0, r2 - str r1, [sp, #0x44] - cmp r0, #8 - bne _08029EFA - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r1, r4, #4 - adds r0, r0, r1 - ldr r0, [r0] - ands r0, r3 - cmp r0, #0 - beq _08029EFA - b _0802A292 -_08029EFA: - mov r1, sb - adds r1, #0x24 - ldrb r0, [r1] - rsbs r0, r0, #0 - ldr r3, [sp, #0x20] - strb r0, [r3] - mov r2, sb - adds r2, #0x25 - ldrb r0, [r2] - rsbs r0, r0, #0 - strb r0, [r3, #1] - ldrb r0, [r1] - strb r0, [r3, #2] - ldrb r0, [r2] - strb r0, [r3, #3] - mov r4, sb - ldr r1, [r4, #0x14] - asrs r1, r1, #8 - movs r0, #1 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov sl, r0 - movs r0, #3 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - ble _08029F3A - b _0802A098 -_08029F3A: - ldr r6, [sp, #0x14] - cmp sl, r6 - blo _08029F42 - b _0802A098 -_08029F42: - mov r0, sp - str r0, [sp, #0x24] -_08029F46: - mov r1, sb - ldr r2, [r1, #0x10] - asrs r1, r2, #8 - ldr r3, [sp, #0x24] - movs r0, #0 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - subs r0, #8 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r0, #2 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 - mov r4, sb - ldr r3, [r4, #0x14] - mov r6, sl - adds r6, #1 - str r6, [sp, #0x3c] - cmp r8, r0 - ble _08029F76 - b _0802A076 -_08029F76: - ldr r0, [sp, #0x10] - cmp r8, r0 - blo _08029F7E - b _0802A076 -_08029F7E: - ldr r1, [sp, #0x10] - mov r0, sl - muls r0, r1, r0 - mov r4, r8 - lsls r1, r4, #2 - lsls r0, r0, #2 - ldr r6, [sp, #8] - adds r0, r0, r6 - adds r1, r1, r0 - ldr r0, [r1] - adds r4, #1 - str r4, [sp, #0x38] - cmp r0, #0 - beq _0802A054 - subs r0, #8 - adds r5, r6, r0 - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A054 - mov r4, sp -_08029FA8: - cmp r1, #0xfe - bne _08029FB4 - adds r5, #2 - b _0802A04C - .align 2, 0 -_08029FB0: .4byte gPlayers -_08029FB4: - ldrb r1, [r5] - lsls r1, r1, #3 - mov r2, r8 - lsls r0, r2, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r3, sl - lsls r0, r3, #8 - adds r6, r1, r0 - adds r2, r7, #0 - subs r2, #8 - mov r1, sb - ldr r0, [r1, #0x10] - asrs r0, r0, #8 - movs r3, #0 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _08029FE8 - adds r0, r7, #0 - adds r0, #8 - cmp r0, r1 - bge _08029FF4 - cmp r2, r1 - blt _0802A044 -_08029FE8: - movs r0, #2 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A044 -_08029FF4: - adds r2, r6, #0 - subs r2, #0x10 - mov r3, sb - ldr r0, [r3, #0x14] - asrs r0, r0, #8 - movs r3, #1 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A010 - cmp r6, r1 - bge _0802A01C - cmp r2, r1 - blt _0802A044 -_0802A010: - movs r0, #3 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A044 -_0802A01C: - ldr r0, [sp, #0x1c] - cmp r0, #0 - beq _0802A02E - ldr r2, [sp, #0x44] - ldrb r1, [r2] - movs r0, #0x1c - ands r0, r1 - cmp r0, #8 - bne _0802A034 -_0802A02E: - movs r0, #1 - bl AddRings -_0802A034: - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl sub_8029C54 - movs r0, #0xfe - strb r0, [r5] -_0802A044: - adds r5, #2 - mov r6, sb - ldr r3, [r6, #0x14] - ldr r2, [r6, #0x10] -_0802A04C: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _08029FA8 -_0802A054: - ldr r1, [sp, #0x38] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - asrs r1, r2, #8 - ldr r4, [sp, #0x24] - movs r0, #2 - ldrsb r0, [r4, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 - cmp r8, r0 - bgt _0802A076 - ldr r6, [sp, #0x10] - cmp r8, r6 - bhs _0802A076 - b _08029F7E -_0802A076: - ldr r1, [sp, #0x3c] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - asrs r1, r3, #8 - ldr r2, [sp, #0x24] - movs r0, #3 - ldrsb r0, [r2, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - bgt _0802A098 - ldr r3, [sp, #0x14] - cmp sl, r3 - bhs _0802A098 - b _08029F46 -_0802A098: - ldr r3, _0802A108 @ =gCamera - ldr r2, [r3, #4] - lsls r0, r2, #8 - lsrs r0, r0, #0x10 - mov sl, r0 - movs r0, #0x9e - lsls r0, r0, #1 - add r0, sb - ldrb r1, [r0] - movs r0, #0x20 - ands r0, r1 - cmp r0, #0 - bne _0802A0B4 - b _0802A292 -_0802A0B4: - mov r4, sl - lsls r1, r4, #8 - adds r0, r2, #0 - adds r0, #0xa0 - cmp r1, r0 - blt _0802A0C2 - b _0802A292 -_0802A0C2: - ldr r6, [sp, #0x14] - cmp sl, r6 - blo _0802A0CA - b _0802A292 -_0802A0CA: - ldr r0, [r3] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - lsls r1, r1, #8 - adds r0, #0xf0 - cmp r1, r0 - blt _0802A0DC - b _0802A274 -_0802A0DC: - ldr r0, [sp, #0x10] - mov r2, sl - muls r2, r0, r2 - mov r3, r8 - lsls r1, r3, #2 - lsls r0, r2, #2 - ldr r4, [sp, #8] - adds r0, r0, r4 - adds r1, r1, r0 - ldr r0, [r1] - str r2, [sp, #0x34] - ldr r6, [sp, #0x10] - cmp r8, r6 - blo _0802A0FA - b _0802A274 -_0802A0FA: - cmp r0, #0 - bne _0802A100 - b _0802A246 -_0802A100: - subs r0, #8 - ldr r1, [sp, #8] - adds r5, r1, r0 - b _0802A23C - .align 2, 0 -_0802A108: .4byte gCamera -_0802A10C: - cmp r1, #0xfe - beq _0802A180 - ldrb r1, [r5] - lsls r1, r1, #3 - mov r2, r8 - lsls r0, r2, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r3, sl - lsls r0, r3, #8 - adds r6, r1, r0 - ldr r4, _0802A184 @ =gCamera - ldr r0, [r4] - subs r0, r7, r0 - adds r0, #8 - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bhi _0802A180 - ldr r0, [r4, #4] - subs r0, r6, r0 - cmp r0, #0 - blt _0802A180 - subs r0, #0x10 - cmp r0, #0xa0 - bgt _0802A180 - adds r1, r7, #0 - subs r1, #0x40 - mov r2, sb - ldr r0, [r2, #0x10] - asrs r2, r0, #8 - cmp r1, r2 - bgt _0802A188 - adds r0, r7, #0 - adds r0, #0x40 - cmp r0, r2 - blt _0802A188 - adds r1, r6, #0 - subs r1, #0x48 - mov r3, sb - ldr r0, [r3, #0x14] - asrs r2, r0, #8 - cmp r1, r2 - bgt _0802A188 - adds r0, r6, #0 - adds r0, #0x38 - cmp r0, r2 - blt _0802A188 - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - mov r2, sb - bl sub_802AB10 - movs r0, #0xfe - strb r0, [r5] -_0802A180: - adds r5, #2 - b _0802A23C - .align 2, 0 -_0802A184: .4byte gCamera -_0802A188: - adds r5, #2 - ldr r4, [sp, #4] - ldrb r1, [r4, #0x1d] - ldr r0, [sp, #0x18] - cmp r0, #0 - beq _0802A19A - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A1BC -_0802A19A: - movs r0, #0xff - ldr r1, [sp, #4] - strb r0, [r1, #0x1d] - ldr r2, _0802A1B8 @ =gCamera - ldr r0, [r2] - subs r0, r7, r0 - strh r0, [r1, #0x10] - ldr r0, [r2, #4] - subs r0, r6, r0 - strh r0, [r1, #0x12] - ldr r0, [sp, #4] - bl DisplaySprite - b _0802A232 - .align 2, 0 -_0802A1B8: .4byte gCamera -_0802A1BC: - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - lsls r1, r1, #3 - ldr r0, _0802A2A4 @ =gOamMallocBuffer - adds r2, r1, r0 - ldrh r0, [r3, #0x14] - movs r4, #0xf8 - lsls r4, r4, #3 - adds r1, r4, #0 - ands r0, r1 - lsrs r0, r0, #6 - str r2, [sp, #0x48] - bl OamMalloc - adds r4, r0, #0 - ldr r0, _0802A2A8 @ =iwram_end - ldr r0, [r0] - ldr r2, [sp, #0x48] - cmp r0, r4 - bne _0802A1E6 - b _0802A69C -_0802A1E6: - ldr r1, _0802A2AC @ =0x040000D4 - str r2, [r1] - str r4, [r1, #4] - ldr r0, _0802A2B0 @ =0x80000003 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldrh r3, [r4, #2] - movs r1, #0xfe - lsls r1, r1, #8 - adds r0, r1, #0 - ands r3, r0 - strh r3, [r4, #2] - ldrh r2, [r4] - movs r1, #0xff - lsls r1, r1, #8 - adds r0, r1, #0 - ands r2, r0 - strh r2, [r4] - ldr r1, _0802A2B4 @ =gCamera - ldr r0, [r1, #4] - subs r0, r6, r0 - ldr r6, [sp, #0xc] - ldrh r1, [r6, #0xa] - subs r0, r0, r1 - movs r1, #0xff - ands r0, r1 - adds r2, r2, r0 - strh r2, [r4] - ldr r1, _0802A2B4 @ =gCamera - ldr r0, [r1] - subs r0, r7, r0 - ldrh r1, [r6, #8] - subs r0, r0, r1 - ldr r2, _0802A2B8 @ =0x000001FF - adds r1, r2, #0 - ands r0, r1 - adds r3, r3, r0 - strh r3, [r4, #2] -_0802A232: - ldr r0, [sp, #0x18] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x18] -_0802A23C: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A246 - b _0802A10C -_0802A246: - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - lsls r1, r0, #8 - ldr r3, _0802A2B4 @ =gCamera - ldr r0, [r3] - adds r0, #0xf0 - cmp r1, r0 - bge _0802A274 - mov r4, r8 - lsls r1, r4, #2 - ldr r6, [sp, #0x34] - lsls r0, r6, #2 - ldr r2, [sp, #8] - adds r0, r0, r2 - adds r1, r1, r0 - ldr r0, [r1] - ldr r3, [sp, #0x10] - cmp r8, r3 - bhs _0802A274 - b _0802A0FA -_0802A274: - mov r0, sl - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - lsls r1, r0, #8 - ldr r3, _0802A2B4 @ =gCamera - ldr r0, [r3, #4] - adds r0, #0xa0 - cmp r1, r0 - bge _0802A292 - ldr r4, [sp, #0x14] - cmp sl, r4 - bhs _0802A292 - b _0802A0CA -_0802A292: - ldr r0, [sp, #0x1c] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x1c] - cmp r0, #1 - bhi _0802A2A2 - b _08029E72 -_0802A2A2: - b _0802A514 - .align 2, 0 -_0802A2A4: .4byte gOamMallocBuffer -_0802A2A8: .4byte iwram_end -_0802A2AC: .4byte 0x040000D4 -_0802A2B0: .4byte 0x80000003 -_0802A2B4: .4byte gCamera -_0802A2B8: .4byte 0x000001FF -_0802A2BC: - movs r6, #0 - str r6, [sp, #0x1c] - mov r0, sp - str r0, [sp, #0x2c] -_0802A2C4: - movs r1, #0 - str r1, [sp, #0x28] - ldr r2, [sp, #0x1c] - lsls r0, r2, #2 - adds r0, r0, r2 - lsls r0, r0, #2 - adds r0, r0, r2 - lsls r0, r0, #4 - ldr r3, _0802A3C8 @ =gPlayers - adds r0, r0, r3 - mov sb, r0 - adds r0, #0x2b - ldrb r0, [r0] - movs r1, #0x1c - ands r1, r0 - adds r2, #1 - str r2, [sp, #0x40] - cmp r1, #0x14 - bne _0802A2EC - b _0802A506 -_0802A2EC: - cmp r1, #8 - bne _0802A2F2 - b _0802A506 -_0802A2F2: - ldr r0, _0802A3CC @ =gStageData - ldrb r1, [r0, #6] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r0, r0, r3 - cmp sb, r0 - beq _0802A31E - adds r0, #0x2b - ldrb r1, [r0] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r0, r0, r3 - cmp sb, r0 - bne _0802A322 -_0802A31E: - movs r4, #1 - str r4, [sp, #0x28] -_0802A322: - mov r6, sb - ldr r1, [r6, #4] - movs r0, #0x80 - lsls r0, r0, #1 - ands r1, r0 - ldr r0, [sp, #0x1c] - adds r0, #1 - str r0, [sp, #0x40] - cmp r1, #0 - beq _0802A338 - b _0802A506 -_0802A338: - movs r1, #0x30 - ldrsh r0, [r6, r1] - cmp r0, #0x66 - bne _0802A342 - b _0802A506 -_0802A342: - mov r0, sb - adds r0, #0x48 - movs r2, #0 - ldrsh r0, [r0, r2] - cmp r0, #0 - beq _0802A350 - b _0802A506 -_0802A350: - mov r1, sb - adds r1, #0x24 - ldrb r0, [r1] - rsbs r0, r0, #0 - ldr r3, [sp, #0x2c] - strb r0, [r3] - mov r2, sb - adds r2, #0x25 - ldrb r0, [r2] - rsbs r0, r0, #0 - strb r0, [r3, #1] - ldrb r0, [r1] - strb r0, [r3, #2] - ldrb r0, [r2] - strb r0, [r3, #3] - ldr r1, [r6, #0x14] - asrs r1, r1, #8 - movs r0, #1 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov sl, r0 - movs r0, #3 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - ble _0802A38E - b _0802A506 -_0802A38E: - ldr r4, [sp, #0x14] - cmp sl, r4 - blo _0802A396 - b _0802A506 -_0802A396: - mov r6, sp - str r6, [sp, #0x30] -_0802A39A: - mov r0, sb - ldr r2, [r0, #0x10] - asrs r1, r2, #8 - ldr r3, [sp, #0x30] - movs r0, #0 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - subs r0, #8 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r0, #2 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 - mov r4, sb - ldr r3, [r4, #0x14] - mov r6, sl - adds r6, #1 - str r6, [sp, #0x3c] - b _0802A4D8 - .align 2, 0 -_0802A3C8: .4byte gPlayers -_0802A3CC: .4byte gStageData -_0802A3D0: - ldr r1, [sp, #0x10] - mov r0, sl - muls r0, r1, r0 - mov r4, r8 - lsls r1, r4, #2 - lsls r0, r0, #2 - ldr r6, [sp, #8] - adds r0, r0, r6 - adds r1, r1, r0 - ldr r0, [r1] - adds r4, #1 - str r4, [sp, #0x38] - cmp r0, #0 - beq _0802A4C2 - subs r0, #8 - adds r5, r6, r0 - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A4C2 - mov r4, sp -_0802A3FA: - cmp r1, #0xfe - bne _0802A402 - adds r5, #2 - b _0802A4BA -_0802A402: - ldrb r1, [r5] - lsls r1, r1, #3 - mov r2, r8 - lsls r0, r2, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r3, sl - lsls r0, r3, #8 - adds r6, r1, r0 - adds r2, r7, #0 - subs r2, #8 - mov r1, sb - ldr r0, [r1, #0x10] - asrs r0, r0, #8 - movs r3, #0 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A436 - adds r0, r7, #0 - adds r0, #8 - cmp r0, r1 - bge _0802A442 - cmp r2, r1 - blt _0802A4B2 -_0802A436: - movs r0, #2 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A4B2 -_0802A442: - adds r2, r6, #0 - subs r2, #0x10 - mov r3, sb - ldr r0, [r3, #0x14] - asrs r0, r0, #8 - movs r3, #1 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A45E - cmp r6, r1 - bge _0802A46A - cmp r2, r1 - blt _0802A4B2 -_0802A45E: - movs r0, #3 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A4B2 -_0802A46A: - ldr r0, [sp, #0x28] - cmp r0, #0 - beq _0802A4A2 - ldr r0, _0802A490 @ =gStageData - ldrb r0, [r0, #6] - ldr r1, [sp, #0x1c] - cmp r0, r1 - bne _0802A494 - movs r0, #1 - bl AddRings - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl sub_8029C54 - b _0802A4AE - .align 2, 0 -_0802A490: .4byte gStageData -_0802A494: - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl sub_8029D1C - b _0802A4AE -_0802A4A2: - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl sub_8029D1C -_0802A4AE: - movs r0, #0xfe - strb r0, [r5] -_0802A4B2: - adds r5, #2 - mov r2, sb - ldr r3, [r2, #0x14] - ldr r2, [r2, #0x10] -_0802A4BA: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A3FA -_0802A4C2: - ldr r4, [sp, #0x38] - lsls r0, r4, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - asrs r1, r2, #8 - ldr r6, [sp, #0x30] - movs r0, #2 - ldrsb r0, [r6, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 -_0802A4D8: - cmp r8, r0 - bgt _0802A4E4 - ldr r0, [sp, #0x10] - cmp r8, r0 - bhs _0802A4E4 - b _0802A3D0 -_0802A4E4: - ldr r1, [sp, #0x3c] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - asrs r1, r3, #8 - ldr r2, [sp, #0x30] - movs r0, #3 - ldrsb r0, [r2, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - bgt _0802A506 - ldr r3, [sp, #0x14] - cmp sl, r3 - bhs _0802A506 - b _0802A39A -_0802A506: - ldr r4, [sp, #0x40] - lsls r0, r4, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x1c] - cmp r0, #3 - bhi _0802A514 - b _0802A2C4 -_0802A514: - ldr r2, _0802A524 @ =gCamera - ldr r0, [r2, #4] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov sl, r1 - lsls r1, r1, #8 - b _0802A68E - .align 2, 0 -_0802A524: .4byte gCamera -_0802A528: - ldr r0, [r2] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - lsls r1, r1, #8 - adds r0, #0xf0 - cmp r1, r0 - blt _0802A53A - b _0802A67E -_0802A53A: - ldr r0, [sp, #0x10] - cmp r8, r0 - blo _0802A542 - b _0802A67E -_0802A542: - ldr r1, [sp, #0x10] - mov r0, sl - muls r0, r1, r0 - mov r2, r8 - lsls r1, r2, #2 - lsls r0, r0, #2 - ldr r3, [sp, #8] - adds r0, r0, r3 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - bne _0802A55C - b _0802A660 -_0802A55C: - subs r0, #8 - adds r5, r3, r0 - b _0802A656 -_0802A562: - cmp r1, #0xfe - beq _0802A59A - ldrb r1, [r5] - lsls r1, r1, #3 - mov r4, r8 - lsls r0, r4, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r6, sl - lsls r0, r6, #8 - adds r6, r1, r0 - ldr r1, _0802A5A0 @ =gCamera - ldr r0, [r1] - subs r0, r7, r0 - adds r0, #8 - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bhi _0802A59A - ldr r2, _0802A5A0 @ =gCamera - ldr r0, [r2, #4] - subs r0, r6, r0 - cmp r0, #0 - blt _0802A59A - subs r0, #0x10 - cmp r0, #0xa0 - ble _0802A5A4 -_0802A59A: - adds r5, #2 - b _0802A656 - .align 2, 0 -_0802A5A0: .4byte gCamera -_0802A5A4: - adds r5, #2 - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - ldr r4, [sp, #0x18] - cmp r4, #0 - beq _0802A5B6 - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A5D8 -_0802A5B6: - movs r0, #0xff - ldr r1, [sp, #4] - strb r0, [r1, #0x1d] - ldr r2, _0802A5D4 @ =gCamera - ldr r0, [r2] - subs r0, r7, r0 - strh r0, [r1, #0x10] - ldr r0, [r2, #4] - subs r0, r6, r0 - strh r0, [r1, #0x12] - ldr r0, [sp, #4] - bl DisplaySprite - b _0802A64C - .align 2, 0 -_0802A5D4: .4byte gCamera -_0802A5D8: - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - lsls r1, r1, #3 - ldr r0, _0802A6AC @ =gOamMallocBuffer - adds r2, r1, r0 - ldrh r0, [r3, #0x14] - movs r4, #0xf8 - lsls r4, r4, #3 - adds r1, r4, #0 - ands r0, r1 - lsrs r0, r0, #6 - str r2, [sp, #0x48] - bl OamMalloc - adds r4, r0, #0 - ldr r0, _0802A6B0 @ =iwram_end - ldr r0, [r0] - ldr r2, [sp, #0x48] - cmp r0, r4 - beq _0802A69C - ldr r1, _0802A6B4 @ =0x040000D4 - str r2, [r1] - str r4, [r1, #4] - ldr r0, _0802A6B8 @ =0x80000003 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldrh r3, [r4, #2] - movs r1, #0xfe - lsls r1, r1, #8 - adds r0, r1, #0 - ands r3, r0 - strh r3, [r4, #2] - ldrh r2, [r4] - movs r1, #0xff - lsls r1, r1, #8 - adds r0, r1, #0 - ands r2, r0 - strh r2, [r4] - ldr r1, _0802A6BC @ =gCamera - ldr r0, [r1, #4] - subs r0, r6, r0 - ldr r6, [sp, #0xc] - ldrh r1, [r6, #0xa] - subs r0, r0, r1 - movs r1, #0xff - ands r0, r1 - adds r2, r2, r0 - strh r2, [r4] - ldr r1, _0802A6BC @ =gCamera - ldr r0, [r1] - subs r0, r7, r0 - ldrh r1, [r6, #8] - subs r0, r0, r1 - ldr r2, _0802A6C0 @ =0x000001FF - adds r1, r2, #0 - ands r0, r1 - adds r3, r3, r0 - strh r3, [r4, #2] -_0802A64C: - ldr r0, [sp, #0x18] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x18] -_0802A656: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A660 - b _0802A562 -_0802A660: - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - lsls r1, r0, #8 - ldr r3, _0802A6BC @ =gCamera - ldr r0, [r3] - adds r0, #0xf0 - cmp r1, r0 - bge _0802A67E - ldr r4, [sp, #0x10] - cmp r8, r4 - bhs _0802A67E - b _0802A542 -_0802A67E: - mov r0, sl - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - lsls r1, r0, #8 - ldr r2, _0802A6BC @ =gCamera - ldr r0, [r2, #4] -_0802A68E: - adds r0, #0xa0 - cmp r1, r0 - bge _0802A69C - ldr r6, [sp, #0x14] - cmp sl, r6 - bhs _0802A69C - b _0802A528 -_0802A69C: - 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 -_0802A6AC: .4byte gOamMallocBuffer -_0802A6B0: .4byte iwram_end -_0802A6B4: .4byte 0x040000D4 -_0802A6B8: .4byte 0x80000003 -_0802A6BC: .4byte gCamera -_0802A6C0: .4byte 0x000001FF - - thumb_func_start sub_802A6C4 -sub_802A6C4: @ 0x0802A6C4 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x30 - ldr r0, _0802A74C @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r1, r1, r0 - str r1, [sp, #4] - ldr r0, [r1, #0x28] - str r0, [sp, #8] - ldr r4, _0802A750 @ =gStageData - ldrh r1, [r4, #0xe] - movs r2, #0 - str r2, [sp, #0x18] - ldr r0, _0802A754 @ =gCamera - adds r0, #0x6a - movs r3, #0 - ldrsh r0, [r0, r3] - cmp r0, #0 - beq _0802A706 - ldr r0, _0802A758 @ =gUnknown_080CEF58 - lsls r1, r1, #0x10 - asrs r1, r1, #0xe - adds r1, r1, r0 - ldr r0, [r1] - ldr r1, [sp, #8] - bl RLUnCompWram -_0802A706: - ldrb r0, [r4, #9] - cmp r0, #8 - bne _0802A714 - ldrb r0, [r4, #4] - cmp r0, #3 - beq _0802A714 - b _0802AAE6 -_0802A714: - mov r0, sp - movs r1, #0xf6 - strb r1, [r0] - strb r1, [r0, #1] - movs r1, #0xa - strb r1, [r0, #2] - strb r1, [r0, #3] - ldr r0, [sp, #4] - bl UpdateSpriteAnimation - ldr r4, [sp, #4] - ldr r2, [r4, #4] - lsrs r0, r2, #0x1c - cmp r0, #0 - bne _0802A760 - ldr r0, _0802A75C @ =gRefSpriteTables - ldr r0, [r0] - ldrh r1, [r4, #0xc] - ldr r0, [r0, #4] - lsls r1, r1, #2 - adds r1, r1, r0 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, [r1] - adds r1, r1, r0 - str r1, [sp, #0xc] - b _0802A776 - .align 2, 0 -_0802A74C: .4byte gCurTask -_0802A750: .4byte gStageData -_0802A754: .4byte gCamera -_0802A758: .4byte gUnknown_080CEF58 -_0802A75C: .4byte gRefSpriteTables -_0802A760: - ldr r0, _0802A79C @ =gRefSpriteTables - ldr r1, [r0] - ldr r6, [sp, #4] - ldrh r0, [r6, #0xc] - ldr r1, [r1, #4] - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r1, r2, #4 - ldr r0, [r0] - adds r0, r0, r1 - str r0, [sp, #0xc] -_0802A776: - ldr r0, [sp, #8] - adds r0, #4 - adds r1, r0, #0 - ldm r1!, {r0} - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x10] - ldm r1!, {r0} - str r1, [sp, #8] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x14] - movs r2, #0 -_0802A790: - cmp r2, #0 - bne _0802A7A4 - ldr r0, _0802A7A0 @ =gStageData - ldrb r1, [r0, #6] - b _0802A7AE - .align 2, 0 -_0802A79C: .4byte gRefSpriteTables -_0802A7A0: .4byte gStageData -_0802A7A4: - mov r0, sl - adds r0, #0x2b - ldrb r1, [r0] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e -_0802A7AE: - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - ldr r1, _0802A884 @ =gPlayers - adds r0, r0, r1 - mov sl, r0 - mov r3, sl - ldr r1, [r3, #4] - movs r0, #0x80 - lsls r0, r0, #1 - ands r1, r0 - adds r2, #1 - str r2, [sp, #0x28] - cmp r1, #0 - beq _0802A7D2 - b _0802A95E -_0802A7D2: - movs r4, #0x30 - ldrsh r0, [r3, r4] - cmp r0, #0x66 - bne _0802A7DC - b _0802A95E -_0802A7DC: - mov r0, sl - adds r0, #0x48 - movs r6, #0 - ldrsh r0, [r0, r6] - cmp r0, #0 - beq _0802A7EA - b _0802A95E -_0802A7EA: - ldr r2, [r3, #0x14] - asrs r1, r2, #8 - mov r0, sp - ldrb r0, [r0, #1] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r0, r1, r0 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov sb, r0 - mov r0, sp - ldrb r0, [r0, #3] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r1, r1, r0 - subs r1, #0x10 - asrs r1, r1, #8 - adds r3, r2, #0 - cmp sb, r1 - ble _0802A814 - b _0802A95E -_0802A814: - ldr r0, [sp, #0x14] - cmp sb, r0 - blo _0802A81C - b _0802A95E -_0802A81C: - mov r1, sp - str r1, [sp, #0x1c] -_0802A820: - mov r4, sl - ldr r2, [r4, #0x10] - asrs r1, r2, #8 - ldr r6, [sp, #0x1c] - movs r0, #0 - ldrsb r0, [r6, r0] - adds r0, r1, r0 - subs r0, #8 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r0, #2 - ldrsb r0, [r6, r0] - adds r1, r1, r0 - subs r1, #8 - asrs r1, r1, #8 - mov r0, sb - adds r0, #1 - str r0, [sp, #0x24] - cmp r8, r1 - bgt _0802A93C - ldr r1, [sp, #0x10] - cmp r8, r1 - bhs _0802A93C -_0802A850: - ldr r4, [sp, #0x10] - mov r0, sb - muls r0, r4, r0 - mov r6, r8 - lsls r1, r6, #2 - lsls r0, r0, #2 - ldr r4, [sp, #8] - adds r0, r0, r4 - adds r1, r1, r0 - ldr r0, [r1] - adds r6, #1 - str r6, [sp, #0x20] - cmp r0, #0 - beq _0802A91C - subs r0, #8 - adds r5, r4, r0 - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A91C - mov r4, sp -_0802A87A: - cmp r1, #0xfe - bne _0802A888 - adds r5, #2 - b _0802A914 - .align 2, 0 -_0802A884: .4byte gPlayers -_0802A888: - ldrb r1, [r5] - lsls r1, r1, #3 - mov r6, r8 - lsls r0, r6, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r2, sb - lsls r0, r2, #8 - adds r6, r1, r0 - movs r3, #1 - cmp r3, #0 - beq _0802A90C - adds r2, r7, #0 - subs r2, #8 - mov r1, sl - ldr r0, [r1, #0x10] - asrs r0, r0, #8 - movs r3, #0 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A8C2 - adds r0, r7, #0 - adds r0, #8 - cmp r0, r1 - bge _0802A8CE - cmp r2, r1 - blt _0802A90C -_0802A8C2: - movs r0, #2 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A90C -_0802A8CE: - adds r2, r6, #0 - subs r2, #0x10 - mov r3, sl - ldr r0, [r3, #0x14] - asrs r0, r0, #8 - movs r3, #1 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A8EA - cmp r6, r1 - bge _0802A8F6 - cmp r2, r1 - blt _0802A90C -_0802A8EA: - movs r0, #3 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A90C -_0802A8F6: - movs r0, #1 - bl AddRings - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl sub_8029C54 - movs r0, #0xfe - strb r0, [r5] -_0802A90C: - adds r5, #2 - mov r6, sl - ldr r3, [r6, #0x14] - ldr r2, [r6, #0x10] -_0802A914: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A87A -_0802A91C: - ldr r1, [sp, #0x20] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - asrs r0, r2, #8 - ldr r4, [sp, #0x1c] - movs r1, #2 - ldrsb r1, [r4, r1] - adds r0, r0, r1 - subs r0, #8 - asrs r0, r0, #8 - cmp r8, r0 - bgt _0802A93C - ldr r6, [sp, #0x10] - cmp r8, r6 - blo _0802A850 -_0802A93C: - ldr r1, [sp, #0x24] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov sb, r0 - asrs r0, r3, #8 - ldr r2, [sp, #0x1c] - movs r1, #3 - ldrsb r1, [r2, r1] - adds r0, r0, r1 - subs r0, #0x10 - asrs r0, r0, #8 - cmp sb, r0 - bgt _0802A95E - ldr r4, [sp, #0x14] - cmp sb, r4 - bhs _0802A95E - b _0802A820 -_0802A95E: - ldr r6, [sp, #0x28] - lsls r0, r6, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #1 - bhi _0802A96A - b _0802A790 -_0802A96A: - ldr r2, _0802A97C @ =gCamera - ldr r0, [r2, #4] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov sb, r1 - lsls r1, r1, #8 - adds r0, #0xa0 - mov sl, r2 - b _0802AADA - .align 2, 0 -_0802A97C: .4byte gCamera -_0802A980: - ldr r0, [r2] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - lsls r1, r1, #8 - adds r0, #0xf0 - cmp r1, r0 - blt _0802A992 - b _0802AAC8 -_0802A992: - ldr r1, [sp, #0x10] - cmp r8, r1 - blo _0802A99A - b _0802AAC8 -_0802A99A: - ldr r2, [sp, #0x10] - mov r0, sb - muls r0, r2, r0 - mov r3, r8 - lsls r1, r3, #2 - lsls r0, r0, #2 - ldr r4, [sp, #8] - adds r0, r0, r4 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - beq _0802AAAA - subs r0, #8 - adds r5, r4, r0 - b _0802AAA2 -_0802A9B8: - cmp r1, #0xfe - beq _0802A9EE - ldrb r1, [r5] - lsls r1, r1, #3 - mov r6, r8 - lsls r0, r6, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r2, sb - lsls r0, r2, #8 - adds r6, r1, r0 - mov r3, sl - ldr r0, [r3] - subs r0, r7, r0 - adds r0, #8 - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bhi _0802A9EE - ldr r0, [r3, #4] - subs r0, r6, r0 - cmp r0, #0 - blt _0802A9EE - subs r0, #0x10 - cmp r0, #0xa0 - ble _0802A9F2 -_0802A9EE: - adds r5, #2 - b _0802AAA2 -_0802A9F2: - adds r5, #2 - ldr r4, [sp, #4] - ldrb r1, [r4, #0x1d] - ldr r0, [sp, #0x18] - cmp r0, #0 - beq _0802AA04 - adds r0, r1, #0 - cmp r0, #0xff - bne _0802AA20 -_0802AA04: - movs r0, #0xff - ldr r1, [sp, #4] - strb r0, [r1, #0x1d] - mov r2, sl - ldr r0, [r2] - subs r0, r7, r0 - strh r0, [r1, #0x10] - ldr r0, [r2, #4] - subs r0, r6, r0 - strh r0, [r1, #0x12] - ldr r0, [sp, #4] - bl DisplaySprite - b _0802AA94 -_0802AA20: - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - lsls r1, r1, #3 - ldr r0, _0802AAF8 @ =gOamMallocBuffer - adds r2, r1, r0 - ldrh r0, [r3, #0x14] - movs r4, #0xf8 - lsls r4, r4, #3 - adds r1, r4, #0 - ands r0, r1 - lsrs r0, r0, #6 - str r2, [sp, #0x2c] - bl OamMalloc - adds r4, r0, #0 - ldr r0, _0802AAFC @ =iwram_end - ldr r0, [r0] - ldr r2, [sp, #0x2c] - cmp r0, r4 - beq _0802AAE6 - ldr r1, _0802AB00 @ =0x040000D4 - str r2, [r1] - str r4, [r1, #4] - ldr r0, _0802AB04 @ =0x80000003 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldrh r3, [r4, #2] - movs r1, #0xfe - lsls r1, r1, #8 - adds r0, r1, #0 - ands r3, r0 - strh r3, [r4, #2] - ldrh r2, [r4] - movs r1, #0xff - lsls r1, r1, #8 - adds r0, r1, #0 - ands r2, r0 - strh r2, [r4] - mov r1, sl - ldr r0, [r1, #4] - subs r0, r6, r0 - ldr r6, [sp, #0xc] - ldrh r1, [r6, #0xa] - subs r0, r0, r1 - movs r1, #0xff - ands r0, r1 - adds r2, r2, r0 - strh r2, [r4] - mov r1, sl - ldr r0, [r1] - subs r0, r7, r0 - ldrh r1, [r6, #8] - subs r0, r0, r1 - ldr r2, _0802AB08 @ =0x000001FF - adds r1, r2, #0 - ands r0, r1 - adds r3, r3, r0 - strh r3, [r4, #2] -_0802AA94: - ldr r0, [sp, #0x18] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x18] - ldr r3, _0802AB0C @ =gCamera - mov sl, r3 -_0802AAA2: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A9B8 -_0802AAAA: - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - lsls r1, r0, #8 - mov r4, sl - ldr r0, [r4] - adds r0, #0xf0 - cmp r1, r0 - bge _0802AAC8 - ldr r6, [sp, #0x10] - cmp r8, r6 - bhs _0802AAC8 - b _0802A99A -_0802AAC8: - mov r0, sb - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov sb, r0 - lsls r1, r0, #8 - mov r2, sl - ldr r0, [r2, #4] - adds r0, #0xa0 -_0802AADA: - cmp r1, r0 - bge _0802AAE6 - ldr r0, [sp, #0x14] - cmp sb, r0 - bhs _0802AAE6 - b _0802A980 -_0802AAE6: - add sp, #0x30 - 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 -_0802AAF8: .4byte gOamMallocBuffer -_0802AAFC: .4byte iwram_end -_0802AB00: .4byte 0x040000D4 -_0802AB04: .4byte 0x80000003 -_0802AB08: .4byte 0x000001FF -_0802AB0C: .4byte gCamera - - thumb_func_start sub_802AB10 -sub_802AB10: @ 0x0802AB10 - push {r4, r5, r6, lr} - mov r6, r8 - push {r6} - sub sp, #4 - adds r4, r0, #0 - adds r5, r1, #0 - mov r8, r2 - lsls r4, r4, #0x10 - lsrs r4, r4, #0x10 - lsls r5, r5, #0x10 - lsrs r5, r5, #0x10 - ldr r0, _0802AB7C @ =sub_802AB8C - movs r2, #0x80 - lsls r2, r2, #6 - movs r6, #0 - str r6, [sp] - movs r1, #0x30 - movs r3, #0 - bl TaskCreate - ldrh r0, [r0, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - mov r1, r8 - str r1, [r0, #0x28] - movs r2, #0 - strh r6, [r0, #0x2c] - strh r4, [r0, #0x10] - strh r5, [r0, #0x12] - ldr r1, _0802AB80 @ =0x06014180 - str r1, [r0] - movs r1, #0xa0 - lsls r1, r1, #2 - strh r1, [r0, #0x14] - ldr r1, _0802AB84 @ =0x00000535 - strh r1, [r0, #0xc] - strb r2, [r0, #0x1a] - strh r6, [r0, #0xe] - strh r6, [r0, #0x16] - movs r1, #0xff - strb r1, [r0, #0x1b] - movs r1, #0x10 - strb r1, [r0, #0x1c] - strb r2, [r0, #0x1f] - ldr r1, _0802AB88 @ =0x00041200 - str r1, [r0, #8] - add sp, #4 - pop {r3} - mov r8, r3 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_0802AB7C: .4byte sub_802AB8C -_0802AB80: .4byte 0x06014180 -_0802AB84: .4byte 0x00000535 -_0802AB88: .4byte 0x00041200 - - thumb_func_start sub_802AB8C -sub_802AB8C: @ 0x0802AB8C - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - ldr r0, _0802ACB0 @ =gCurTask - ldr r0, [r0] - ldrh r0, [r0, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - ldr r7, [r0, #0x28] - adds r4, r0, #0 - ldr r1, [r7, #0x10] - asrs r1, r1, #8 - ldrh r0, [r4, #0x10] - subs r1, r1, r0 - ldr r0, [r7, #0x14] - asrs r0, r0, #8 - ldrh r2, [r4, #0x12] - subs r0, r0, r2 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - bl sa2__sub_8004418 - ldrh r1, [r4, #0x2c] - adds r1, #0x40 - strh r1, [r4, #0x2c] - movs r1, #0x2c - ldrsh r2, [r4, r1] - ldr r3, _0802ACB4 @ =gSineTable - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r5, #0x80 - lsls r5, r5, #1 - adds r1, r0, r5 - lsls r1, r1, #1 - adds r1, r1, r3 - movs r5, #0 - ldrsh r1, [r1, r5] - muls r1, r2, r1 - asrs r1, r1, #0x16 - ldrh r2, [r4, #0x10] - adds r1, r1, r2 - strh r1, [r4, #0x10] - movs r5, #0x2c - ldrsh r1, [r4, r5] - lsls r0, r0, #1 - adds r0, r0, r3 - movs r2, #0 - ldrsh r0, [r0, r2] - muls r0, r1, r0 - asrs r0, r0, #0x16 - ldrh r5, [r4, #0x12] - adds r0, r0, r5 - strh r0, [r4, #0x12] - ldrh r0, [r4, #0x12] - mov sb, r0 - ldrh r1, [r4, #0x10] - mov sl, r1 - movs r2, #0x10 - ldrsh r3, [r4, r2] - adds r2, r3, #0 - subs r2, #8 - ldr r1, [r7, #0x10] - asrs r1, r1, #8 - adds r0, r7, #0 - adds r0, #0xe0 - ldr r5, [r0] - adds r0, r5, #0 - adds r0, #0x30 - movs r6, #0 - ldrsb r6, [r0, r6] - adds r1, r1, r6 - cmp r2, r1 - bgt _0802AC34 - adds r0, r3, #0 - adds r0, #8 - cmp r0, r1 - bge _0802AC46 - cmp r2, r1 - blt _0802ACB8 -_0802AC34: - adds r0, r5, #0 - adds r0, #0x32 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r6 - adds r0, r1, r0 - cmp r0, r2 - blt _0802ACB8 -_0802AC46: - mov r5, sb - lsls r2, r5, #0x10 - asrs r6, r2, #0x10 - adds r5, r6, #0 - subs r5, #0x10 - ldr r1, [r7, #0x14] - asrs r1, r1, #8 - adds r0, r7, #0 - adds r0, #0xe0 - ldr r0, [r0] - adds r3, r0, #0 - adds r3, #0x31 - ldrb r3, [r3] - lsls r3, r3, #0x18 - asrs r3, r3, #0x18 - adds r1, r1, r3 - mov r8, r2 - cmp r5, r1 - bgt _0802AC74 - cmp r6, r1 - bge _0802AC84 - cmp r5, r1 - blt _0802ACB8 -_0802AC74: - adds r0, #0x33 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r5 - blt _0802ACB8 -_0802AC84: - ldr r0, [r7, #4] - movs r1, #0x80 - lsls r1, r1, #1 - ands r0, r1 - cmp r0, #0 - bne _0802ACA4 - movs r0, #1 - bl AddRings - mov r1, sl - lsls r0, r1, #0x10 - asrs r0, r0, #0x10 - mov r2, r8 - asrs r1, r2, #0x10 - bl sub_8029C54 -_0802ACA4: - ldr r0, _0802ACB0 @ =gCurTask - ldr r0, [r0] - bl TaskDestroy - b _0802ACDE - .align 2, 0 -_0802ACB0: .4byte gCurTask -_0802ACB4: .4byte gSineTable -_0802ACB8: - ldr r2, _0802ACEC @ =gCamera - ldr r1, [r2] - ldrh r0, [r4, #0x10] - subs r0, r0, r1 - strh r0, [r4, #0x10] - ldr r1, [r2, #4] - ldrh r0, [r4, #0x12] - subs r0, r0, r1 - strh r0, [r4, #0x12] - adds r0, r4, #0 - bl UpdateSpriteAnimation - adds r0, r4, #0 - bl DisplaySprite - mov r5, sl - strh r5, [r4, #0x10] - mov r0, sb - strh r0, [r4, #0x12] -_0802ACDE: - 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 -_0802ACEC: .4byte gCamera - - thumb_func_start sub_802ACF0 -sub_802ACF0: @ 0x0802ACF0 - push {r4, r5, r6, r7, lr} - ldr r7, _0802AD34 @ =gCurTask - ldr r0, [r7] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r4, r1, r0 - ldrh r5, [r4, #0x10] - ldrh r6, [r4, #0x12] - ldr r1, _0802AD38 @ =gCamera - ldr r0, [r1] - subs r0, r5, r0 - strh r0, [r4, #0x10] - ldr r1, [r1, #4] - ldrh r0, [r4, #0x12] - subs r0, r0, r1 - strh r0, [r4, #0x12] - adds r0, r4, #0 - bl UpdateSpriteAnimation - cmp r0, #0 - bne _0802AD40 - adds r0, r4, #0 - bl DisplaySprite - ldr r0, _0802AD3C @ =gStageData - adds r0, #0xb5 - ldrb r1, [r0] - subs r1, #1 - strb r1, [r0] - ldr r0, [r7] - bl TaskDestroy - b _0802AD4A - .align 2, 0 -_0802AD34: .4byte gCurTask -_0802AD38: .4byte gCamera -_0802AD3C: .4byte gStageData -_0802AD40: - adds r0, r4, #0 - bl DisplaySprite - strh r5, [r4, #0x10] - strh r6, [r4, #0x12] -_0802AD4A: - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - - thumb_func_start TaskDestructor_RingsMgr -TaskDestructor_RingsMgr: @ 0x0802AD50 - push {lr} - ldrh r0, [r0, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - ldr r0, [r0, #0x28] - bl EwramFree - pop {r0} - bx r0 diff --git a/asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc b/asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc new file mode 100644 index 000000000..ad37118bd --- /dev/null +++ b/asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc @@ -0,0 +1,1201 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x4c + ldr r0, _08029E2C @ =gCurTask + ldr r0, [r0] + ldrh r1, [r0, #6] + movs r0, #0xc0 + lsls r0, r0, #0x12 + adds r1, r1, r0 + str r1, [sp, #4] + ldr r0, [r1, #0x28] + str r0, [sp, #8] + movs r1, #0 + str r1, [sp, #0x18] + ldr r0, [sp, #4] + bl UpdateSpriteAnimation + ldr r3, [sp, #4] + ldr r2, [r3, #4] + lsrs r0, r2, #0x1c + cmp r0, #0 + bne _08029E34 + ldr r0, _08029E30 @ =gRefSpriteTables + ldr r0, [r0] + ldrh r1, [r3, #0xc] + ldr r0, [r0, #4] + lsls r1, r1, #2 + adds r1, r1, r0 + lsls r0, r2, #1 + adds r0, r0, r2 + lsls r0, r0, #2 + ldr r1, [r1] + adds r1, r1, r0 + str r1, [sp, #0xc] + b _08029E4A + .align 2, 0 +_08029E2C: .4byte gCurTask +_08029E30: .4byte gRefSpriteTables +_08029E34: + ldr r0, _08029E80 @ =gRefSpriteTables + ldr r1, [r0] + ldr r4, [sp, #4] + ldrh r0, [r4, #0xc] + ldr r1, [r1, #4] + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r1, r2, #4 + ldr r0, [r0] + adds r0, r0, r1 + str r0, [sp, #0xc] +_08029E4A: + ldr r6, [sp, #8] + adds r6, #4 + ldm r6!, {r0} + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + str r0, [sp, #0x10] + ldm r6!, {r0} + str r6, [sp, #8] + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + str r0, [sp, #0x14] + ldr r0, _08029E84 @ =gStageData + ldrb r0, [r0, #3] + cmp r0, #5 + bls _08029E6A + b _0802A2BC +_08029E6A: + movs r0, #0 + str r0, [sp, #0x1c] + mov r1, sp + str r1, [sp, #0x20] +_08029E72: + ldr r2, [sp, #0x1c] + cmp r2, #0 + bne _08029E88 + ldr r0, _08029E84 @ =gStageData + ldrb r1, [r0, #6] + b _08029E92 + .align 2, 0 +_08029E80: .4byte gRefSpriteTables +_08029E84: .4byte gStageData +_08029E88: + mov r0, sb + adds r0, #0x2b + ldrb r1, [r0] + lsls r1, r1, #0x1e + lsrs r1, r1, #0x1e +_08029E92: + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + ldr r1, _08029FB0 @ =gPlayers + adds r0, r0, r1 + mov sb, r0 + adds r4, r1, #0 + mov r3, sb + ldr r0, [r3, #4] + movs r3, #0x80 + lsls r3, r3, #1 + ands r0, r3 + cmp r0, #0 + beq _08029EB4 + b _0802A292 +_08029EB4: + mov r6, sb + movs r1, #0x30 + ldrsh r0, [r6, r1] + cmp r0, #0x66 + bne _08029EC0 + b _0802A292 +_08029EC0: + mov r0, sb + adds r0, #0x48 + movs r2, #0 + ldrsh r0, [r0, r2] + cmp r0, #0 + beq _08029ECE + b _0802A292 +_08029ECE: + mov r1, sb + adds r1, #0x2b + ldrb r2, [r1] + movs r0, #0x1c + ands r0, r2 + str r1, [sp, #0x44] + cmp r0, #8 + bne _08029EFA + lsls r1, r2, #0x1e + lsrs r1, r1, #0x1e + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r1, r4, #4 + adds r0, r0, r1 + ldr r0, [r0] + ands r0, r3 + cmp r0, #0 + beq _08029EFA + b _0802A292 +_08029EFA: + mov r1, sb + adds r1, #0x24 + ldrb r0, [r1] + rsbs r0, r0, #0 + ldr r3, [sp, #0x20] + strb r0, [r3] + mov r2, sb + adds r2, #0x25 + ldrb r0, [r2] + rsbs r0, r0, #0 + strb r0, [r3, #1] + ldrb r0, [r1] + strb r0, [r3, #2] + ldrb r0, [r2] + strb r0, [r3, #3] + mov r4, sb + ldr r1, [r4, #0x14] + asrs r1, r1, #8 + movs r0, #1 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov sl, r0 + movs r0, #3 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + ble _08029F3A + b _0802A098 +_08029F3A: + ldr r6, [sp, #0x14] + cmp sl, r6 + blo _08029F42 + b _0802A098 +_08029F42: + mov r0, sp + str r0, [sp, #0x24] +_08029F46: + mov r1, sb + ldr r2, [r1, #0x10] + asrs r1, r2, #8 + ldr r3, [sp, #0x24] + movs r0, #0 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + subs r0, #8 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov r8, r0 + movs r0, #2 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 + mov r4, sb + ldr r3, [r4, #0x14] + mov r6, sl + adds r6, #1 + str r6, [sp, #0x3c] + cmp r8, r0 + ble _08029F76 + b _0802A076 +_08029F76: + ldr r0, [sp, #0x10] + cmp r8, r0 + blo _08029F7E + b _0802A076 +_08029F7E: + ldr r1, [sp, #0x10] + mov r0, sl + muls r0, r1, r0 + mov r4, r8 + lsls r1, r4, #2 + lsls r0, r0, #2 + ldr r6, [sp, #8] + adds r0, r0, r6 + adds r1, r1, r0 + ldr r0, [r1] + adds r4, #1 + str r4, [sp, #0x38] + cmp r0, #0 + beq _0802A054 + subs r0, #8 + adds r5, r6, r0 + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A054 + mov r4, sp +_08029FA8: + cmp r1, #0xfe + bne _08029FB4 + adds r5, #2 + b _0802A04C + .align 2, 0 +_08029FB0: .4byte gPlayers +_08029FB4: + ldrb r1, [r5] + lsls r1, r1, #3 + mov r2, r8 + lsls r0, r2, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r3, sl + lsls r0, r3, #8 + adds r6, r1, r0 + adds r2, r7, #0 + subs r2, #8 + mov r1, sb + ldr r0, [r1, #0x10] + asrs r0, r0, #8 + movs r3, #0 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _08029FE8 + adds r0, r7, #0 + adds r0, #8 + cmp r0, r1 + bge _08029FF4 + cmp r2, r1 + blt _0802A044 +_08029FE8: + movs r0, #2 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A044 +_08029FF4: + adds r2, r6, #0 + subs r2, #0x10 + mov r3, sb + ldr r0, [r3, #0x14] + asrs r0, r0, #8 + movs r3, #1 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _0802A010 + cmp r6, r1 + bge _0802A01C + cmp r2, r1 + blt _0802A044 +_0802A010: + movs r0, #3 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A044 +_0802A01C: + ldr r0, [sp, #0x1c] + cmp r0, #0 + beq _0802A02E + ldr r2, [sp, #0x44] + ldrb r1, [r2] + movs r0, #0x1c + ands r0, r1 + cmp r0, #8 + bne _0802A034 +_0802A02E: + movs r0, #1 + bl AddRings +_0802A034: + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffect + movs r0, #0xfe + strb r0, [r5] +_0802A044: + adds r5, #2 + mov r6, sb + ldr r3, [r6, #0x14] + ldr r2, [r6, #0x10] +_0802A04C: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + bne _08029FA8 +_0802A054: + ldr r1, [sp, #0x38] + lsls r0, r1, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + asrs r1, r2, #8 + ldr r4, [sp, #0x24] + movs r0, #2 + ldrsb r0, [r4, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 + cmp r8, r0 + bgt _0802A076 + ldr r6, [sp, #0x10] + cmp r8, r6 + bhs _0802A076 + b _08029F7E +_0802A076: + ldr r1, [sp, #0x3c] + lsls r0, r1, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + asrs r1, r3, #8 + ldr r2, [sp, #0x24] + movs r0, #3 + ldrsb r0, [r2, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + bgt _0802A098 + ldr r3, [sp, #0x14] + cmp sl, r3 + bhs _0802A098 + b _08029F46 +_0802A098: + ldr r3, _0802A108 @ =gCamera + ldr r2, [r3, #4] + lsls r0, r2, #8 + lsrs r0, r0, #0x10 + mov sl, r0 + movs r0, #0x9e + lsls r0, r0, #1 + add r0, sb + ldrb r1, [r0] + movs r0, #0x20 + ands r0, r1 + cmp r0, #0 + bne _0802A0B4 + b _0802A292 +_0802A0B4: + mov r4, sl + lsls r1, r4, #8 + adds r0, r2, #0 + adds r0, #0xa0 + cmp r1, r0 + blt _0802A0C2 + b _0802A292 +_0802A0C2: + ldr r6, [sp, #0x14] + cmp sl, r6 + blo _0802A0CA + b _0802A292 +_0802A0CA: + ldr r0, [r3] + lsls r1, r0, #8 + lsrs r1, r1, #0x10 + mov r8, r1 + lsls r1, r1, #8 + adds r0, #0xf0 + cmp r1, r0 + blt _0802A0DC + b _0802A274 +_0802A0DC: + ldr r0, [sp, #0x10] + mov r2, sl + muls r2, r0, r2 + mov r3, r8 + lsls r1, r3, #2 + lsls r0, r2, #2 + ldr r4, [sp, #8] + adds r0, r0, r4 + adds r1, r1, r0 + ldr r0, [r1] + str r2, [sp, #0x34] + ldr r6, [sp, #0x10] + cmp r8, r6 + blo _0802A0FA + b _0802A274 +_0802A0FA: + cmp r0, #0 + bne _0802A100 + b _0802A246 +_0802A100: + subs r0, #8 + ldr r1, [sp, #8] + adds r5, r1, r0 + b _0802A23C + .align 2, 0 +_0802A108: .4byte gCamera +_0802A10C: + cmp r1, #0xfe + beq _0802A180 + ldrb r1, [r5] + lsls r1, r1, #3 + mov r2, r8 + lsls r0, r2, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r3, sl + lsls r0, r3, #8 + adds r6, r1, r0 + ldr r4, _0802A184 @ =gCamera + ldr r0, [r4] + subs r0, r7, r0 + adds r0, #8 + movs r1, #0x80 + lsls r1, r1, #1 + cmp r0, r1 + bhi _0802A180 + ldr r0, [r4, #4] + subs r0, r6, r0 + cmp r0, #0 + blt _0802A180 + subs r0, #0x10 + cmp r0, #0xa0 + bgt _0802A180 + adds r1, r7, #0 + subs r1, #0x40 + mov r2, sb + ldr r0, [r2, #0x10] + asrs r2, r0, #8 + cmp r1, r2 + bgt _0802A188 + adds r0, r7, #0 + adds r0, #0x40 + cmp r0, r2 + blt _0802A188 + adds r1, r6, #0 + subs r1, #0x48 + mov r3, sb + ldr r0, [r3, #0x14] + asrs r2, r0, #8 + cmp r1, r2 + bgt _0802A188 + adds r0, r6, #0 + adds r0, #0x38 + cmp r0, r2 + blt _0802A188 + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + mov r2, sb + bl sub_802AB10 + movs r0, #0xfe + strb r0, [r5] +_0802A180: + adds r5, #2 + b _0802A23C + .align 2, 0 +_0802A184: .4byte gCamera +_0802A188: + adds r5, #2 + ldr r4, [sp, #4] + ldrb r1, [r4, #0x1d] + ldr r0, [sp, #0x18] + cmp r0, #0 + beq _0802A19A + adds r0, r1, #0 + cmp r0, #0xff + bne _0802A1BC +_0802A19A: + movs r0, #0xff + ldr r1, [sp, #4] + strb r0, [r1, #0x1d] + ldr r2, _0802A1B8 @ =gCamera + ldr r0, [r2] + subs r0, r7, r0 + strh r0, [r1, #0x10] + ldr r0, [r2, #4] + subs r0, r6, r0 + strh r0, [r1, #0x12] + ldr r0, [sp, #4] + bl DisplaySprite + b _0802A232 + .align 2, 0 +_0802A1B8: .4byte gCamera +_0802A1BC: + ldr r3, [sp, #4] + ldrb r1, [r3, #0x1d] + lsls r1, r1, #3 + ldr r0, _0802A2A4 @ =gOamMallocBuffer + adds r2, r1, r0 + ldrh r0, [r3, #0x14] + movs r4, #0xf8 + lsls r4, r4, #3 + adds r1, r4, #0 + ands r0, r1 + lsrs r0, r0, #6 + str r2, [sp, #0x48] + bl OamMalloc + adds r4, r0, #0 + ldr r0, _0802A2A8 @ =iwram_end + ldr r0, [r0] + ldr r2, [sp, #0x48] + cmp r0, r4 + bne _0802A1E6 + b _0802A69C +_0802A1E6: + ldr r1, _0802A2AC @ =0x040000D4 + str r2, [r1] + str r4, [r1, #4] + ldr r0, _0802A2B0 @ =0x80000003 + str r0, [r1, #8] + ldr r0, [r1, #8] + ldrh r3, [r4, #2] + movs r1, #0xfe + lsls r1, r1, #8 + adds r0, r1, #0 + ands r3, r0 + strh r3, [r4, #2] + ldrh r2, [r4] + movs r1, #0xff + lsls r1, r1, #8 + adds r0, r1, #0 + ands r2, r0 + strh r2, [r4] + ldr r1, _0802A2B4 @ =gCamera + ldr r0, [r1, #4] + subs r0, r6, r0 + ldr r6, [sp, #0xc] + ldrh r1, [r6, #0xa] + subs r0, r0, r1 + movs r1, #0xff + ands r0, r1 + adds r2, r2, r0 + strh r2, [r4] + ldr r1, _0802A2B4 @ =gCamera + ldr r0, [r1] + subs r0, r7, r0 + ldrh r1, [r6, #8] + subs r0, r0, r1 + ldr r2, _0802A2B8 @ =0x000001FF + adds r1, r2, #0 + ands r0, r1 + adds r3, r3, r0 + strh r3, [r4, #2] +_0802A232: + ldr r0, [sp, #0x18] + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x18] +_0802A23C: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A246 + b _0802A10C +_0802A246: + mov r0, r8 + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + lsls r1, r0, #8 + ldr r3, _0802A2B4 @ =gCamera + ldr r0, [r3] + adds r0, #0xf0 + cmp r1, r0 + bge _0802A274 + mov r4, r8 + lsls r1, r4, #2 + ldr r6, [sp, #0x34] + lsls r0, r6, #2 + ldr r2, [sp, #8] + adds r0, r0, r2 + adds r1, r1, r0 + ldr r0, [r1] + ldr r3, [sp, #0x10] + cmp r8, r3 + bhs _0802A274 + b _0802A0FA +_0802A274: + mov r0, sl + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + lsls r1, r0, #8 + ldr r3, _0802A2B4 @ =gCamera + ldr r0, [r3, #4] + adds r0, #0xa0 + cmp r1, r0 + bge _0802A292 + ldr r4, [sp, #0x14] + cmp sl, r4 + bhs _0802A292 + b _0802A0CA +_0802A292: + ldr r0, [sp, #0x1c] + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x1c] + cmp r0, #1 + bhi _0802A2A2 + b _08029E72 +_0802A2A2: + b _0802A514 + .align 2, 0 +_0802A2A4: .4byte gOamMallocBuffer +_0802A2A8: .4byte iwram_end +_0802A2AC: .4byte 0x040000D4 +_0802A2B0: .4byte 0x80000003 +_0802A2B4: .4byte gCamera +_0802A2B8: .4byte 0x000001FF +_0802A2BC: + movs r6, #0 + str r6, [sp, #0x1c] + mov r0, sp + str r0, [sp, #0x2c] +_0802A2C4: + movs r1, #0 + str r1, [sp, #0x28] + ldr r2, [sp, #0x1c] + lsls r0, r2, #2 + adds r0, r0, r2 + lsls r0, r0, #2 + adds r0, r0, r2 + lsls r0, r0, #4 + ldr r3, _0802A3C8 @ =gPlayers + adds r0, r0, r3 + mov sb, r0 + adds r0, #0x2b + ldrb r0, [r0] + movs r1, #0x1c + ands r1, r0 + adds r2, #1 + str r2, [sp, #0x40] + cmp r1, #0x14 + bne _0802A2EC + b _0802A506 +_0802A2EC: + cmp r1, #8 + bne _0802A2F2 + b _0802A506 +_0802A2F2: + ldr r0, _0802A3CC @ =gStageData + ldrb r1, [r0, #6] + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r0, r0, r3 + cmp sb, r0 + beq _0802A31E + adds r0, #0x2b + ldrb r1, [r0] + lsls r1, r1, #0x1e + lsrs r1, r1, #0x1e + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r0, r0, r3 + cmp sb, r0 + bne _0802A322 +_0802A31E: + movs r4, #1 + str r4, [sp, #0x28] +_0802A322: + mov r6, sb + ldr r1, [r6, #4] + movs r0, #0x80 + lsls r0, r0, #1 + ands r1, r0 + ldr r0, [sp, #0x1c] + adds r0, #1 + str r0, [sp, #0x40] + cmp r1, #0 + beq _0802A338 + b _0802A506 +_0802A338: + movs r1, #0x30 + ldrsh r0, [r6, r1] + cmp r0, #0x66 + bne _0802A342 + b _0802A506 +_0802A342: + mov r0, sb + adds r0, #0x48 + movs r2, #0 + ldrsh r0, [r0, r2] + cmp r0, #0 + beq _0802A350 + b _0802A506 +_0802A350: + mov r1, sb + adds r1, #0x24 + ldrb r0, [r1] + rsbs r0, r0, #0 + ldr r3, [sp, #0x2c] + strb r0, [r3] + mov r2, sb + adds r2, #0x25 + ldrb r0, [r2] + rsbs r0, r0, #0 + strb r0, [r3, #1] + ldrb r0, [r1] + strb r0, [r3, #2] + ldrb r0, [r2] + strb r0, [r3, #3] + ldr r1, [r6, #0x14] + asrs r1, r1, #8 + movs r0, #1 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov sl, r0 + movs r0, #3 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + ble _0802A38E + b _0802A506 +_0802A38E: + ldr r4, [sp, #0x14] + cmp sl, r4 + blo _0802A396 + b _0802A506 +_0802A396: + mov r6, sp + str r6, [sp, #0x30] +_0802A39A: + mov r0, sb + ldr r2, [r0, #0x10] + asrs r1, r2, #8 + ldr r3, [sp, #0x30] + movs r0, #0 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + subs r0, #8 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov r8, r0 + movs r0, #2 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 + mov r4, sb + ldr r3, [r4, #0x14] + mov r6, sl + adds r6, #1 + str r6, [sp, #0x3c] + b _0802A4D8 + .align 2, 0 +_0802A3C8: .4byte gPlayers +_0802A3CC: .4byte gStageData +_0802A3D0: + ldr r1, [sp, #0x10] + mov r0, sl + muls r0, r1, r0 + mov r4, r8 + lsls r1, r4, #2 + lsls r0, r0, #2 + ldr r6, [sp, #8] + adds r0, r0, r6 + adds r1, r1, r0 + ldr r0, [r1] + adds r4, #1 + str r4, [sp, #0x38] + cmp r0, #0 + beq _0802A4C2 + subs r0, #8 + adds r5, r6, r0 + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A4C2 + mov r4, sp +_0802A3FA: + cmp r1, #0xfe + bne _0802A402 + adds r5, #2 + b _0802A4BA +_0802A402: + ldrb r1, [r5] + lsls r1, r1, #3 + mov r2, r8 + lsls r0, r2, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r3, sl + lsls r0, r3, #8 + adds r6, r1, r0 + adds r2, r7, #0 + subs r2, #8 + mov r1, sb + ldr r0, [r1, #0x10] + asrs r0, r0, #8 + movs r3, #0 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _0802A436 + adds r0, r7, #0 + adds r0, #8 + cmp r0, r1 + bge _0802A442 + cmp r2, r1 + blt _0802A4B2 +_0802A436: + movs r0, #2 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A4B2 +_0802A442: + adds r2, r6, #0 + subs r2, #0x10 + mov r3, sb + ldr r0, [r3, #0x14] + asrs r0, r0, #8 + movs r3, #1 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _0802A45E + cmp r6, r1 + bge _0802A46A + cmp r2, r1 + blt _0802A4B2 +_0802A45E: + movs r0, #3 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A4B2 +_0802A46A: + ldr r0, [sp, #0x28] + cmp r0, #0 + beq _0802A4A2 + ldr r0, _0802A490 @ =gStageData + ldrb r0, [r0, #6] + ldr r1, [sp, #0x1c] + cmp r0, r1 + bne _0802A494 + movs r0, #1 + bl AddRings + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffect + b _0802A4AE + .align 2, 0 +_0802A490: .4byte gStageData +_0802A494: + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffectNoSfx + b _0802A4AE +_0802A4A2: + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffectNoSfx +_0802A4AE: + movs r0, #0xfe + strb r0, [r5] +_0802A4B2: + adds r5, #2 + mov r2, sb + ldr r3, [r2, #0x14] + ldr r2, [r2, #0x10] +_0802A4BA: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + bne _0802A3FA +_0802A4C2: + ldr r4, [sp, #0x38] + lsls r0, r4, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + asrs r1, r2, #8 + ldr r6, [sp, #0x30] + movs r0, #2 + ldrsb r0, [r6, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 +_0802A4D8: + cmp r8, r0 + bgt _0802A4E4 + ldr r0, [sp, #0x10] + cmp r8, r0 + bhs _0802A4E4 + b _0802A3D0 +_0802A4E4: + ldr r1, [sp, #0x3c] + lsls r0, r1, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + asrs r1, r3, #8 + ldr r2, [sp, #0x30] + movs r0, #3 + ldrsb r0, [r2, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + bgt _0802A506 + ldr r3, [sp, #0x14] + cmp sl, r3 + bhs _0802A506 + b _0802A39A +_0802A506: + ldr r4, [sp, #0x40] + lsls r0, r4, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x1c] + cmp r0, #3 + bhi _0802A514 + b _0802A2C4 +_0802A514: + ldr r2, _0802A524 @ =gCamera + ldr r0, [r2, #4] + lsls r1, r0, #8 + lsrs r1, r1, #0x10 + mov sl, r1 + lsls r1, r1, #8 + b _0802A68E + .align 2, 0 +_0802A524: .4byte gCamera +_0802A528: + ldr r0, [r2] + lsls r1, r0, #8 + lsrs r1, r1, #0x10 + mov r8, r1 + lsls r1, r1, #8 + adds r0, #0xf0 + cmp r1, r0 + blt _0802A53A + b _0802A67E +_0802A53A: + ldr r0, [sp, #0x10] + cmp r8, r0 + blo _0802A542 + b _0802A67E +_0802A542: + ldr r1, [sp, #0x10] + mov r0, sl + muls r0, r1, r0 + mov r2, r8 + lsls r1, r2, #2 + lsls r0, r0, #2 + ldr r3, [sp, #8] + adds r0, r0, r3 + adds r1, r1, r0 + ldr r0, [r1] + cmp r0, #0 + bne _0802A55C + b _0802A660 +_0802A55C: + subs r0, #8 + adds r5, r3, r0 + b _0802A656 +_0802A562: + cmp r1, #0xfe + beq _0802A59A + ldrb r1, [r5] + lsls r1, r1, #3 + mov r4, r8 + lsls r0, r4, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r6, sl + lsls r0, r6, #8 + adds r6, r1, r0 + ldr r1, _0802A5A0 @ =gCamera + ldr r0, [r1] + subs r0, r7, r0 + adds r0, #8 + movs r1, #0x80 + lsls r1, r1, #1 + cmp r0, r1 + bhi _0802A59A + ldr r2, _0802A5A0 @ =gCamera + ldr r0, [r2, #4] + subs r0, r6, r0 + cmp r0, #0 + blt _0802A59A + subs r0, #0x10 + cmp r0, #0xa0 + ble _0802A5A4 +_0802A59A: + adds r5, #2 + b _0802A656 + .align 2, 0 +_0802A5A0: .4byte gCamera +_0802A5A4: + adds r5, #2 + ldr r3, [sp, #4] + ldrb r1, [r3, #0x1d] + ldr r4, [sp, #0x18] + cmp r4, #0 + beq _0802A5B6 + adds r0, r1, #0 + cmp r0, #0xff + bne _0802A5D8 +_0802A5B6: + movs r0, #0xff + ldr r1, [sp, #4] + strb r0, [r1, #0x1d] + ldr r2, _0802A5D4 @ =gCamera + ldr r0, [r2] + subs r0, r7, r0 + strh r0, [r1, #0x10] + ldr r0, [r2, #4] + subs r0, r6, r0 + strh r0, [r1, #0x12] + ldr r0, [sp, #4] + bl DisplaySprite + b _0802A64C + .align 2, 0 +_0802A5D4: .4byte gCamera +_0802A5D8: + ldr r3, [sp, #4] + ldrb r1, [r3, #0x1d] + lsls r1, r1, #3 + ldr r0, _0802A6AC @ =gOamMallocBuffer + adds r2, r1, r0 + ldrh r0, [r3, #0x14] + movs r4, #0xf8 + lsls r4, r4, #3 + adds r1, r4, #0 + ands r0, r1 + lsrs r0, r0, #6 + str r2, [sp, #0x48] + bl OamMalloc + adds r4, r0, #0 + ldr r0, _0802A6B0 @ =iwram_end + ldr r0, [r0] + ldr r2, [sp, #0x48] + cmp r0, r4 + beq _0802A69C + ldr r1, _0802A6B4 @ =0x040000D4 + str r2, [r1] + str r4, [r1, #4] + ldr r0, _0802A6B8 @ =0x80000003 + str r0, [r1, #8] + ldr r0, [r1, #8] + ldrh r3, [r4, #2] + movs r1, #0xfe + lsls r1, r1, #8 + adds r0, r1, #0 + ands r3, r0 + strh r3, [r4, #2] + ldrh r2, [r4] + movs r1, #0xff + lsls r1, r1, #8 + adds r0, r1, #0 + ands r2, r0 + strh r2, [r4] + ldr r1, _0802A6BC @ =gCamera + ldr r0, [r1, #4] + subs r0, r6, r0 + ldr r6, [sp, #0xc] + ldrh r1, [r6, #0xa] + subs r0, r0, r1 + movs r1, #0xff + ands r0, r1 + adds r2, r2, r0 + strh r2, [r4] + ldr r1, _0802A6BC @ =gCamera + ldr r0, [r1] + subs r0, r7, r0 + ldrh r1, [r6, #8] + subs r0, r0, r1 + ldr r2, _0802A6C0 @ =0x000001FF + adds r1, r2, #0 + ands r0, r1 + adds r3, r3, r0 + strh r3, [r4, #2] +_0802A64C: + ldr r0, [sp, #0x18] + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x18] +_0802A656: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A660 + b _0802A562 +_0802A660: + mov r0, r8 + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + lsls r1, r0, #8 + ldr r3, _0802A6BC @ =gCamera + ldr r0, [r3] + adds r0, #0xf0 + cmp r1, r0 + bge _0802A67E + ldr r4, [sp, #0x10] + cmp r8, r4 + bhs _0802A67E + b _0802A542 +_0802A67E: + mov r0, sl + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + lsls r1, r0, #8 + ldr r2, _0802A6BC @ =gCamera + ldr r0, [r2, #4] +_0802A68E: + adds r0, #0xa0 + cmp r1, r0 + bge _0802A69C + ldr r6, [sp, #0x14] + cmp sl, r6 + bhs _0802A69C + b _0802A528 +_0802A69C: + 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 +_0802A6AC: .4byte gOamMallocBuffer +_0802A6B0: .4byte iwram_end +_0802A6B4: .4byte 0x040000D4 +_0802A6B8: .4byte 0x80000003 +_0802A6BC: .4byte gCamera +_0802A6C0: .4byte 0x000001FF + +.syntax divided diff --git a/data/data_0.s b/data/data_0.s new file mode 100644 index 000000000..448ab0c1e --- /dev/null +++ b/data/data_0.s @@ -0,0 +1,253 @@ +.include "asm/macros/c_decl.inc" +.include "asm/macros/portable.inc" +.include "asm/macros/function.inc" +.include "constants/gba_constants.inc" +.include "constants/misc_constants.inc" + +.section .rodata + + .global gUnknown_080CE438 +gUnknown_080CE438: + .incbin "baserom_sa3.gba", 0x000CE438, 0x7A + + .global gUnknown_080CE4B2 +gUnknown_080CE4B2: + .incbin "baserom_sa3.gba", 0x000CE4B2, 0x7A + + .global gUnknown_080CE52C +gUnknown_080CE52C: + .incbin "baserom_sa3.gba", 0x000CE52C, 0x1C + + .global gUnknown_080CE548 +gUnknown_080CE548: + .incbin "baserom_sa3.gba", 0x000CE548, 0x4 + + .global gUnknown_080CE54C +gUnknown_080CE54C: + .incbin "baserom_sa3.gba", 0x000CE54C, 0x6C + + .global gUnknown_080CE5B8 +gUnknown_080CE5B8: + .incbin "baserom_sa3.gba", 0x000CE5B8, 0x12 + + .global gUnknown_080CE5CA +gUnknown_080CE5CA: + .incbin "baserom_sa3.gba", 0x000CE5CA, 0x14 + + .global gCharVoicesLifeLost +gCharVoicesLifeLost: + .short 0x267, 0x27A, 0x26B, 0x270, 0x276 + + .global gUnknown_080CE5E8 +gUnknown_080CE5E8: + .incbin "baserom_sa3.gba", 0x000CE5E8, 0xA + + .global gUnknown_080CE5F2 +gUnknown_080CE5F2: + .incbin "baserom_sa3.gba", 0x000CE5F2, 0xA + + .global gUnknown_080CE5FC +gUnknown_080CE5FC: + .incbin "baserom_sa3.gba", 0x000CE5FC, 0x10 + + .global gUnknown_080CE60C +gUnknown_080CE60C: + .incbin "baserom_sa3.gba", 0x000CE60C, 0x10 + + .global gUnknown_080CE61C +gUnknown_080CE61C: + .incbin "baserom_sa3.gba", 0x000CE61C, 0x20 + + .global gUnknown_080CE63C +gUnknown_080CE63C: + .incbin "baserom_sa3.gba", 0x000CE63C, 0x8 + + .global gUnknown_080CE644 +gUnknown_080CE644: + .incbin "baserom_sa3.gba", 0x000CE644, 0x64 + + .global gUnknown_080CE6A8 +gUnknown_080CE6A8: + .incbin "baserom_sa3.gba", 0x000CE6A8, 0x10 + + .global gUnknown_080CE6B8 +gUnknown_080CE6B8: + .incbin "baserom_sa3.gba", 0x000CE6B8, 0x14 + + .global gUnknown_080CE6CC +gUnknown_080CE6CC: + mPtr Player_8005BD4 + mPtr Player_8005CB8 + mPtr Player_8005DAC + mPtr sub_800D8DC + mPtr Player_8005E80 + mPtr Player_800D944 + mPtr Player_800613C + mPtr Player_80061D8 + mPtr Player_800A168 + mPtr sub_800DF9C + mPtr Player_HitWithoutRingsUpdate + mPtr sub_800913C + mPtr sub_8009518 + mPtr sub_80095E8 + mPtr Player_800AAC0 + mPtr Player_800AB48 + mPtr Player_800E348 + mPtr Player_800E370 + mPtr Player_800E398 + mPtr Player_800E3C4 + mPtr sub_800AF98 + mPtr Player_800E3EC + mPtr Player_800B004 + mPtr Player_800E468 + mPtr Player_800E490 + mPtr Player_800E4B8 + mPtr Player_800E4E0 + mPtr Player_800B128 + mPtr Player_800E564 + mPtr Player_800ED14 + mPtr Player_800ED34 + mPtr Player_800ED4C + mPtr Player_800DD0C + mPtr Player_800DD28 + mPtr Player_800B5A4 + mPtr Player_800DD44 + mPtr Player_800DDB4 + mPtr Player_800B628 + mPtr Player_800DDD0 + mPtr Player_800DE48 + mPtr Player_800B6C4 + mPtr Player_800B748 + mPtr Player_IceLauncherLaunch + mPtr Player_800B920 + mPtr Player_800DEC4 + mPtr Player_CollideGroundAfterIceLauncher + mPtr Player_800B81C + mPtr Player_nullsub_800EAA8 + mPtr Player_800E604 + mPtr Player_800DB7C + mPtr Player_800DCB4 + mPtr Player_800DBE8 + mPtr sub_800DC50 + mPtr 0 + + .global gUnknown_080CE7A4 +gUnknown_080CE7A4: + .incbin "baserom_sa3.gba", 0x000CE7A4, 0x4 + + .global gUnknown_080CE7A8 +gUnknown_080CE7A8: + .incbin "baserom_sa3.gba", 0x000CE7A8, 0x8 + + .global gUnknown_080CE7B0 +gUnknown_080CE7B0: + .incbin "baserom_sa3.gba", 0x000CE7B0, 0x8 + + .global gUnknown_080CE7B8 +gUnknown_080CE7B8: + .incbin "baserom_sa3.gba", 0x000CE7B8, 0x8 + + .global gUnknown_080CE7C0 +gUnknown_080CE7C0: + .incbin "baserom_sa3.gba", 0x000CE7C0, 0x8 + + .global gUnknown_080CE7C8 +gUnknown_080CE7C8: + .incbin "baserom_sa3.gba", 0x000CE7C8, 0x10 + + @ NOTE: Should likely belong to player.c! + .global gPlayerCharacterIdleAnims +gPlayerCharacterIdleAnims: + .short 0x0000, 0x00A3, 0x0146, 0x01E9, 0x028C + + @ TODO: Maybe sCharStateAnimInfo ? + .global gUnknown_080CE7E2 +gUnknown_080CE7E2: + .incbin "baserom_sa3.gba", 0x000CE7E2, 0x4D0 + + .global gUnknown_080CECB2 +gUnknown_080CECB2: + .incbin "baserom_sa3.gba", 0x000CECB2, 0x14 + + .global gUnknown_080CECC6 +gUnknown_080CECC6: + .incbin "baserom_sa3.gba", 0x000CECC6, 0xA + + .global gUnknown_080CECD0 +gUnknown_080CECD0: + .incbin "baserom_sa3.gba", 0x000CECD0, 0x14 + + .global gUnknown_080CECE4 +gUnknown_080CECE4: + .incbin "baserom_sa3.gba", 0x000CECE4, 0x14 + + .global gUnknown_080CECF8 +gUnknown_080CECF8: + .incbin "baserom_sa3.gba", 0x000CECF8, 0x60 + + .global gUnknown_080CED58 +gUnknown_080CED58: + .incbin "baserom_sa3.gba", 0x000CED58, 0x38 + + .global gUnknown_080CED90 +gUnknown_080CED90: + .incbin "baserom_sa3.gba", 0x000CED90, 0x58 + + .global gUnknown_080CEDE8 +gUnknown_080CEDE8: + .incbin "baserom_sa3.gba", 0x000CEDE8, 0x38 + + .global gUnknown_080CEE20 +gUnknown_080CEE20: + .incbin "baserom_sa3.gba", 0x000CEE20, 0x5 + + .global gUnknown_080CEE25 +gUnknown_080CEE25: + .incbin "baserom_sa3.gba", 0x000CEE25, 0x1B + + .global gUnknown_080CEE40 +gUnknown_080CEE40: + .incbin "baserom_sa3.gba", 0x000CEE40, 0x80 + + .global gUnknown_080CEEC0 +gUnknown_080CEEC0: + .incbin "baserom_sa3.gba", 0x000CEEC0, 0xC + + .global gUnknown_080CEECC +gUnknown_080CEECC: + .incbin "baserom_sa3.gba", 0x000CEECC, 0xC + + .global gUnknown_080CEED8 +gUnknown_080CEED8: + mPtr gPayload_08E2F418 + mPtr gPayload_08E31880 + mPtr gPayload_08E31880 + mPtr gPayload_08E33C30 + mPtr gPayload_08E33C30 + mPtr gPayload_08E360A4 + mPtr gPayload_08E360A4 + mPtr gPayload_08E38464 + mPtr gPayload_08E38464 + mPtr gPayload_08E3A7F0 + mPtr gPayload_08E3A7F0 + mPtr gPayload_08E3CB98 + + .global gUnknown_080CEF08 +gUnknown_080CEF08: + mPtr gUnknown_08E6DBE4 + mPtr gUnknown_08E74E1C + mPtr gUnknown_08E66DB4 + mPtr gUnknown_08E62B0C + mPtr NULL + mPtr gPayload_08E3CB9C + mPtr gUnknown_08E44B9C + mPtr gUnknown_08E4CB9C + mPtr gUnknown_08E54B9C + + .global gUnknown_080CEF2C +gUnknown_080CEF2C: + .incbin "baserom_sa3.gba", 0x000CEF2C, 0x24 + + .global gUnknown_080CEF50 +gUnknown_080CEF50: + .short 0x0000, 0x0146, 0x01E9, 0x028C diff --git a/data/data.s b/data/data_0_1.s similarity index 78% rename from data/data.s rename to data/data_0_1.s index c72b694ce..8ec4d0dd0 100644 --- a/data/data.s +++ b/data/data_0_1.s @@ -6,256 +6,6 @@ .section .rodata - .global gUnknown_080CE438 -gUnknown_080CE438: - .incbin "baserom_sa3.gba", 0x000CE438, 0x7A - - .global gUnknown_080CE4B2 -gUnknown_080CE4B2: - .incbin "baserom_sa3.gba", 0x000CE4B2, 0x7A - - .global gUnknown_080CE52C -gUnknown_080CE52C: - .incbin "baserom_sa3.gba", 0x000CE52C, 0x1C - - .global gUnknown_080CE548 -gUnknown_080CE548: - .incbin "baserom_sa3.gba", 0x000CE548, 0x4 - - .global gUnknown_080CE54C -gUnknown_080CE54C: - .incbin "baserom_sa3.gba", 0x000CE54C, 0x6C - - .global gUnknown_080CE5B8 -gUnknown_080CE5B8: - .incbin "baserom_sa3.gba", 0x000CE5B8, 0x12 - - .global gUnknown_080CE5CA -gUnknown_080CE5CA: - .incbin "baserom_sa3.gba", 0x000CE5CA, 0x14 - - .global gCharVoicesLifeLost -gCharVoicesLifeLost: - .short 0x267, 0x27A, 0x26B, 0x270, 0x276 - - .global gUnknown_080CE5E8 -gUnknown_080CE5E8: - .incbin "baserom_sa3.gba", 0x000CE5E8, 0xA - - .global gUnknown_080CE5F2 -gUnknown_080CE5F2: - .incbin "baserom_sa3.gba", 0x000CE5F2, 0xA - - .global gUnknown_080CE5FC -gUnknown_080CE5FC: - .incbin "baserom_sa3.gba", 0x000CE5FC, 0x10 - - .global gUnknown_080CE60C -gUnknown_080CE60C: - .incbin "baserom_sa3.gba", 0x000CE60C, 0x10 - - .global gUnknown_080CE61C -gUnknown_080CE61C: - .incbin "baserom_sa3.gba", 0x000CE61C, 0x20 - - .global gUnknown_080CE63C -gUnknown_080CE63C: - .incbin "baserom_sa3.gba", 0x000CE63C, 0x8 - - .global gUnknown_080CE644 -gUnknown_080CE644: - .incbin "baserom_sa3.gba", 0x000CE644, 0x64 - - .global gUnknown_080CE6A8 -gUnknown_080CE6A8: - .incbin "baserom_sa3.gba", 0x000CE6A8, 0x10 - - .global gUnknown_080CE6B8 -gUnknown_080CE6B8: - .incbin "baserom_sa3.gba", 0x000CE6B8, 0x14 - - .global gUnknown_080CE6CC -gUnknown_080CE6CC: - mPtr Player_8005BD4 - mPtr Player_8005CB8 - mPtr Player_8005DAC - mPtr sub_800D8DC - mPtr Player_8005E80 - mPtr Player_800D944 - mPtr Player_800613C - mPtr Player_80061D8 - mPtr Player_800A168 - mPtr sub_800DF9C - mPtr Player_HitWithoutRingsUpdate - mPtr sub_800913C - mPtr sub_8009518 - mPtr sub_80095E8 - mPtr Player_800AAC0 - mPtr Player_800AB48 - mPtr Player_800E348 - mPtr Player_800E370 - mPtr Player_800E398 - mPtr Player_800E3C4 - mPtr sub_800AF98 - mPtr Player_800E3EC - mPtr Player_800B004 - mPtr Player_800E468 - mPtr Player_800E490 - mPtr Player_800E4B8 - mPtr Player_800E4E0 - mPtr Player_800B128 - mPtr Player_800E564 - mPtr Player_800ED14 - mPtr Player_800ED34 - mPtr Player_800ED4C - mPtr Player_800DD0C - mPtr Player_800DD28 - mPtr Player_800B5A4 - mPtr Player_800DD44 - mPtr Player_800DDB4 - mPtr Player_800B628 - mPtr Player_800DDD0 - mPtr Player_800DE48 - mPtr Player_800B6C4 - mPtr Player_800B748 - mPtr Player_IceLauncherLaunch - mPtr Player_800B920 - mPtr Player_800DEC4 - mPtr Player_CollideGroundAfterIceLauncher - mPtr Player_800B81C - mPtr Player_nullsub_800EAA8 - mPtr Player_800E604 - mPtr Player_800DB7C - mPtr Player_800DCB4 - mPtr Player_800DBE8 - mPtr sub_800DC50 - mPtr 0 - - .global gUnknown_080CE7A4 -gUnknown_080CE7A4: - .incbin "baserom_sa3.gba", 0x000CE7A4, 0x4 - - .global gUnknown_080CE7A8 -gUnknown_080CE7A8: - .incbin "baserom_sa3.gba", 0x000CE7A8, 0x8 - - .global gUnknown_080CE7B0 -gUnknown_080CE7B0: - .incbin "baserom_sa3.gba", 0x000CE7B0, 0x8 - - .global gUnknown_080CE7B8 -gUnknown_080CE7B8: - .incbin "baserom_sa3.gba", 0x000CE7B8, 0x8 - - .global gUnknown_080CE7C0 -gUnknown_080CE7C0: - .incbin "baserom_sa3.gba", 0x000CE7C0, 0x8 - - .global gUnknown_080CE7C8 -gUnknown_080CE7C8: - .incbin "baserom_sa3.gba", 0x000CE7C8, 0x10 - - @ NOTE: Should likely belong to player.c! - .global gPlayerCharacterIdleAnims -gPlayerCharacterIdleAnims: - .short 0x0000, 0x00A3, 0x0146, 0x01E9, 0x028C - - @ TODO: Maybe sCharStateAnimInfo ? - .global gUnknown_080CE7E2 -gUnknown_080CE7E2: - .incbin "baserom_sa3.gba", 0x000CE7E2, 0x4D0 - - .global gUnknown_080CECB2 -gUnknown_080CECB2: - .incbin "baserom_sa3.gba", 0x000CECB2, 0x14 - - .global gUnknown_080CECC6 -gUnknown_080CECC6: - .incbin "baserom_sa3.gba", 0x000CECC6, 0xA - - .global gUnknown_080CECD0 -gUnknown_080CECD0: - .incbin "baserom_sa3.gba", 0x000CECD0, 0x14 - - .global gUnknown_080CECE4 -gUnknown_080CECE4: - .incbin "baserom_sa3.gba", 0x000CECE4, 0x14 - - .global gUnknown_080CECF8 -gUnknown_080CECF8: - .incbin "baserom_sa3.gba", 0x000CECF8, 0x60 - - .global gUnknown_080CED58 -gUnknown_080CED58: - .incbin "baserom_sa3.gba", 0x000CED58, 0x38 - - .global gUnknown_080CED90 -gUnknown_080CED90: - .incbin "baserom_sa3.gba", 0x000CED90, 0x58 - - .global gUnknown_080CEDE8 -gUnknown_080CEDE8: - .incbin "baserom_sa3.gba", 0x000CEDE8, 0x38 - - .global gUnknown_080CEE20 -gUnknown_080CEE20: - .incbin "baserom_sa3.gba", 0x000CEE20, 0x5 - - .global gUnknown_080CEE25 -gUnknown_080CEE25: - .incbin "baserom_sa3.gba", 0x000CEE25, 0x1B - - .global gUnknown_080CEE40 -gUnknown_080CEE40: - .incbin "baserom_sa3.gba", 0x000CEE40, 0x80 - - .global gUnknown_080CEEC0 -gUnknown_080CEEC0: - .incbin "baserom_sa3.gba", 0x000CEEC0, 0xC - - .global gUnknown_080CEECC -gUnknown_080CEECC: - .incbin "baserom_sa3.gba", 0x000CEECC, 0xC - - .global gUnknown_080CEED8 -gUnknown_080CEED8: - mPtr gPayload_08E2F418 - mPtr gPayload_08E31880 - mPtr gPayload_08E31880 - mPtr gPayload_08E33C30 - mPtr gPayload_08E33C30 - mPtr gPayload_08E360A4 - mPtr gPayload_08E360A4 - mPtr gPayload_08E38464 - mPtr gPayload_08E38464 - mPtr gPayload_08E3A7F0 - mPtr gPayload_08E3A7F0 - mPtr gPayload_08E3CB98 - - .global gUnknown_080CEF08 -gUnknown_080CEF08: - mPtr gUnknown_08E6DBE4 - mPtr gUnknown_08E74E1C - mPtr gUnknown_08E66DB4 - mPtr gUnknown_08E62B0C - mPtr NULL - mPtr gPayload_08E3CB9C - mPtr gUnknown_08E44B9C - mPtr gUnknown_08E4CB9C - mPtr gUnknown_08E54B9C - - .global gUnknown_080CEF2C -gUnknown_080CEF2C: - .incbin "baserom_sa3.gba", 0x000CEF2C, 0x24 - - .global gUnknown_080CEF50 -gUnknown_080CEF50: - .incbin "baserom_sa3.gba", 0x000CEF50, 0x8 - - .global gUnknown_080CEF58 -gUnknown_080CEF58: - .incbin "baserom_sa3.gba", 0x000CEF58, 73*4 @ size = * - .global gSpriteInits_Enemies gSpriteInits_Enemies: @ 0x080CF07C mPtr CreateEntity_Spinner diff --git a/data/gfx_data_0.s b/data/gfx_data_0.s index 9c36f2c6a..5423f8466 100644 --- a/data/gfx_data_0.s +++ b/data/gfx_data_0.s @@ -7,8 +7,199 @@ .global gUnknown_082B9CD4 gUnknown_082B9CD4: - .incbin "baserom_sa3.gba", 0x002B9CD4, 0x2045C + .incbin "baserom_sa3.gba", 0x002B9CD4, 0x1464 + + .global zone1_act1_rings +zone1_act1_rings: + .incbin "baserom_sa3.gba", 0x002BB138, 0x7AC + + .global zone1_zone_map_rings +zone1_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002BB8E4, 0x1870 + + .global zone1_act2_rings +zone1_act2_rings: + .incbin "baserom_sa3.gba", 0x002BD154, 0x1688 + + .global zone1_act3_rings +zone1_act3_rings: + .incbin "baserom_sa3.gba", 0x002BE7DC, 0x600 + + .global sonic_factory_rings +sonic_factory_rings: + .incbin "baserom_sa3.gba", 0x002BEDDC, 0x50 + + @ Dummy for all capsule minigames (they do not have rings) + .global zone1_bonus_capsule_rings +zone1_bonus_capsule_rings: + .incbin "baserom_sa3.gba", 0x002BEE2C, 0x134 + + .global zone1_bonus_enemies_rings +zone1_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002BEF60, 0x16C + + .global zone2_zone_map_rings +zone2_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002BF0CC, 0x18CC + + .global zone2_act1_rings +zone2_act1_rings: + .incbin "baserom_sa3.gba", 0x002C0998, 0x1678 + + .global zone2_act2_rings +zone2_act2_rings: + .incbin "baserom_sa3.gba", 0x002C2010, 0x12C4 + + .global zone2_act3_rings +zone2_act3_rings: + .incbin "baserom_sa3.gba", 0x002C32D4, 0x344 + + .global chao_playground_rings +chao_playground_rings: + .incbin "baserom_sa3.gba", 0x002C3618, 0x174 + + .global zone2_bonus_enemies_rings +zone2_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002C378C, 0x228 + + .global zone3_zone_map_rings +zone3_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002C39B4, 0x119C + + .global zone3_act1_rings +zone3_act1_rings: + .incbin "baserom_sa3.gba", 0x002C4B50, 0x1848 + + .global zone3_act2_rings +zone3_act2_rings: + .incbin "baserom_sa3.gba", 0x002C6398, 0x1234 + + .global zone3_act3_rings +zone3_act3_rings: + .incbin "baserom_sa3.gba", 0x002C75CC, 0x480 + + .global zone3_bonus_enemies_rings +zone3_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002C7A4C, 0x254 + + .global zone4_zone_map_rings +zone4_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002C7CA0, 0xBBC + + .global zone4_act1_rings +zone4_act1_rings: + .incbin "baserom_sa3.gba", 0x002C885C, 0xDB0 + + .global zone4_act2_rings +zone4_act2_rings: + .incbin "baserom_sa3.gba", 0x002C960C, 0xCF0 + + .global zone4_act3_rings +zone4_act3_rings: + .incbin "baserom_sa3.gba", 0x002CA2FC, 0x45C + + .global zone4_bonus_enemies_rings +zone4_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002CA758, 0x258 + + .global zone5_zone_map_rings +zone5_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002CA9B0, 0x10EC + + .global zone5_act1_rings +zone5_act1_rings: + .incbin "baserom_sa3.gba", 0x002CBA9C, 0x1624 + + .global zone5_act2_rings +zone5_act2_rings: + .incbin "baserom_sa3.gba", 0x002CD0C0, 0x1558 + + .global zone5_act3_rings +zone5_act3_rings: + .incbin "baserom_sa3.gba", 0x002CE618, 0x694 + + .global zone5_bonus_enemies_rings +zone5_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002CECAC, 0x324 + + .global zone6_zone_map_rings +zone6_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002CEFD0, 0x2B64 + + .global zone6_act1_rings +zone6_act1_rings: + .incbin "baserom_sa3.gba", 0x002D1B34, 0x1B00 + + .global zone6_act2_rings +zone6_act2_rings: + .incbin "baserom_sa3.gba", 0x002D3634, 0x1280 + + .global zone6_act3_rings +zone6_act3_rings: + .incbin "baserom_sa3.gba", 0x002D48B4, 0x558 + + .global zone6_bonus_enemies_rings +zone6_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002D4E0C, 0x1DC + + .global zone7_zone_map_rings +zone7_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002D4FE8, 0x187C + + .global zone7_act1_rings +zone7_act1_rings: + .incbin "baserom_sa3.gba", 0x002D6864, 0x2298 + + .global zone7_act2_rings +zone7_act2_rings: + .incbin "baserom_sa3.gba", 0x002D8AFC, 0xCD4 + + .global zone7_act3_rings +zone7_act3_rings: + .incbin "baserom_sa3.gba", 0x002D97D0, 0x3C0 + + .global zone7_bonus_enemies_rings +zone7_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002D9B90, 0x60 + + .global altar_emerald_rings +altar_emerald_rings: + .incbin "baserom_sa3.gba", 0x002D9BF0, 0x7C + + .global nonaggression_rings +nonaggression_rings: + .incbin "baserom_sa3.gba", 0x002D9C6C, 0xDC + + .global zone1_boss_rings +zone1_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9D48, 0xA8 + + .global zone2_boss_rings +zone2_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9DF0, 0x90 + + .global zone3_boss_rings +zone3_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9E80, 0x94 + + .global zone4_boss_rings +zone4_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9F14, 0xA0 + + .global zone5_boss_rings +zone5_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9FB4, 0x8C + + .global zone6_boss_rings +zone6_boss_rings: + .incbin "baserom_sa3.gba", 0x002DA040, 0xA0 + + .global zone7_boss_rings +zone7_boss_rings: + .incbin "baserom_sa3.gba", 0x002DA0E0, 0x50 .global gUnknown_082DA130 gUnknown_082DA130: .incbin "baserom_sa3.gba", 0x002DA130, 0x3C0 + +@ --- 0x082DA4F0 --- diff --git a/include/game/assets/compressed/entities.h b/include/game/assets/compressed/entities.h new file mode 100644 index 000000000..1d29affc6 --- /dev/null +++ b/include/game/assets/compressed/entities.h @@ -0,0 +1,182 @@ +#ifndef GUARD_DATA_ENTITIES_H +#define GUARD_DATA_ENTITIES_H +#include "global.h" + +extern const u8 sonic_factory_rings[]; +extern const u8 chao_playground_rings[]; + +extern const u8 zone1_zone_map_rings[]; + +extern const u8 zone1_act1_rings[]; +extern const u8 zone1_act1_enemies[]; +extern const u8 zone1_act1_itemboxes[]; +extern const u8 zone1_act1_interactables[]; + +extern const u8 zone1_act2_rings[]; +extern const u8 zone1_act2_enemies[]; +extern const u8 zone1_act2_itemboxes[]; +extern const u8 zone1_act2_interactables[]; + +extern const u8 zone1_act3_rings[]; +extern const u8 zone1_act3_enemies[]; +extern const u8 zone1_act3_itemboxes[]; +extern const u8 zone1_act3_interactables[]; + +// Shared amongst all zones +extern const u8 zone1_bonus_capsule_rings[]; + +extern const u8 zone1_bonus_enemies_rings[]; + +extern const u8 zone1_boss_rings[]; +extern const u8 zone1_boss_enemies[]; +extern const u8 zone1_boss_itemboxes[]; +extern const u8 zone1_boss_interactables[]; + +extern const u8 zone2_zone_map_rings[]; + +extern const u8 zone2_act1_rings[]; +extern const u8 zone2_act1_enemies[]; +extern const u8 zone2_act1_itemboxes[]; +extern const u8 zone2_act1_interactables[]; + +extern const u8 zone2_act2_rings[]; +extern const u8 zone2_act2_enemies[]; +extern const u8 zone2_act2_itemboxes[]; +extern const u8 zone2_act2_interactables[]; + +extern const u8 zone2_act3_rings[]; +extern const u8 zone2_act3_enemies[]; +extern const u8 zone2_act3_itemboxes[]; +extern const u8 zone2_act3_interactables[]; + +extern const u8 zone2_bonus_enemies_rings[]; + +extern const u8 zone2_boss_rings[]; +extern const u8 zone2_boss_enemies[]; +extern const u8 zone2_boss_itemboxes[]; +extern const u8 zone2_boss_interactables[]; + +extern const u8 zone3_zone_map_rings[]; + +extern const u8 zone3_act1_rings[]; +extern const u8 zone3_act1_enemies[]; +extern const u8 zone3_act1_itemboxes[]; +extern const u8 zone3_act1_interactables[]; + +extern const u8 zone3_act2_rings[]; +extern const u8 zone3_act2_enemies[]; +extern const u8 zone3_act2_itemboxes[]; +extern const u8 zone3_act2_interactables[]; + +extern const u8 zone3_act3_rings[]; +extern const u8 zone3_act3_enemies[]; +extern const u8 zone3_act3_itemboxes[]; +extern const u8 zone3_act3_interactables[]; + +extern const u8 zone3_bonus_enemies_rings[]; + +extern const u8 zone3_boss_rings[]; +extern const u8 zone3_boss_enemies[]; +extern const u8 zone3_boss_itemboxes[]; +extern const u8 zone3_boss_interactables[]; + +extern const u8 zone4_zone_map_rings[]; + +extern const u8 zone4_act1_rings[]; +extern const u8 zone4_act1_enemies[]; +extern const u8 zone4_act1_itemboxes[]; +extern const u8 zone4_act1_interactables[]; + +extern const u8 zone4_act2_rings[]; +extern const u8 zone4_act2_enemies[]; +extern const u8 zone4_act2_itemboxes[]; +extern const u8 zone4_act2_interactables[]; + +extern const u8 zone4_act3_rings[]; +extern const u8 zone4_act3_enemies[]; +extern const u8 zone4_act3_itemboxes[]; +extern const u8 zone4_act3_interactables[]; + +extern const u8 zone4_bonus_enemies_rings[]; + +extern const u8 zone4_boss_rings[]; +extern const u8 zone4_boss_enemies[]; +extern const u8 zone4_boss_itemboxes[]; +extern const u8 zone4_boss_interactables[]; + +extern const u8 zone5_zone_map_rings[]; + +extern const u8 zone5_act1_rings[]; +extern const u8 zone5_act1_enemies[]; +extern const u8 zone5_act1_itemboxes[]; +extern const u8 zone5_act1_interactables[]; + +extern const u8 zone5_act2_rings[]; +extern const u8 zone5_act2_enemies[]; +extern const u8 zone5_act2_itemboxes[]; +extern const u8 zone5_act2_interactables[]; + +extern const u8 zone5_act3_rings[]; +extern const u8 zone5_act3_enemies[]; +extern const u8 zone5_act3_itemboxes[]; +extern const u8 zone5_act3_interactables[]; + +extern const u8 zone5_bonus_enemies_rings[]; + +extern const u8 zone5_boss_rings[]; +extern const u8 zone5_boss_enemies[]; +extern const u8 zone5_boss_itemboxes[]; +extern const u8 zone5_boss_interactables[]; + +extern const u8 zone6_zone_map_rings[]; + +extern const u8 zone6_act1_rings[]; +extern const u8 zone6_act1_enemies[]; +extern const u8 zone6_act1_itemboxes[]; +extern const u8 zone6_act1_interactables[]; + +extern const u8 zone6_act2_rings[]; +extern const u8 zone6_act2_enemies[]; +extern const u8 zone6_act2_itemboxes[]; +extern const u8 zone6_act2_interactables[]; + +extern const u8 zone6_act3_rings[]; +extern const u8 zone6_act3_enemies[]; +extern const u8 zone6_act3_itemboxes[]; +extern const u8 zone6_act3_interactables[]; + +extern const u8 zone6_bonus_enemies_rings[]; + +extern const u8 zone6_boss_rings[]; +extern const u8 zone6_boss_enemies[]; +extern const u8 zone6_boss_itemboxes[]; +extern const u8 zone6_boss_interactables[]; + +extern const u8 zone7_zone_map_rings[]; + +extern const u8 zone7_act1_rings[]; +extern const u8 zone7_act1_enemies[]; +extern const u8 zone7_act1_itemboxes[]; +extern const u8 zone7_act1_interactables[]; + +extern const u8 zone7_act2_rings[]; +extern const u8 zone7_act2_enemies[]; +extern const u8 zone7_act2_itemboxes[]; +extern const u8 zone7_act2_interactables[]; + +extern const u8 zone7_act3_rings[]; +extern const u8 zone7_act3_enemies[]; +extern const u8 zone7_act3_itemboxes[]; +extern const u8 zone7_act3_interactables[]; + +extern const u8 zone7_bonus_enemies_rings[]; + +extern const u8 zone7_boss_rings[]; +extern const u8 zone7_boss_enemies[]; +extern const u8 zone7_boss_itemboxes[]; +extern const u8 zone7_boss_interactables[]; + +extern const u8 altar_emerald_rings[]; +extern const u8 nonaggression_rings[]; + +#endif // GUARD_DATA_ENTITIES_H diff --git a/include/game/sa1_sa2_shared/rings_manager.h b/include/game/sa1_sa2_shared/rings_manager.h new file mode 100644 index 000000000..ce49ea5c1 --- /dev/null +++ b/include/game/sa1_sa2_shared/rings_manager.h @@ -0,0 +1,44 @@ +#ifndef GUARD_RINGS_MANAGER_H +#define GUARD_RINGS_MANAGER_H + +#include "global.h" +#include "rect.h" +#include "constants/zones.h" + +#define MP_COLLECT_RINGS_COMPRESSED_POS_DATA ((u8 **)(EWRAM_START + 0x33008)) +#define MP_COLLECT_RINGS_COMPRESSED_SIZE (u8 **)(EWRAM_START + 0x3300C) +#define MP_COLLECT_RINGS_BUFFER (u8 *)(EWRAM_START + 0x3F000) + +#ifndef COLLECT_RINGS_ROM +#define RESERVED_RING_TILES_VRAM (void *)(OBJ_VRAM0 + 0x1F00) +#else +#define RESERVED_RING_TILES_VRAM (void *)(OBJ_VRAM0 + 0x2E40) +#endif + +#ifndef COLLECT_RINGS_ROM +#define RESERVED_RING_EFFECT_TILES_VRAM (void *)(OBJ_VRAM0 + 0x2100) +#else +#define RESERVED_RING_EFFECT_TILES_VRAM (void *)(OBJ_VRAM0 + 0x3040) +#endif + +#define RECT_TOUCHING_RING(posX, posY, ringIntX, ringIntY, rect) \ + ((((ringIntX - TILE_WIDTH) <= RECT_LEFT((posX), rect) && (ringIntX + TILE_WIDTH) >= RECT_LEFT((posX), rect)) \ + || ((ringIntX - TILE_WIDTH) >= RECT_LEFT((posX), rect) && RECT_RIGHT((posX), rect) >= (ringIntX - TILE_WIDTH))) \ + && ((((ringIntY - (TILE_WIDTH * 2)) <= RECT_TOP((posY), rect) && ringIntY >= RECT_TOP((posY), rect)) \ + || ((ringIntY - (TILE_WIDTH * 2)) >= RECT_TOP((posY), rect) && RECT_BOTTOM((posY), rect) >= (ringIntY - (TILE_WIDTH * 2)))))) + +#define HB_TOUCHING_RING(posX, posY, ringIntX, ringIntY, hb) \ + ((((ringIntX - TILE_WIDTH) <= HB_LEFT((posX), hb) && (ringIntX + TILE_WIDTH) >= HB_LEFT((posX), hb)) \ + || ((ringIntX - TILE_WIDTH) >= HB_LEFT((posX), hb) && HB_RIGHT((posX), hb) >= (ringIntX - TILE_WIDTH))) \ + && ((((ringIntY - (TILE_WIDTH * 2)) <= HB_TOP((posY), hb) && ringIntY >= HB_TOP((posY), hb)) \ + || ((ringIntY - (TILE_WIDTH * 2)) >= HB_TOP((posY), hb) && HB_BOTTOM((posY), hb) >= (ringIntY - (TILE_WIDTH * 2)))))) + +extern const u8 *const gSpritePosData_rings[NUM_LEVEL_IDS]; + +void AddRings(s32 count); +void CreateStageRingsManager(void); +void CreateCollectRingEffect( + s32 param0, s32 param1); // NOTE: this *should* take s16 parameters, see comment inside CreateCollectRingEffect for more details! +void CreateCollectRingEffectNoSfx(s16 worldX, s16 worldY); + +#endif // GUARD_RINGS_MANAGER_H \ No newline at end of file diff --git a/include/module_unclear.h b/include/module_unclear.h index ce6f380d0..3c0bb1d26 100644 --- a/include/module_unclear.h +++ b/include/module_unclear.h @@ -126,7 +126,6 @@ typedef struct Strc3001CFC { extern struct Task *gTask_03001CFC; // -> Strc3001CFC s32 sub_8011BFC(u8, Player *p); -extern void sub_8029C54(s32 param0, s32 param1); void sub_80533F4(u32 character); // related to Special Springs diff --git a/include/sprite.h b/include/sprite.h index 0070ec0f1..b00f20941 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -122,6 +122,11 @@ typedef struct { /* 0x0A */ s16 offsetY; } SpriteOffset; +typedef struct SpriteOffset2 { + SpriteOffset base; + u8 padding[4]; +} SpriteOffset2; + // TODO: Verify "(in)active" name #define HITBOX_STATE_INACTIVE -1 #define HITBOX_IS_ACTIVE(hb) ((hb).index != HITBOX_STATE_INACTIVE) diff --git a/ldscript.txt b/ldscript.txt index a2c2526f7..fd7889e73 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -27,7 +27,7 @@ SECTIONS { asm/game_over.o(.text); src/game/stage/player.o(.text); asm/code_0_2.o(.text); - asm/game__sa1_sa2_shared__rings_manager.o(.text); + src/game/sa1_sa2_shared/rings_manager.o(.text); asm/code_0_3.o(.text); asm/itembox.o(.text); src/game/interactables/zone_warp.o(.text); @@ -262,7 +262,9 @@ SECTIONS { *libc.a:readr.o(.text); /* data */ - data/data.o(.rodata); + data/data_0.o(.rodata); + src/game/sa1_sa2_shared/rings_manager.o(.rodata); + data/data_0_1.o(.rodata); src/data/tilemap_table.o(.rodata); data/data_1_1.o(.rodata); src/game/math.o(.rodata); diff --git a/src/game/enemies/bu_bu.c b/src/game/enemies/bu_bu.c index 258e5edee..1405eeb2c 100644 --- a/src/game/enemies/bu_bu.c +++ b/src/game/enemies/bu_bu.c @@ -6,6 +6,7 @@ #include "game/camera.h" #include "game/entity.h" #include "game/enemy_unknown.h" +#include "game/sa1_sa2_shared/rings_manager.h" #include "module_unclear.h" #include "game/player.h" #include "game/stage.h" @@ -235,7 +236,8 @@ bool32 sub_805EEB4(BuBu *enemy) } if ((mat1 == 1) && (mat2 == 1)) { - sub_8029C54(I(strc->unk28[i].unk0), I(strc->unk28[i].unk4)); + // // NOTE: this *should* take s16 parameters, see comment inside CreateCollectRingEffect for more details! + CreateCollectRingEffect(I(strc->unk28[i].unk0), I(strc->unk28[i].unk4)); } } } diff --git a/src/game/sa1_sa2_shared/rings_manager.c b/src/game/sa1_sa2_shared/rings_manager.c new file mode 100644 index 000000000..d29f43f32 --- /dev/null +++ b/src/game/sa1_sa2_shared/rings_manager.c @@ -0,0 +1,852 @@ +#include "global.h" +#include "core.h" +#include "malloc_ewram.h" +#include "rect.h" +#include "trig.h" +#include "sprite.h" +#include "lib/m4a/m4a.h" +#include "game/camera.h" +#include "game/entity.h" +#include "game/player.h" +#include "game/stage.h" +#include "game/assets/compressed/entities.h" +#include "game/sa1_sa2_shared/rings_manager.h" +#include "constants/animations.h" +#include "constants/move_states.h" +#include "constants/zones.h" + +void TaskDestructor_RingsMgr(Task *); +void Task_RingsMgrExtraZone(); +void Task_RingsMgrStage(); +void sub_802AB10(s16 arg0, s16 arg1, Player *p); +void Task_802AB8C(); +void Task_802ACF0(); +extern const u8 *const gSpritePosData_rings[]; +extern struct MP2KSongHeader song117; + +typedef struct RingsManager { + /* 0x00 */ Sprite s; + /* 0x28 */ void *rings; +} RingsManager; + +typedef struct RingsMgrUnk2C { + /* 0x00 */ Sprite s; + /* 0x28 */ u8 unk28; + /* 0x29 */ u8 unk29; +} RingsMgrUnk2C; + +typedef struct RingsMgrUnk30 { + /* 0x00 */ Sprite s; + /* 0x28 */ Player *p; + /* 0x2C */ s16 magnitude; +} RingsMgrUnk30; + +#define READ_START_INDEX(p, hrc, rx, ry) (*((u32 *)((((u8 *)(p)) + (((hrc) * (ry)) * (sizeof(u32)))) + ((rx) * (sizeof(u32)))))) +#define DATA_START(data) (void *)((u8 *)(data) - (sizeof(u32) * 2)) + +#define TO_REGION(pos) ((pos) >> 8) + +#define REGION_LOWER(posX, bound, offset) \ + ({ \ + s32 a = (posX); \ + s32 b = (bound); \ + TO_REGION(a + b + offset); \ + }) + +// Swapped for the region upper calc?? +#define REGION_UPPER(posX, bound, offset) \ + ({ \ + s32 a = (posX); \ + s32 b = (bound); \ + TO_REGION(b + a + offset); \ + }) + +#ifndef COLLECT_RINGS_ROM +const u8 *const gSpritePosData_rings[NUM_LEVEL_IDS] = { + NULL, + sonic_factory_rings, + zone1_zone_map_rings, + zone1_act1_rings, + zone1_act2_rings, + zone1_act3_rings, + NULL, + zone1_boss_rings, + zone1_bonus_capsule_rings, + zone1_bonus_enemies_rings, + NULL, + chao_playground_rings, + zone2_zone_map_rings, + zone2_act1_rings, + zone2_act2_rings, + zone2_act3_rings, + NULL, + zone2_boss_rings, + zone1_bonus_capsule_rings, + zone2_bonus_enemies_rings, + NULL, + NULL, + zone3_zone_map_rings, + zone3_act1_rings, + zone3_act2_rings, + zone3_act3_rings, + NULL, + zone3_boss_rings, + zone1_bonus_capsule_rings, + zone3_bonus_enemies_rings, + NULL, + NULL, + zone4_zone_map_rings, + zone4_act1_rings, + zone4_act2_rings, + zone4_act3_rings, + NULL, + zone4_boss_rings, + zone1_bonus_capsule_rings, + zone4_bonus_enemies_rings, + NULL, + NULL, + zone5_zone_map_rings, + zone5_act1_rings, + zone5_act2_rings, + zone5_act3_rings, + NULL, + zone5_boss_rings, + zone1_bonus_capsule_rings, + zone5_bonus_enemies_rings, + NULL, + NULL, + zone6_zone_map_rings, + zone6_act1_rings, + zone6_act2_rings, + zone6_act3_rings, + NULL, + zone6_boss_rings, + zone1_bonus_capsule_rings, + zone6_bonus_enemies_rings, + NULL, + NULL, + zone7_zone_map_rings, + zone7_act1_rings, + zone7_act2_rings, + zone7_act3_rings, + NULL, + zone7_boss_rings, + zone1_bonus_capsule_rings, + zone7_bonus_enemies_rings, + NULL, + altar_emerald_rings, + nonaggression_rings, +}; +#endif + +void CreateStageRingsManager(void) +{ + Task *t; + s32 temp_r4; + s32 var_r0_2; + u16 temp_r0; + u32 **temp_r4_2; + u32 **ringsArray; + u32 **ringsCompressed; + void (*var_r0)(); + RingsManager *temp_r0_2; + s16 mapIndex = gStageData.currMapIndex; + void *var_r5; + Sprite *s; + + if (gStageData.gameMode != 7) { + if (mapIndex != 72) { + t = TaskCreate(Task_RingsMgrStage, sizeof(RingsManager), 0x2800U, 0U, TaskDestructor_RingsMgr); + } else { + t = TaskCreate(Task_RingsMgrExtraZone, sizeof(RingsManager), 0x2800U, 0U, TaskDestructor_RingsMgr); + } + + // NOTE: First 4 byte of RL-compressed data contains uncompressed size. + ringsArray = (u32 **)gSpritePosData_rings; + ringsCompressed = &ringsArray[mapIndex]; + var_r5 = EwramMalloc(**ringsCompressed >> 8); + RLUnCompWram(*ringsCompressed, var_r5); + } + temp_r0_2 = TASK_DATA(t); + temp_r0_2->rings = var_r5; + s = &temp_r0_2->s; + if (gStageData.gameMode < 6) { + s->tiles = OBJ_VRAM0 + 0x4180; + } else if (gStageData.gameMode == 6) { + s->tiles = OBJ_VRAM0 + 0x41A0; + } + + s->frameFlags = 0x41200; + s->anim = ANIM_RING; + s->x = DISPLAY_CENTER_X; + s->y = DISPLAY_CENTER_Y; + s->oamFlags = 0x280; + s->qAnimDelay = 0; + s->prevAnim = 0xFFFF; + s->variant = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->hitboxes[0].index = -1; +} + +void PlayRingCollectSE(void) +{ + if ((gStageData.gameMode != 2) + && (((gStageData.unk4 != 9) && (gStageData.unk4 != 4) && (gStageData.unk4 != 5) && (gStageData.unk4 != 6)) + || (gStageData.zone != 7))) { + if (gStageData.rings & 1) { + MPlayStart(&gMPlayInfo_SE2, &song117); + m4aMPlayImmInit(&gMPlayInfo_SE2); + m4aMPlayVolumeControl(&gMPlayInfo_SE2, 0xFFFFU, 128); + m4aMPlayPanpotControl(&gMPlayInfo_SE2, 0xFFFFU, -64); + } else { + MPlayStart(&gMPlayInfo_SE1, &song117); + m4aMPlayImmInit(&gMPlayInfo_SE1); + m4aMPlayVolumeControl(&gMPlayInfo_SE1, 0xFFFFU, 128); + m4aMPlayPanpotControl(&gMPlayInfo_SE1, 0xFFFFU, +64); + } + } +} + +void CreateCollectRingEffect(s32 inWorldX, s32 inWorldY) +{ + // NOTE: Needs to be like this for matching, because: + // In enemy/bu_bu.c, CreateCollectRingEffect() gets called, + // without casting down to s16 on the call-site. + // + // But EVERYTHING points at CreateCollectRingEffect taking two s16 values, + // so something must have gone wrong at the linking stage originally. + // To remedy this, we cast input values of CreateCollectRingEffect() down everywhere in this module. + // TODO: ^^^ Find a better solution for this, if possible! ^^^ + s16 worldX = inWorldX; + s16 worldY = inWorldY; + + RingsMgrUnk2C *strc; + Sprite *s; + s32 var_r0; + u16 temp_r2; + + if (gStageData.unkB5 < 8) { + strc = TASK_DATA(TaskCreate(Task_802ACF0, sizeof(RingsMgrUnk2C), 0x2810U, 0U, NULL)); + strc->unk29 = 0; + strc->unk28 = (s8)(1 & gStageData.rings); + s = &strc->s; + if (gStageData.gameMode < 6) { + s->tiles = OBJ_VRAM0 + 0x4380; + } else if (gStageData.gameMode == 6) { + s->tiles = OBJ_VRAM0 + 0x43A0; + } + s->frameFlags = 0x41200; + s->anim = ANIM_RING_COLLECT_EFFECT; + // NOTE: Initializing sprite pos to world pos + s->x = worldX; + s->y = worldY; + s->oamFlags = 0x280; + s->qAnimDelay = 0; + s->prevAnim = 0xFFFF; + s->variant = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->hitboxes[0].index = -1; + gStageData.unkB5++; + PlayRingCollectSE(); + } +} + +// Like CreateCollectRingEffect(), just no sound effect. +void CreateCollectRingEffectNoSfx(s16 worldX, s16 worldY) +{ + RingsMgrUnk2C *strc; + Sprite *s; + s32 var_r0; + u16 temp_r2; + + if (gStageData.unkB5 < 8) { + strc = TASK_DATA(TaskCreate(Task_802ACF0, sizeof(RingsMgrUnk2C), 0x2810U, 0U, NULL)); + strc->unk29 = 0; + strc->unk28 = (s8)(1 & gStageData.rings); + s = &strc->s; + if (gStageData.gameMode < 6) { + s->tiles = OBJ_VRAM0 + 0x4380; + } else if (gStageData.gameMode == 6) { + s->tiles = OBJ_VRAM0 + 0x43A0; + } + s->frameFlags = 0x41200; + s->anim = ANIM_RING_COLLECT_EFFECT; + // NOTE: Initializing sprite pos to world pos + s->x = worldX; + s->y = worldY; + s->oamFlags = 0x280; + s->qAnimDelay = 0; + s->prevAnim = 0xFFFF; + s->variant = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->hitboxes[0].index = -1; + gStageData.unkB5++; + } +} + +// (99.24%) https://decomp.me/scratch/CaEBA +NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_RingsMgrStage(void)) +{ + s8 rect[4]; + Sprite *s; + u32 *rings; + const SpriteOffset *dimensions; + s32 rx, ry; + RingsManager *mgr; + u16 h_regionCount, v_regionCount; + u8 drawCount; // sp18 + Player *p; + MapEntity_Ring *meRing; + u8 i; + u16 regionX, regionY; + + mgr = TASK_DATA(gCurTask); + s = &mgr->s; + rings = mgr->rings; + drawCount = 0; + UpdateSpriteAnimation(s); + if ((s->frameNum >> 28) == 0) { + // Default behavior from SA1 / SA2 + dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum]; + } else { + // TODO: WTF!?!? + dimensions = (const SpriteOffset *)&((const SpriteOffset2 *)gRefSpriteTables->dimensions[s->anim])[s->frameNum]; + } + rings++; + + h_regionCount = (u16)*rings++; + v_regionCount = (u16)*rings++; + + if ((GAME_MODE_IS_SINGLE_PLAYER(gStageData.gameMode) || (gStageData.gameMode == GAME_MODE_5))) { + for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) { + p = GET_SP_PLAYER_V0(i); + + if (!(p->moveState & MOVESTATE_100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { + if ((p->charFlags.someIndex != 2) || !(gPlayers[p->charFlags.partnerIndex].moveState & MOVESTATE_100)) { + rect[0] = -p->spriteOffsetX; + rect[1] = -p->spriteOffsetY; + rect[2] = +p->spriteOffsetX; + rect[3] = +p->spriteOffsetY; + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + // TODO: Check, why both uses of REGION_UPPER() only match like this in SA3! + // (Should in theory be roughly in-line with SA1/SA2...) + regionY <= REGION_UPPER(I(p->qWorldY), rect[3], +(1 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { + + for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), rect[2], (2 * TILE_WIDTH)) && regionX < h_regionCount; regionX++) { + + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; + + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { + if ((i == 0) || (p->charFlags.someIndex == 2)) { + AddRings(1); + } + CreateCollectRingEffect((s16)rx, (s16)ry); + + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + } + + meRing++; + } + } + } + } + + // if(p->unk13C & 0x20) + regionY = TO_REGION(gCamera.y); + if (p->unk13C & 0x20) { + for (; TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#if (!defined(NON_MATCHING) && (GAME <= GAME_SA2)) + while (0) + ; +#endif + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH; regionX++) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + + if (regionX >= h_regionCount) { + break; + } + + if (offset != 0) { + meRing = DATA_START(rings) + offset; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH + || ry - gCamera.y < 0 || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + meRing++; + } else if ((((rx - 64) <= I(p->qWorldX)) && (rx + 64) >= I(p->qWorldX)) + && (((ry - 72) <= I(p->qWorldY)) && ((ry + 56) >= I(p->qWorldY)))) { + sub_802AB10(rx, ry, p); + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + meRing++; + } else { + meRing++; + + if ((drawCount == 0) || s->oamBaseIndex == 0xFF) { + s->oamBaseIndex = 0xFF; + s->x = rx - gCamera.x; + s->y = ry - gCamera.y; + DisplaySprite(s); + } else { + OamData *oamDat = &gOamMallocBuffer[s->oamBaseIndex]; + OamData *oamAllocated = OamMalloc(GET_SPRITE_OAM_ORDER(s)); + + if (iwram_end == oamAllocated) + return; + + DmaCopy16(3, oamDat, oamAllocated, sizeof(OamDataShort)); + +#if !EXTENDED_OAM + // TODO: Can these be done more explicitly? + oamAllocated->all.attr1 &= 0xFE00; + oamAllocated->all.attr0 &= 0xFF00; + oamAllocated->all.attr0 += ((ry - gCamera.y) - dimensions->offsetY) & 0xFF; + oamAllocated->all.attr1 += ((rx - gCamera.x) - dimensions->offsetX) & 0x1FF; +#else + oamAllocated->split.x = ((rx - gCamera.x) - dimensions->offsetX); + oamAllocated->split.y = ((ry - gCamera.y) - dimensions->offsetY); +#endif + } + + drawCount++; + } + } + } + } + } + } + } + } + } + } else { + for (i = 0; i < 4; i++) { + u8 sp28 = 0; + p = &gPlayers[i]; + if (p->charFlags.someIndex != 5 && p->charFlags.someIndex != 2) { + if (p == GET_SP_PLAYER_V0(PLAYER_1) || p == GET_SP_PLAYER_V0(PLAYER_2)) { + sp28 = 1; + } + if (!(p->moveState & 0x100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { + rect[0] = -p->spriteOffsetX; + rect[1] = -p->spriteOffsetY; + rect[2] = +p->spriteOffsetX; + rect[3] = +p->spriteOffsetY; + + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + regionY <= REGION_UPPER(I(p->qWorldY), rect[3], +(1 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { + for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), rect[2], (2 * TILE_WIDTH)) && regionX < h_regionCount; regionX++) { + + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; + + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { + if (sp28 != 0) { + if (gStageData.playerIndex == i) { + AddRings(1); + CreateCollectRingEffect((s16)rx, (s16)ry); + } else { + CreateCollectRingEffectNoSfx((s16)rx, (s16)ry); + } + } else { + CreateCollectRingEffectNoSfx((s16)rx, (s16)ry); + } + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + } + + meRing++; + } + } + } + } + } + } + } + } + + for (regionY = TO_REGION(gCamera.y); TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#if (!defined(NON_MATCHING) && (GAME <= GAME_SA2)) + while (0) + ; +#endif + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH && regionX < h_regionCount; regionX++) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + + if (offset != 0) { + meRing = DATA_START(rings) + offset; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH || ry - gCamera.y < 0 + || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + meRing++; + } else { + meRing++; + + if ((drawCount == 0) || s->oamBaseIndex == 0xFF) { + s->oamBaseIndex = 0xFF; + s->x = rx - gCamera.x; + s->y = ry - gCamera.y; + DisplaySprite(s); + } else { + OamData *oamDat = &gOamMallocBuffer[s->oamBaseIndex]; + OamData *oamAllocated = OamMalloc(GET_SPRITE_OAM_ORDER(s)); + + if (iwram_end == oamAllocated) + return; + + DmaCopy16(3, oamDat, oamAllocated, sizeof(OamDataShort)); + +#if !EXTENDED_OAM + // TODO: Can these be done more explicitly? + oamAllocated->all.attr1 &= 0xFE00; + oamAllocated->all.attr0 &= 0xFF00; + oamAllocated->all.attr0 += ((ry - gCamera.y) - dimensions->offsetY) & 0xFF; + oamAllocated->all.attr1 += ((rx - gCamera.x) - dimensions->offsetX) & 0x1FF; +#else + oamAllocated->split.x = ((rx - gCamera.x) - dimensions->offsetX); + oamAllocated->split.y = ((ry - gCamera.y) - dimensions->offsetY); +#endif + } + + drawCount++; + } + } + } + } + } +} +END_NONMATCH + +void Task_RingsMgrExtraZone(void) +{ + s8 rect[4]; + Sprite *s; + u16 regionX, regionY; + bool32 sp08 = TRUE; // not sp+8 in SA3! + u32 *rings; + const SpriteOffset *dimensions; + RingsManager *mgr; + u32 h_regionCount, v_regionCount; + OamData *oamAllocated; + OamData *oamDat; + Player *p; + s32 rx, ry; + struct Camera *cam; + MapEntity_Ring *meRing; + u8 pid; + s16 mapIndex; + u8 drawCount; + s16 leftIndex; + + mgr = TASK_DATA(gCurTask); + s = &mgr->s; + + rings = mgr->rings; + mapIndex = gStageData.currMapIndex; + drawCount = 0; + if (gCamera.unk6A != 0) { + RLUnCompWram(gSpritePosData_rings[mapIndex], rings); + } + if ((gStageData.zone == 8) && (gStageData.unk4 != 3)) { + return; + } + rect[0] = -10; + rect[1] = -10; + rect[2] = +10; + rect[3] = +10; + UpdateSpriteAnimation(s); + if ((s->frameNum >> 28) == 0) { + // Default behavior from SA1 / SA2 + dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum]; + } else { + // TODO: WTF!?!? + dimensions = (const SpriteOffset *)&((const SpriteOffset2 *)gRefSpriteTables->dimensions[s->anim])[s->frameNum]; + } + + rings++; + + h_regionCount = (u16)*rings++; + v_regionCount = (u16)*rings++; + + for (pid = 0; pid < NUM_SINGLE_PLAYER_CHARS; pid++) { + p = GET_SP_PLAYER_V0(pid); + +#if (GAME == GAME_SA3) + if (p->moveState & MOVESTATE_100) + continue; +#endif + +#if (GAME == GAME_SA3) + if ((p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) +#endif // (GAME == GAME_SA3) + { + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + // TODO: Check, why both uses of REGION_UPPER() only match like this in SA3! + // (Should in theory be roughly in-line with SA1/SA2...) + regionY <= REGION_UPPER(I(p->qWorldY), 0, rect[3] - (2 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { + + for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), 0, rect[2] - TILE_WIDTH) && regionX < h_regionCount; regionX++) { + + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; + + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (sp08 != FALSE +#if (GAME == GAME_SA2) + || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) +#endif + ) { + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { +#if (GAME == GAME_SA3) + AddRings(1); +#else +#ifndef COLLECT_RINGS_ROM + INCREMENT_RINGS(1); +#else + { + s32 prevLives, newLives; + s32 oldRings = gRingCount; + gRingCount += 1; + if (!(IS_EXTRA_STAGE(CURRENT_LEVEL(0)))) { + newLives = Div(gRingCount, 100); + prevLives = Div(oldRings, 100); + if ((newLives != prevLives) && (gGameMode == GAME_MODE_SINGLE_PLAYER)) { + if (gNumLives < 255) { + gNumLives++; + }; + } + } + } +#endif // COLLECT_RINGS_ROM + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) { + gRingCount = 255; + } +#endif // (GAME == GAME_SA3) + + CreateCollectRingEffect((s16)rx, (s16)ry); + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + } + } + + meRing++; + } + } + } + } + } + } + + for (regionY = TO_REGION(gCamera.y); TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#if (!defined(NON_MATCHING) && (GAME <= GAME_SA2)) + while (0) + ; +#endif + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH && regionX < h_regionCount; regionX++) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + + if (offset != 0) { + meRing = DATA_START(rings) + offset; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH || ry - gCamera.y < 0 + || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + meRing++; + } else { + meRing++; + + if ((drawCount == 0) || s->oamBaseIndex == 0xFF) { + s->oamBaseIndex = 0xFF; + s->x = rx - gCamera.x; + s->y = ry - gCamera.y; + DisplaySprite(s); + } else { + OamData *oamDat = &gOamMallocBuffer[s->oamBaseIndex]; + OamData *oamAllocated = OamMalloc(GET_SPRITE_OAM_ORDER(s)); + + if (iwram_end == oamAllocated) + return; + + DmaCopy16(3, oamDat, oamAllocated, sizeof(OamDataShort)); + +#if !EXTENDED_OAM + // TODO: Can these be done more explicitly? + oamAllocated->all.attr1 &= 0xFE00; + oamAllocated->all.attr0 &= 0xFF00; + oamAllocated->all.attr0 += ((ry - gCamera.y) - dimensions->offsetY) & 0xFF; + oamAllocated->all.attr1 += ((rx - gCamera.x) - dimensions->offsetX) & 0x1FF; +#else + oamAllocated->split.x = ((rx - gCamera.x) - dimensions->offsetX); + oamAllocated->split.y = ((ry - gCamera.y) - dimensions->offsetY); +#endif + } + + drawCount++; + } + } + } + } + } +} + +void sub_802AB10(s16 worldX, s16 worldY, Player *p) +{ + u16 temp_r0; + RingsMgrUnk30 *strc30; + Sprite *s; + + strc30 = TASK_DATA(TaskCreate(Task_802AB8C, sizeof(RingsMgrUnk30), 0x2000U, 0U, NULL)); + s = &strc30->s; + strc30->p = p; + strc30->magnitude = 0; + s->x = worldX; + s->y = worldY; + s->tiles = OBJ_VRAM0 + 0x4180; + s->oamFlags = 0x280; + s->anim = ANIM_RING; + s->variant = 0; + s->animCursor = 0; + s->qAnimDelay = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->frameFlags = 0x41200; +} + +void Task_802AB8C(void) +{ + RingsMgrUnk30 *strc30; + s16 temp_r0_2; + s32 sxMinus8; + s32 temp_r5_2; + s8 temp_r3_2; + s8 temp_r6; + s16 syTemp; + s16 sxTemp; + PlayerSpriteInfo *temp_r0_5; + PlayerSpriteInfo *psiPlayer; + Player *p; + Sprite *s; + s16 dx, dy; + + strc30 = TASK_DATA(gCurTask); + p = strc30->p; + s = &strc30->s; + dx = I(p->qWorldX) - s->x; + dy = I(p->qWorldY) - s->y; + temp_r0_2 = sa2__sub_8004418(dy, dx); + strc30->magnitude += 64; + s->x += (strc30->magnitude * COS(temp_r0_2)) >> 0x16; + s->y += (strc30->magnitude * SIN(temp_r0_2)) >> 0x16; + syTemp = s->y; + sxTemp = s->x; + + if (((((s->x - 8) <= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b)) + && ((s->x + 8) >= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b))) + || (((s->x - 8) >= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b)) + && (HB_RIGHT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b) >= (s->x - 8)))) + && (((syTemp - 16 <= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) + && (syTemp >= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b))) + || ((syTemp - 16 >= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) + && (HB_BOTTOM(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b) >= syTemp - 16)))) { + if (!(p->moveState & MOVESTATE_100)) { + AddRings(1); + CreateCollectRingEffect(sxTemp, syTemp); + } + TaskDestroy(gCurTask); + return; + } + + s->x -= gCamera.x; + s->y -= gCamera.y; + UpdateSpriteAnimation(s); + DisplaySprite(s); + s->x = sxTemp; + s->y = syTemp; +} + +void Task_802ACF0(void) +{ + RingsMgrUnk2C *strc2C = TASK_DATA(gCurTask); + Sprite *s = &strc2C->s; + s16 temp_r5 = s->x; + s16 temp_r6 = s->y; + + s->x -= gCamera.x; + s->y -= gCamera.y; + if (UpdateSpriteAnimation(s) == ACMD_RESULT__ENDED) { + DisplaySprite(s); + gStageData.unkB5 -= 1; + TaskDestroy(gCurTask); + return; + } + DisplaySprite(s); + s->x = (s16)temp_r5; + s->y = (s16)temp_r6; +} + +void TaskDestructor_RingsMgr(Task *t) +{ + RingsManager *mgr = TASK_DATA(t); + EwramFree(mgr->rings); +} diff --git a/src/platform/shared/stub.c b/src/platform/shared/stub.c index b4840fbe4..87e78d60f 100644 --- a/src/platform/shared/stub.c +++ b/src/platform/shared/stub.c @@ -38,6 +38,7 @@ SaveSectorData gSaveSectorData = {}; struct Camera gCamera = {}; void sub_8000D68() { } +void AddRings() { } void Task_800303C() { } void sub_8003D2C() { } void sub_8003DC4() { } @@ -81,7 +82,6 @@ void sub_80299FC() { } void sub_8029A18() { } void sub_80275B8(u32 level, u8 param1, u8 param2) { } void TaskDestructor_8029774(struct Task *t) { } -void sub_8029C54(s32 param0, s32 param1) { } bool32 sub_802C080(Player *p) { return FALSE; } bool32 sub_802C0D4(Player *p) { return FALSE; } bool32 sub_802C140(s32 worldX, s32 worldY, s32 screenX, s32 screenY) { return FALSE; }