From bff75ad6602dcfb6820bb0584c7bbe49134d0e4b Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Wed, 9 Sep 2020 21:14:07 +0200 Subject: [PATCH] button.c: ok One non-matching for regalloc (probably caused by wrong types tbh) --- asm/button.s | 745 ------------------------- asm/non_matching/button/sub_08081E6C.s | 69 +++ include/global.h | 3 + linker.ld | 2 +- src/object/button.c | 286 ++++++++++ 5 files changed, 359 insertions(+), 746 deletions(-) delete mode 100644 asm/button.s create mode 100644 asm/non_matching/button/sub_08081E6C.s create mode 100644 src/object/button.c diff --git a/asm/button.s b/asm/button.s deleted file mode 100644 index dd80d20d..00000000 --- a/asm/button.s +++ /dev/null @@ -1,745 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Button -Button: @ 0x08081AC8 - push {lr} - ldr r2, _08081ADC @ =gUnk_0811EE38 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08081ADC: .4byte gUnk_0811EE38 - - thumb_func_start sub_08081AE0 -sub_08081AE0: @ 0x08081AE0 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - ldrb r1, [r4, #0x11] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x11] - ldrh r0, [r4, #0x32] - adds r0, #1 - strh r0, [r4, #0x32] - adds r0, r4, #0 - adds r0, #0x84 - ldrh r1, [r0] - cmp r1, #0 - beq _08081B0E - subs r0, #0x4c - strb r1, [r0] -_08081B0E: - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _08081B6C @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r5, r4, #0 - adds r5, #0x74 - strh r1, [r5] - ldrh r0, [r5] - adds r6, r4, #0 - adds r6, #0x38 - ldrb r1, [r6] - bl GetTileType - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08081B70 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _08081B70 - movs r0, #5 - strb r0, [r4, #0xc] - ldrh r1, [r5] - ldrb r2, [r6] - movs r0, #0x7a - bl SetTileType - b _08081B82 - .align 2, 0 -_08081B6C: .4byte gRoomControls -_08081B70: - adds r0, r4, #0 - bl sub_08081E3C - cmp r0, #0 - beq _08081B7E - movs r0, #2 - b _08081B80 -_08081B7E: - movs r0, #1 -_08081B80: - strb r0, [r4, #0xc] -_08081B82: - pop {r4, r5, r6, pc} - - thumb_func_start sub_08081B84 -sub_08081B84: @ 0x08081B84 - push {r4, lr} - adds r4, r0, #0 - bl sub_08081E3C - cmp r0, #0 - beq _08081BAA - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl GetTileType - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] -_08081BAA: - pop {r4, pc} - - thumb_func_start sub_08081BAC -sub_08081BAC: @ 0x08081BAC - push {r4, lr} - adds r4, r0, #0 - bl sub_08081CB0 - cmp r0, #0 - beq _08081BDC - movs r0, #0 - strb r0, [r4, #0xd] - movs r0, #0xa - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #0xa - bl sub_0805E4E0 - adds r0, r4, #0 - bl sub_08081FF8 - ldrb r0, [r4, #0xa] - cmp r0, #1 - bne _08081BD8 - movs r0, #3 - b _08081BDA -_08081BD8: - movs r0, #5 -_08081BDA: - strb r0, [r4, #0xc] -_08081BDC: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08081BE0 -sub_08081BE0: @ 0x08081BE0 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x78 - bl sub_08081F7C - cmp r0, #0 - beq _08081C2C - adds r0, r4, #0 - bl sub_08081D28 - cmp r0, #0 - bne _08081C26 - movs r0, #4 - strb r0, [r4, #0xc] - movs r0, #1 - strb r0, [r4, #0xf] - ldr r1, _08081C1C @ =gPlayerState - ldrb r0, [r1, #5] - cmp r0, #2 - beq _08081C16 - adds r0, r1, #0 - adds r0, #0x35 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _08081C20 -_08081C16: - movs r0, #0x18 - strb r0, [r4, #0xe] - b _08081C2C - .align 2, 0 -_08081C1C: .4byte gPlayerState -_08081C20: - movs r0, #8 - strb r0, [r4, #0xe] - b _08081C2C -_08081C26: - adds r0, r4, #0 - bl sub_08081E6C -_08081C2C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08081C30 -sub_08081C30: @ 0x08081C30 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08081C70 - subs r0, #1 - movs r5, #0 - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _08081C5A - strb r5, [r4, #0xf] - ldr r0, _08081C6C @ =0x00004035 - adds r1, r4, #0 - adds r1, #0x74 - ldrh r1, [r1] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl SetTile -_08081C5A: - adds r0, r4, #0 - bl sub_08081CB0 - cmp r0, #0 - beq _08081C96 - movs r0, #3 - strb r0, [r4, #0xc] - strb r5, [r4, #0xe] - b _08081C96 - .align 2, 0 -_08081C6C: .4byte 0x00004035 -_08081C70: - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl ClearFlag - adds r0, r4, #0 - adds r0, #0x74 - ldrh r1, [r0] - subs r0, #0x3c - ldrb r2, [r0] - movs r0, #0x77 - bl SetTileType - movs r0, #0x86 - lsls r0, r0, #1 - bl PlaySFX -_08081C96: - pop {r4, r5, pc} - - thumb_func_start sub_08081C98 -sub_08081C98: @ 0x08081C98 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x7a - bl sub_08081F7C - cmp r0, #0 - beq _08081CAC - adds r0, r4, #0 - bl sub_08081E6C -_08081CAC: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08081CB0 -sub_08081CB0: @ 0x08081CB0 - push {r4, r5, r6, lr} - adds r4, r0, #0 - bl sub_08081D74 - cmp r0, #0 - beq _08081CEC - adds r1, r4, #0 - adds r1, #0x70 - ldr r0, _08081CE4 @ =0x0000FFFF - strh r0, [r1] - adds r5, r4, #0 - adds r5, #0x74 - ldrh r0, [r5] - adds r4, #0x38 - ldrb r1, [r4] - bl GetTileType - ldr r1, _08081CE8 @ =0x00004035 - cmp r0, r1 - bne _08081D1C - ldrh r1, [r5] - ldrb r2, [r4] - movs r0, #0x78 - bl sub_0807B7D8 - b _08081D1C - .align 2, 0 -_08081CE4: .4byte 0x0000FFFF -_08081CE8: .4byte 0x00004035 -_08081CEC: - adds r6, r4, #0 - adds r6, #0x74 - ldrh r0, [r6] - adds r5, r4, #0 - adds r5, #0x38 - ldrb r1, [r5] - bl GetTileType - lsls r0, r0, #0x10 - lsrs r1, r0, #0x10 - cmp r1, #0x77 - beq _08081D24 - cmp r1, #0x79 - beq _08081D24 - ldr r0, _08081D20 @ =0x00004035 - cmp r1, r0 - beq _08081D24 - ldrh r0, [r6] - ldrb r1, [r5] - bl sub_080001DA - adds r1, r4, #0 - adds r1, #0x70 - strh r0, [r1] -_08081D1C: - movs r0, #1 - b _08081D26 - .align 2, 0 -_08081D20: .4byte 0x00004035 -_08081D24: - movs r0, #0 -_08081D26: - pop {r4, r5, r6, pc} - - thumb_func_start sub_08081D28 -sub_08081D28: @ 0x08081D28 - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_08081D74 - cmp r0, #0 - beq _08081D44 - adds r1, r4, #0 - adds r1, #0x70 - ldr r0, _08081D40 @ =0x0000FFFF - strh r0, [r1] - movs r0, #1 - b _08081D72 - .align 2, 0 -_08081D40: .4byte 0x0000FFFF -_08081D44: - adds r5, r4, #0 - adds r5, #0x70 - ldrh r1, [r5] - ldr r0, _08081D6C @ =0x0000FFFF - cmp r1, r0 - beq _08081D70 - adds r0, r4, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl sub_080001DA - ldrh r5, [r5] - cmp r0, r5 - bne _08081D70 - movs r0, #1 - b _08081D72 - .align 2, 0 -_08081D6C: .4byte 0x0000FFFF -_08081D70: - movs r0, #0 -_08081D72: - pop {r4, r5, pc} - - thumb_func_start sub_08081D74 -sub_08081D74: @ 0x08081D74 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl sub_080002E0 - cmp r0, #0xf - bne _08081D8E - movs r0, #0 - b _08081E0A -_08081D8E: - movs r6, #0 - adds r0, r4, #0 - bl sub_08081E0C - cmp r0, #0 - beq _08081DB4 - ldr r0, _08081DAC @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x90 - ands r0, r1 - cmp r0, #0 - bne _08081E06 - ldr r6, _08081DB0 @ =gPlayerEntity - b _08081E06 - .align 2, 0 -_08081DAC: .4byte gPlayerState -_08081DB0: .4byte gPlayerEntity -_08081DB4: - ldr r0, _08081DD8 @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - lsls r1, r1, #0xf - ands r0, r1 - cmp r0, #0 - beq _08081E06 - ldr r5, _08081DDC @ =gUnk_03004040 - ldr r1, [r5] - adds r0, r4, #0 - movs r2, #5 - movs r3, #6 - bl sub_080041A0 - cmp r0, #0 - beq _08081DE0 - ldr r6, [r5] - b _08081E06 - .align 2, 0 -_08081DD8: .4byte gPlayerState -_08081DDC: .4byte gUnk_03004040 -_08081DE0: - ldr r1, [r5, #4] - adds r0, r4, #0 - movs r2, #5 - movs r3, #6 - bl sub_080041A0 - cmp r0, #0 - beq _08081DF4 - ldr r6, [r5, #4] - b _08081E06 -_08081DF4: - ldr r1, [r5, #8] - adds r0, r4, #0 - movs r2, #5 - movs r3, #6 - bl sub_080041A0 - cmp r0, #0 - beq _08081E06 - ldr r6, [r5, #8] -_08081E06: - str r6, [r4, #0x54] - adds r0, r6, #0 -_08081E0A: - pop {r4, r5, r6, pc} - - thumb_func_start sub_08081E0C -sub_08081E0C: @ 0x08081E0C - push {r4, r5, lr} - adds r4, r0, #0 - ldr r5, _08081E28 @ =gPlayerEntity - movs r1, #0x36 - ldrsh r0, [r5, r1] - cmp r0, #0 - bne _08081E22 - bl sub_08079F8C - cmp r0, #0 - bne _08081E2C -_08081E22: - movs r0, #0 - b _08081E38 - .align 2, 0 -_08081E28: .4byte gPlayerEntity -_08081E2C: - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #5 - movs r3, #6 - bl sub_080041A0 -_08081E38: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08081E3C -sub_08081E3C: @ 0x08081E3C - push {lr} - adds r1, r0, #0 - adds r1, #0x74 - ldrh r2, [r1] - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r2, #0 - bl GetTileType - adds r2, r0, #0 - ldr r1, _08081E64 @ =gUnk_0811EE50 -_08081E52: - ldrh r0, [r1] - cmp r0, r2 - beq _08081E68 - adds r1, #2 - ldrh r0, [r1] - cmp r0, #0 - bne _08081E52 - movs r0, #0 - b _08081E6A - .align 2, 0 -_08081E64: .4byte gUnk_0811EE50 -_08081E68: - movs r0, #1 -_08081E6A: - pop {pc} - - thumb_func_start sub_08081E6C -sub_08081E6C: @ 0x08081E6C - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r0, #0x74 - ldrh r6, [r0] - subs r0, #0x3c - ldrb r5, [r0] - adds r0, r6, #0 - adds r1, r5, #0 - bl GetTileType - adds r7, r0, #0 - ldr r0, _08081EEC @ =0x00003FFF - cmp r7, r0 - bls _08081EE8 - adds r0, r5, #0 - bl GetLayerByIndex - adds r1, r0, #0 - ldrb r0, [r4, #0xa] - movs r4, #0x78 - cmp r0, #0 - bne _08081E9A - movs r4, #0x7a -_08081E9A: - ldr r0, _08081EF0 @ =0x00007004 - adds r3, r1, r0 - lsls r0, r4, #1 - ldr r2, _08081EF4 @ =0x00006004 - adds r1, r1, r2 - adds r1, r1, r0 - ldrh r0, [r1] - lsls r0, r0, #3 - adds r3, r3, r0 - ldr r2, _08081EF8 @ =gUnk_02019EE0 - cmp r5, #2 - bne _08081EB4 - ldr r2, _08081EFC @ =gMapDataTopSpecial -_08081EB4: - movs r0, #0x3f - ands r0, r6 - lsls r0, r0, #1 - movs r1, #0xfc - lsls r1, r1, #4 - ands r1, r6 - lsls r1, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #1 - adds r2, r2, r0 - adds r0, r2, #0 - adds r1, r3, #0 - bl sub_08081F00 - cmp r0, #0 - bne _08081EE8 - adds r0, r4, #0 - adds r1, r6, #0 - adds r2, r5, #0 - bl SetTileType - adds r0, r7, #0 - adds r1, r6, #0 - adds r2, r5, #0 - bl SetTile -_08081EE8: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08081EEC: .4byte 0x00003FFF -_08081EF0: .4byte 0x00007004 -_08081EF4: .4byte 0x00006004 -_08081EF8: .4byte gUnk_02019EE0 -_08081EFC: .4byte gMapDataTopSpecial - - thumb_func_start sub_08081F00 -sub_08081F00: @ 0x08081F00 - push {lr} - adds r2, r0, #0 - adds r3, r1, #0 - ldr r1, [r2] - ldr r0, [r3] - cmp r1, r0 - bne _08081F20 - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r2, r1 - ldr r1, [r0] - ldr r0, [r3, #4] - cmp r1, r0 - bne _08081F20 - movs r0, #1 - b _08081F22 -_08081F20: - movs r0, #0 -_08081F22: - pop {pc} - - thumb_func_start sub_08081F24 -sub_08081F24: @ 0x08081F24 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _08081F50 - ldrb r1, [r2, #0x11] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2, #0x11] - ldrh r0, [r2, #0x2e] - adds r0, #7 - strh r0, [r2, #0x2e] - ldrh r0, [r2, #0x32] - adds r0, #5 - strh r0, [r2, #0x32] -_08081F50: - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _08081F7A - ldrb r1, [r2, #0x11] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2, #0x11] - ldrh r0, [r2, #0x2e] - subs r0, #7 - strh r0, [r2, #0x2e] - ldrh r0, [r2, #0x32] - adds r0, #5 - strh r0, [r2, #0x32] -_08081F7A: - pop {r4, pc} - - thumb_func_start sub_08081F7C -sub_08081F7C: @ 0x08081F7C - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r7, r1, #0 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08081FF4 - subs r1, r0, #1 - strb r1, [r4, #0xe] - lsls r0, r1, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #6 - bls _08081FA4 - ldr r0, [r4, #0x54] - cmp r0, #0 - beq _08081FF4 - adds r1, r0, #0 - adds r1, #0x63 - movs r0, #0xfc - strb r0, [r1] - b _08081FF4 -_08081FA4: - lsls r0, r1, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #6 - bne _08081FF4 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl SetFlag - adds r6, r4, #0 - adds r6, #0x74 - ldrh r1, [r6] - adds r5, r4, #0 - adds r5, #0x38 - ldrb r2, [r5] - adds r0, r7, #0 - bl SetTileType - adds r0, r4, #0 - bl sub_08081F24 - movs r0, #0x86 - lsls r0, r0, #1 - bl PlaySFX - adds r2, r4, #0 - adds r2, #0x70 - ldrh r1, [r2] - ldr r0, _08081FF0 @ =0x0000FFFF - cmp r1, r0 - beq _08081FEC - adds r0, r1, #0 - ldrh r1, [r6] - ldrb r2, [r5] - bl SetTile -_08081FEC: - movs r0, #0 - b _08081FF6 - .align 2, 0 -_08081FF0: .4byte 0x0000FFFF -_08081FF4: - movs r0, #1 -_08081FF6: - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_08081FF8 -sub_08081FF8: @ 0x08081FF8 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r1, [r4, #0x54] - ldr r0, _08082038 @ =gPlayerEntity - cmp r1, r0 - bne _08082036 - adds r0, r1, #0 - adds r1, r4, #0 - bl GetFacingDirection - adds r6, r0, #0 - ldr r0, [r4, #0x54] - movs r1, #0x80 - lsls r1, r1, #2 - adds r2, r6, #0 - bl sub_080044AE - movs r5, #0 - ldr r4, _0808203C @ =gUnk_03004040 -_0808201E: - ldr r0, [r4] - cmp r0, #0 - beq _0808202E - movs r1, #0x80 - lsls r1, r1, #2 - adds r2, r6, #0 - bl sub_080044AE -_0808202E: - adds r4, #4 - adds r5, #1 - cmp r5, #2 - bls _0808201E -_08082036: - pop {r4, r5, r6, pc} - .align 2, 0 -_08082038: .4byte gPlayerEntity -_0808203C: .4byte gUnk_03004040 diff --git a/asm/non_matching/button/sub_08081E6C.s b/asm/non_matching/button/sub_08081E6C.s new file mode 100644 index 00000000..d5774f1c --- /dev/null +++ b/asm/non_matching/button/sub_08081E6C.s @@ -0,0 +1,69 @@ + +sub_08081E6C: @ 0x08081E6C + push {r4, r5, r6, r7, lr} + add r4, r0, #0 + add r0, #0x74 + ldrh r6, [r0] + sub r0, #0x3c + ldrb r5, [r0] + add r0, r6, #0 + add r1, r5, #0 + bl GetTileType + add r7, r0, #0 + ldr r0, _08081EEC @ =0x00003FFF + cmp r7, r0 + bls _08081EE8 + add r0, r5, #0 + bl GetLayerByIndex + add r1, r0, #0 + ldrb r0, [r4, #0xa] + mov r4, #0x78 + cmp r0, #0 + bne _08081E9A + mov r4, #0x7a +_08081E9A: + ldr r0, _08081EF0 @ =0x00007004 + add r3, r1, r0 + lsl r0, r4, #1 + ldr r2, _08081EF4 @ =0x00006004 + add r1, r1, r2 + add r1, r1, r0 + ldrh r0, [r1] + lsl r0, r0, #3 + add r3, r3, r0 + ldr r2, _08081EF8 @ =gUnk_02019EE0 + cmp r5, #2 + bne _08081EB4 + ldr r2, _08081EFC @ =gMapDataTopSpecial +_08081EB4: + mov r0, #0x3f + and r0, r6 + lsl r0, r0, #1 + mov r1, #0xfc + lsl r1, r1, #4 + and r1, r6 + lsl r1, r1, #2 + add r0, r0, r1 + lsl r0, r0, #1 + add r2, r2, r0 + add r0, r2, #0 + add r1, r3, #0 + bl sub_08081F00 + cmp r0, #0 + bne _08081EE8 + add r0, r4, #0 + add r1, r6, #0 + add r2, r5, #0 + bl SetTileType + add r0, r7, #0 + add r1, r6, #0 + add r2, r5, #0 + bl SetTile +_08081EE8: + pop {r4, r5, r6, r7, pc} + .align 2, 0 +_08081EEC: .4byte 0x00003FFF +_08081EF0: .4byte 0x00007004 +_08081EF4: .4byte 0x00006004 +_08081EF8: .4byte gUnk_02019EE0 +_08081EFC: .4byte gMapDataTopSpecial diff --git a/include/global.h b/include/global.h index f6d4a4e1..ad4b9daa 100644 --- a/include/global.h +++ b/include/global.h @@ -59,6 +59,9 @@ union SplitWord { struct { s16 LO, HI; } HALF; + struct { + u16 LO, HI; + } HALF_U; struct { u8 byte0, byte1, byte2, byte3; } BYTES; diff --git a/linker.ld b/linker.ld index a0d37ce8..5dff0003 100644 --- a/linker.ld +++ b/linker.ld @@ -673,7 +673,7 @@ SECTIONS { asm/itemOnGround.o(.text); asm/deathFx.o(.text); asm/itemForSale.o(.text); - asm/button.o(.text); + src/object/button.o(.text); asm/object4.o(.text); src/object/pot.o(.text); asm/object6.o(.text); diff --git a/src/object/button.c b/src/object/button.c new file mode 100644 index 00000000..b66c7f2d --- /dev/null +++ b/src/object/button.c @@ -0,0 +1,286 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "room.h" +#include "functions.h" + +extern void (*const gUnk_0811EE38[])(Entity*); + +void Button(Entity* this) { + gUnk_0811EE38[this->action](this); +} + +extern u32 sub_08081E3C(Entity*); + +void sub_08081AE0(Entity* this) { + this->flags &= 0x7F; + this->scriptedScene = 3; + this->y.HALF.HI++; + if (this->cutsceneBeh.HWORD != 0) { + this->collisionLayer = this->cutsceneBeh.HWORD; + } + this->field_0x74.HWORD = (((this->x.HALF.HI - gRoomControls.roomOriginX)>>4) & 0x3F) | + ((((this->y.HALF.HI - gRoomControls.roomOriginY)>>4) & 0x3F) << 6); + this->field_0x70.HALF.HI = GetTileType(this->field_0x74.HWORD, this->collisionLayer); + if (this->entityType.form == 0 && CheckFlags(this->field_0x86)) { + this->action = 5; + SetTileType(0x7A, this->field_0x74.HWORD, this->collisionLayer); + } else { + if (sub_08081E3C(this)) { + this->action = 2; + } else { + this->action = 1; + } + } +} + +void sub_08081B84(Entity* this) { + if (sub_08081E3C(this)) { + this->action=2; + this->field_0x70.HALF.HI = GetTileType(this->field_0x74.HWORD, this->collisionLayer); + } +} + +u32 sub_08081CB0(Entity*); +void sub_0805E4E0(Entity*, u32); +void sub_08081FF8(Entity*); + +void sub_08081BAC(Entity* this) { + if (sub_08081CB0(this)) { + this->previousActionFlag = 0; + this->actionDelay = 0xA; + sub_0805E4E0(this, 0xA); + sub_08081FF8(this); + if (this->entityType.form == 1) { + this->action = 3; + } else { + this->action = 5; + } + } +} + +u32 sub_08081F7C(Entity*, u32); +u32 sub_08081D28(Entity*); +void sub_08081E6C(Entity*); + +void sub_08081BE0(Entity* this) { + if (!sub_08081F7C(this, 0x78)) + return; + if (!sub_08081D28(this)) { + this->action = 4; + this->field_0xf = 1; + if ((gPlayerState.heldObject == 2) || (!(gPlayerState.field_0x34[1] & 0x80))) { + this->actionDelay = 0x18; + } else { + this->actionDelay = 0x8; + } + } else { + sub_08081E6C(this); + } +} + +void sub_08081C30(Entity* this) { + if (this->actionDelay != 0) { + this->actionDelay--; + if (this->field_0xf != 0) { + this->field_0xf = 0; + SetTile(0x4035, this->field_0x74.HWORD, this->collisionLayer); + } + if (sub_08081CB0(this)) { + this->action = 3; + this->actionDelay = 0; + } + } else { + this->action = 2; + ClearFlag(this->field_0x86); + SetTileType(0x77, this->field_0x74.HWORD, this->collisionLayer); + PlaySFX(0x10C); + } +} + +void sub_08081C98(Entity* this) { + if (sub_08081F7C(this, 0x7a)) { + sub_08081E6C(this); + } +} + +Entity* sub_08081D74(Entity*); +void sub_0807B7D8(u32, u32, u32); +u32 sub_080001DA(u32, u32); + +u32 sub_08081CB0(Entity* this) { + u16 tmp; + if (sub_08081D74(this)) { + this->field_0x70.HALF.LO = -1; + if (GetTileType(this->field_0x74.HWORD, this->collisionLayer) == 0x4035) { + sub_0807B7D8(0x78, this->field_0x74.HWORD, this->collisionLayer); + } + return 1; + } else { + tmp = GetTileType(this->field_0x74.HWORD, this->collisionLayer); + if (tmp != 0x77 && tmp != 0x79 && tmp != 0x4035) { + this->field_0x70.HALF.LO = sub_080001DA(this->field_0x74.HWORD, this->collisionLayer); + return 1; + } + } + return 0; +} + +u32 sub_08081D28(Entity* this) { + if (sub_08081D74(this)) { + this->field_0x70.HALF_U.LO = 0xFFFF; + return 1; + } else { + if (this->field_0x70.HALF_U.LO == 0xFFFF) { + return 0; + } + if (sub_080001DA(this->field_0x74.HWORD, this->collisionLayer) != this->field_0x70.HALF_U.LO) { + return 0; + } + } + return 1; +} + +extern u32 sub_080002E0(u32, u32); +extern Entity* gUnk_03004040[]; +extern u32 sub_080041A0(Entity*, Entity*, u32, u32); +u32 sub_08081E0C(Entity*); + +Entity* sub_08081D74(Entity* this) { + Entity* ent; + if (sub_080002E0(this->field_0x74.HWORD, this->collisionLayer) == 0xF) { + return 0; + } + ent = 0; + if (sub_08081E0C(this)) { + if (!(gPlayerState.flags.all & 0x10) && !(gPlayerState.flags.all & 0x80)) { + ent = &gPlayerEntity; + } + } else { + if (gPlayerState.flags.all & 0x400000) { + if (sub_080041A0(this, gUnk_03004040[0], 5, 6)) { + ent = gUnk_03004040[0]; + } else if (sub_080041A0(this, gUnk_03004040[1], 5, 6)) { + ent = gUnk_03004040[1]; + } else if (sub_080041A0(this, gUnk_03004040[2], 5, 6)) { + ent = gUnk_03004040[2]; + } + } + } + this->attachedEntity=ent; + return ent; +} + +extern u32 sub_08079F8C(); + +u32 sub_08081E0C(Entity* this) { + Entity* tmp = &gPlayerEntity; + if (tmp->height.HALF.HI != 0 || !sub_08079F8C()) { + return 0; + } else { + return sub_080041A0(this, tmp, 5, 6); + } +} + +extern u16 gUnk_0811EE50[]; + +u32 sub_08081E3C(Entity* this) { + u16* tmp1; + int tmp2; + tmp2 = GetTileType(this->field_0x74.HWORD, this->collisionLayer); + tmp1 = gUnk_0811EE50; + do { + if (*tmp1 == tmp2) return 1; + } while (*++tmp1); + return 0; +} + +u32 sub_08081F00(u32*, u32*); + +extern u16 gMapDataTopSpecial[0x2000]; + +#ifdef NON_MATCHING +void sub_08081E6C(Entity* this) { + u32 r4; + u16 *tmp, *r1; + u8 *tmp2; + u32 r6 = this->field_0x74.HWORD; + u32 r5 = this->collisionLayer; + u32 tile = GetTileType(r6,r5); + if (tile < 0x4000) + return; + r1 = GetLayerByIndex(r5); + r4 = (this->entityType.form == 0 ? 0x7a : 0x78); + tmp = r1 + 0x3802; + r1 += 0x3002 + r4; + tmp = tmp + (*r1 << 2); + tmp2 = (r5 == 2 ? gMapDataTopSpecial : (u8*)&gUnk_02019EE0); + tmp2 += (((0x3f & r6)<<1)+((0xfc0 & r6)<<2))<<1; + if (sub_08081F00((u32*)tmp2, (u32*)tmp)) + return; + SetTileType(r4, r6, r5); + SetTile(tile,r6,r5); +} +#else +NAKED +void sub_08081E6C(Entity* this) { + asm(".include \"asm/non_matching/button/sub_08081E6C.s\""); +} +#endif + +u32 sub_08081F00(u32* unk1, u32* unk2) { + if (*unk1 != *unk2) return 0; + if (unk1[0x40] != unk2[1]) return 0; + return 1; +} + +void sub_08081F24(Entity* this) { + Entity* fx = CreateFx(this, 0x11, 0x40); + if (fx) { + fx->scriptedScene = 3; + fx->x.HALF.HI += 7; + fx->y.HALF.HI += 5; + } + fx = CreateFx(this, 0x11, 0x40); + if (fx) { + fx->scriptedScene = 3; + fx->x.HALF.HI -= 7; + fx->y.HALF.HI += 5; + } +} + +u32 sub_08081F7C(Entity* this, u32 r7) { + u16 tmp; + if (this->actionDelay == 0) return 1; + if (--this->actionDelay > 6) { + if(this->attachedEntity) + this->attachedEntity->spriteOffsetY = 0xfc; + } else { + if (this->actionDelay == 6) { + SetFlag(this->field_0x86); + SetTileType(r7, this->field_0x74.HWORD, this->collisionLayer); + sub_08081F24(this); + PlaySFX(0x10C); + if (this->field_0x70.HALF_U.LO != 0xFFFF) + SetTile(this->field_0x70.HALF_U.LO, this->field_0x74.HWORD, this->collisionLayer); + return 0; + } + } + return 1; +} + +extern Entity* gUnk_03004040[3]; +extern void sub_080044AE(Entity*, u32, u32); + +void sub_08081FF8(Entity* this) { + u32 direction; + u32 i; + if (this->attachedEntity != &gPlayerEntity) return; + direction = GetFacingDirection(this->attachedEntity, this); + sub_080044AE(this->attachedEntity, 0x200, direction); + for (i = 0; i < 3; i++) { + if (gUnk_03004040[i]) { + sub_080044AE(gUnk_03004040[i],0x200, direction); + } + } +}