diff --git a/asm/enemy/gleerok.s b/asm/enemy/gleerok.s deleted file mode 100644 index 3d81c214..00000000 --- a/asm/enemy/gleerok.s +++ /dev/null @@ -1,723 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start sub_0802E768 -sub_0802E768: @ 0x0802E768 - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r2, #0 - movs r6, #0x1f -_0802E770: - lsls r3, r2, #2 - adds r0, r4, r3 - ldrb r1, [r0, #1] - adds r2, #1 - lsls r0, r2, #2 - adds r0, r4, r0 - ldrb r0, [r0, #1] - subs r0, r1, r0 - ands r0, r6 - adds r5, r2, #0 - cmp r0, #0x10 - ble _0802E790 - cmp r0, #0x1e - bgt _0802E798 - adds r1, #1 - b _0802E796 -_0802E790: - cmp r0, #1 - ble _0802E798 - subs r1, #1 -_0802E796: - ands r1, r6 -_0802E798: - adds r0, r4, r3 - strb r1, [r0, #1] - ldrb r1, [r0, #0x19] - lsls r0, r5, #2 - adds r0, r4, r0 - ldrb r0, [r0, #0x19] - subs r0, r1, r0 - movs r2, #0x1f - ands r0, r2 - cmp r0, #0x10 - ble _0802E7B6 - cmp r0, #0x1d - bgt _0802E7BE - adds r1, #1 - b _0802E7BC -_0802E7B6: - cmp r0, #2 - ble _0802E7BE - subs r1, #1 -_0802E7BC: - ands r1, r2 -_0802E7BE: - adds r0, r4, r3 - strb r1, [r0, #0x19] - adds r2, r5, #0 - cmp r2, #4 - bls _0802E770 - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0802E7CC -sub_0802E7CC: @ 0x0802E7CC - lsls r1, r1, #0x18 - lsrs r1, r1, #0x16 - adds r2, r0, #0 - adds r2, #0x3c - adds r2, r2, r1 - ldr r3, [r2] - adds r0, r0, r1 - ldrb r0, [r0, #1] - strb r0, [r3, #0x14] - ldr r0, [r2] - ldrb r0, [r0, #0x14] - bx lr - - thumb_func_start sub_0802E7E4 -sub_0802E7E4: @ 0x0802E7E4 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - mov ip, r0 - ldr r0, [r0, #0x50] - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _0802E8D0 - movs r6, #0 - movs r5, #0 - mov r7, ip - adds r7, #0x3c - movs r0, #0x30 - add r0, ip - mov r8, r0 - movs r1, #8 - rsbs r1, r1, #0 - mov sl, r1 - movs r2, #4 - rsbs r2, r2, #0 - mov sb, r2 -_0802E818: - lsls r0, r5, #2 - adds r4, r7, r0 - ldr r3, [r4] - adds r3, #0x29 - movs r1, #7 - ands r1, r6 - ldrb r2, [r3] - mov r0, sl - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - adds r6, #1 - mov r1, r8 - adds r0, r1, r5 - ldrb r0, [r0] - cmp r0, #0 - bne _0802E852 - ldr r3, [r4] - ldrb r2, [r3, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #2 - rsbs r0, r0, #0 - ands r1, r0 - mov r0, sb - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - b _0802E860 -_0802E852: - ldr r2, [r4] - ldrb r1, [r2, #0x18] - mov r0, sb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] -_0802E860: - adds r5, #1 - cmp r5, #5 - bls _0802E818 - movs r5, #0 - movs r2, #7 - mov sb, r2 - movs r0, #8 - rsbs r0, r0, #0 - mov r8, r0 -_0802E872: - lsls r1, r5, #2 - mov r2, ip - adds r0, r2, r1 - ldrb r0, [r0, #1] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r5, #1 - cmp r0, #0x10 - bhi _0802E8BA - adds r0, r7, r1 - ldr r3, [r0] - adds r3, #0x29 - ldrb r4, [r3] - lsls r0, r4, #0x1d - lsrs r6, r0, #0x1d - lsls r2, r5, #2 - adds r2, r7, r2 - ldr r0, [r2] - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - mov r0, r8 - ands r0, r4 - orrs r0, r1 - strb r0, [r3] - ldr r1, [r2] - adds r1, #0x29 - mov r0, sb - ands r6, r0 - ldrb r2, [r1] - mov r0, r8 - ands r0, r2 - orrs r0, r6 - strb r0, [r1] -_0802E8BA: - cmp r5, #4 - bls _0802E872 - mov r1, ip - ldr r0, [r1, #0x38] - adds r0, #0x29 - ldrb r2, [r0] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r2 - strb r1, [r0] - b _0802E9A4 -_0802E8D0: - movs r6, #5 - movs r5, #0 - mov r7, ip - adds r7, #0x3c - movs r2, #0x30 - add r2, ip - mov r8, r2 - movs r0, #8 - rsbs r0, r0, #0 - mov sl, r0 - movs r1, #4 - rsbs r1, r1, #0 - mov sb, r1 -_0802E8EA: - lsls r0, r5, #2 - adds r4, r7, r0 - ldr r3, [r4] - adds r3, #0x29 - movs r1, #7 - ands r1, r6 - ldrb r2, [r3] - mov r0, sl - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - subs r6, #1 - mov r2, r8 - adds r0, r2, r5 - ldrb r0, [r0] - cmp r0, #0 - bne _0802E924 - ldr r3, [r4] - ldrb r2, [r3, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #2 - rsbs r0, r0, #0 - ands r1, r0 - mov r0, sb - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - b _0802E932 -_0802E924: - ldr r2, [r4] - ldrb r1, [r2, #0x18] - mov r0, sb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] -_0802E932: - adds r5, #1 - cmp r5, #5 - bls _0802E8EA - movs r5, #0 - movs r0, #7 - mov sb, r0 - movs r1, #8 - rsbs r1, r1, #0 - mov r8, r1 -_0802E944: - lsls r1, r5, #2 - mov r2, ip - adds r0, r2, r1 - ldrb r0, [r0, #1] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r5, #1 - cmp r0, #0x10 - bls _0802E98C - adds r0, r7, r1 - ldr r3, [r0] - adds r3, #0x29 - ldrb r4, [r3] - lsls r0, r4, #0x1d - lsrs r6, r0, #0x1d - lsls r2, r5, #2 - adds r2, r7, r2 - ldr r0, [r2] - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - mov r0, r8 - ands r0, r4 - orrs r0, r1 - strb r0, [r3] - ldr r1, [r2] - adds r1, #0x29 - mov r0, sb - ands r6, r0 - ldrb r2, [r1] - mov r0, r8 - ands r0, r2 - orrs r0, r6 - strb r0, [r1] -_0802E98C: - cmp r5, #4 - bls _0802E944 - mov r1, ip - ldr r2, [r1, #0x38] - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] -_0802E9A4: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_0802E9B0 -sub_0802E9B0: @ 0x0802E9B0 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _0802E9D0 @ =gPlayerEntity - movs r2, #0x2e - ldrsh r1, [r0, r2] - movs r3, #0x32 - ldrsh r2, [r0, r3] - adds r0, r4, #0 - bl sub_080041DC - lsrs r2, r0, #4 - cmp r2, #0x5f - bgt _0802E9D4 - movs r2, #0xa - b _0802E9EA - .align 2, 0 -_0802E9D0: .4byte gPlayerEntity -_0802E9D4: - adds r1, r2, #0 - subs r1, #0x60 - cmp r1, #0 - bge _0802E9DE - adds r1, #3 -_0802E9DE: - asrs r1, r1, #2 - movs r0, #0xa - subs r2, r0, r1 - cmp r2, #3 - bgt _0802E9EA - movs r2, #4 -_0802E9EA: - adds r0, r4, #0 - adds r0, #0x84 - ldr r3, [r0] - adds r0, r3, #0 - adds r0, #0x2d - ldrb r0, [r0] - cmp r2, r0 - beq _0802EA10 - cmp r2, r0 - ble _0802EA04 - ldrh r0, [r3, #0x2c] - adds r0, #0x20 - b _0802EA08 -_0802EA04: - ldrh r0, [r3, #0x2c] - subs r0, #0x20 -_0802EA08: - ldr r2, _0802EA14 @ =0x00001FFF - adds r1, r2, #0 - ands r0, r1 - strh r0, [r3, #0x2c] -_0802EA10: - pop {r4, pc} - .align 2, 0 -_0802EA14: .4byte 0x00001FFF - - thumb_func_start sub_0802EA18 -sub_0802EA18: @ 0x0802EA18 - push {lr} - adds r3, r2, #0 - movs r2, #0x80 - lsls r2, r2, #5 - adds r1, r1, r2 - subs r1, r1, r0 - ldr r0, _0802EA40 @ =0x00001FFF - ands r1, r0 - lsls r3, r3, #8 - subs r2, r2, r3 - cmp r1, r2 - blo _0802EA44 - movs r2, #0x80 - lsls r2, r2, #5 - adds r0, r3, r2 - cmp r1, r0 - bhi _0802EA44 - movs r0, #0 - b _0802EA46 - .align 2, 0 -_0802EA40: .4byte 0x00001FFF -_0802EA44: - movs r0, #1 -_0802EA46: - pop {pc} - - thumb_func_start sub_0802EA48 -sub_0802EA48: @ 0x0802EA48 - push {r4, lr} - adds r4, r0, #0 - cmp r3, #1 - bne _0802EA52 - rsbs r2, r2, #0 -_0802EA52: - lsls r0, r1, #2 - adds r0, r4, r0 - ldrh r1, [r0] - adds r1, r1, r2 - ldr r3, _0802EA64 @ =0x00001FFF - adds r2, r3, #0 - ands r1, r2 - strh r1, [r0] - pop {r4, pc} - .align 2, 0 -_0802EA64: .4byte 0x00001FFF - - thumb_func_start sub_0802EA68 -sub_0802EA68: @ 0x0802EA68 - push {r4, lr} - adds r4, r0, #0 - cmp r3, #2 - bne _0802EA72 - rsbs r2, r2, #0 -_0802EA72: - lsls r0, r1, #2 - adds r0, r4, r0 - ldrh r1, [r0, #0x18] - adds r1, r1, r2 - ldr r3, _0802EA84 @ =0x00001FFF - adds r2, r3, #0 - ands r1, r2 - strh r1, [r0, #0x18] - pop {r4, pc} - .align 2, 0 -_0802EA84: .4byte 0x00001FFF - - thumb_func_start sub_0802EA88 -sub_0802EA88: @ 0x0802EA88 - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r6, #0 - movs r3, #0 -_0802EA90: - lsls r0, r3, #2 - adds r4, r5, r0 - adds r2, r3, #1 - lsls r0, r2, #2 - adds r1, r5, r0 - ldrb r0, [r4, #1] - ldrb r3, [r1, #1] - cmp r0, r3 - beq _0802EAC2 - movs r6, #1 - ldrb r0, [r1, #1] - ldrb r1, [r4, #1] - subs r0, r0, r1 - movs r1, #0x1f - ands r0, r1 - movs r3, #1 - cmp r0, #0x10 - ble _0802EAB6 - movs r3, #0 -_0802EAB6: - adds r0, r5, #0 - adds r1, r2, #0 - movs r2, #0x20 - bl sub_0802EA48 - b _0802EAC8 -_0802EAC2: - adds r3, r2, #0 - cmp r3, #4 - bls _0802EA90 -_0802EAC8: - movs r3, #0 - movs r4, #0x1f -_0802EACC: - adds r2, r3, #1 - lsls r0, r2, #2 - adds r0, r5, r0 - ldrb r1, [r0, #1] - lsls r0, r3, #2 - adds r0, r5, r0 - ldrb r0, [r0, #1] - subs r0, r1, r0 - ands r0, r4 - adds r3, r1, #0 - adds r1, r2, #0 - cmp r0, #0x10 - ble _0802EAEE - cmp r0, #0x1e - bgt _0802EAF6 - adds r3, #1 - b _0802EAF4 -_0802EAEE: - cmp r0, #1 - ble _0802EAF6 - subs r3, #1 -_0802EAF4: - ands r3, r4 -_0802EAF6: - lsls r0, r1, #2 - adds r0, r5, r0 - strb r3, [r0, #1] - adds r3, r1, #0 - cmp r3, #4 - bls _0802EACC - adds r0, r6, #0 - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0802EB08 -sub_0802EB08: @ 0x0802EB08 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - adds r6, r1, #0 - adds r7, r2, #0 - movs r0, #0 - mov r8, r0 - movs r3, #0 -_0802EB1A: - lsls r0, r3, #2 - adds r4, r5, r0 - adds r2, r3, #1 - lsls r0, r2, #2 - adds r1, r5, r0 - ldrb r0, [r4, #0x19] - ldrb r3, [r1, #0x19] - cmp r0, r3 - beq _0802EB4E - movs r0, #1 - mov r8, r0 - ldrb r0, [r1, #0x19] - ldrb r1, [r4, #0x19] - subs r0, r0, r1 - movs r1, #0x1f - ands r0, r1 - movs r3, #2 - cmp r0, #0x10 - ble _0802EB42 - movs r3, #3 -_0802EB42: - adds r0, r5, #0 - adds r1, r2, #0 - adds r2, r6, #0 - bl sub_0802EA68 - b _0802EB54 -_0802EB4E: - adds r3, r2, #0 - cmp r3, #4 - bls _0802EB1A -_0802EB54: - movs r3, #0 - movs r4, #0x1f - rsbs r6, r7, #0 - ands r6, r4 -_0802EB5C: - adds r2, r3, #1 - lsls r0, r2, #2 - adds r0, r5, r0 - ldrb r1, [r0, #0x19] - lsls r0, r3, #2 - adds r0, r5, r0 - ldrb r0, [r0, #0x19] - subs r0, r1, r0 - ands r0, r4 - adds r3, r1, #0 - adds r1, r2, #0 - cmp r0, #0x10 - ble _0802EB7E - cmp r6, r0 - ble _0802EB86 - adds r3, #1 - b _0802EB84 -_0802EB7E: - cmp r7, r0 - bge _0802EB86 - subs r3, #1 -_0802EB84: - ands r3, r4 -_0802EB86: - lsls r0, r1, #2 - adds r0, r5, r0 - strb r3, [r0, #0x19] - adds r3, r1, #0 - cmp r3, #4 - bls _0802EB5C - mov r0, r8 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_0802EB9C -sub_0802EB9C: @ 0x0802EB9C - push {r4, lr} - adds r4, r0, #0 - ldr r0, _0802EBBC @ =gUnk_080CD850 - bl GetRandomByWeight - ldr r1, _0802EBC0 @ =gUnk_080CD854 - adds r0, r0, r1 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x74 - strb r1, [r0] - adds r4, #0x75 - ldrb r0, [r4] - adds r0, #1 - strb r0, [r4] - pop {r4, pc} - .align 2, 0 -_0802EBBC: .4byte gUnk_080CD850 -_0802EBC0: .4byte gUnk_080CD854 - - thumb_func_start sub_0802EBC4 -sub_0802EBC4: @ 0x0802EBC4 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x74 - ldrb r0, [r1] - adds r6, r0, #0 - cmp r6, #0 - bne _0802EC66 - ldr r1, _0802EC18 @ =gUnk_080CD86C - adds r5, r4, #0 - adds r5, #0x79 - ldrb r0, [r5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl GetRandomByWeight - ldr r2, _0802EC1C @ =gUnk_080CD878 - ldrb r1, [r5] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - adds r1, r1, r0 - adds r2, r4, #0 - adds r2, #0x75 - ldrb r0, [r1] - ldrb r1, [r2] - cmp r0, r1 - bhs _0802EC60 - strb r6, [r2] - ldrb r1, [r5] - cmp r1, #0 - bne _0802EC20 - adds r0, r4, #0 - adds r0, #0x76 - strb r1, [r0] - adds r1, r4, #0 - adds r1, #0x77 - movs r0, #3 - strb r0, [r1] - b _0802EC56 - .align 2, 0 -_0802EC18: .4byte gUnk_080CD86C -_0802EC1C: .4byte gUnk_080CD878 -_0802EC20: - bl Random - adds r1, r0, #0 - movs r5, #1 - ands r1, r5 - adds r3, r4, #0 - adds r3, #0x76 - ldrb r0, [r3] - cmp r1, r0 - beq _0802EC3E - strb r1, [r3] - adds r0, r4, #0 - adds r0, #0x77 - strb r5, [r0] - b _0802EC56 -_0802EC3E: - adds r2, r4, #0 - adds r2, #0x77 - ldrb r0, [r2] - adds r0, #1 - strb r0, [r2] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #2 - bls _0802EC54 - eors r1, r5 - strb r5, [r2] -_0802EC54: - strb r1, [r3] -_0802EC56: - movs r1, #0 - movs r0, #3 - strb r0, [r4, #0xd] - strb r1, [r4, #0xb] - b _0802EC6A -_0802EC60: - movs r0, #2 - strb r0, [r4, #0xd] - b _0802EC6A -_0802EC66: - subs r0, #1 - strb r0, [r1] -_0802EC6A: - pop {r4, r5, r6, pc} diff --git a/asm/non_matching/gleerok/sub_0802D33C.inc b/asm/non_matching/gleerok/sub_0802D33C.inc deleted file mode 100644 index 9d5969e8..00000000 --- a/asm/non_matching/gleerok/sub_0802D33C.inc +++ /dev/null @@ -1,45 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r0, #0x84 - ldr r6, [r0] - movs r4, #0 - adds r7, r6, #0 - adds r7, #0x3c - adds r5, r7, #0 -_0802D34A: - ldm r5!, {r0} - bl DeleteEntity - adds r4, #1 - cmp r4, #3 - bls _0802D34A - lsls r1, r4, #2 - adds r1, r7, r1 - ldr r0, [r1] - adds r0, #0x45 - movs r3, #0 - strb r3, [r0] - ldr r1, [r1] - adds r1, #0x6d - ldrb r2, [r1] - movs r0, #1 - orrs r0, r2 - strb r0, [r1] - ldr r0, [r6, #0x50] - adds r0, #0x45 - strb r3, [r0] - ldr r0, [r6, #0x50] - strb r3, [r0, #0xb] - ldr r3, [r6, #0x50] - ldrb r2, [r3, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #2 - rsbs r0, r0, #0 - ands r1, r0 - subs r0, #2 - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - bl DeleteThisEntity - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/asm/non_matching/gleerok/sub_0802E768.inc b/asm/non_matching/gleerok/sub_0802E768.inc new file mode 100644 index 00000000..0a99cd88 --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802E768.inc @@ -0,0 +1,61 @@ + .syntax unified + + .text + push {r4, r5, r6, lr} + adds r4, r0, #0 + movs r2, #0 + movs r6, #0x1f +_0802E770: + lsls r3, r2, #2 + adds r0, r4, r3 + ldrb r1, [r0, #1] + adds r2, #1 + lsls r0, r2, #2 + adds r0, r4, r0 + ldrb r0, [r0, #1] + subs r0, r1, r0 + ands r0, r6 + adds r5, r2, #0 + cmp r0, #0x10 + ble _0802E790 + cmp r0, #0x1e + bgt _0802E798 + adds r1, #1 + b _0802E796 +_0802E790: + cmp r0, #1 + ble _0802E798 + subs r1, #1 +_0802E796: + ands r1, r6 +_0802E798: + adds r0, r4, r3 + strb r1, [r0, #1] + ldrb r1, [r0, #0x19] + lsls r0, r5, #2 + adds r0, r4, r0 + ldrb r0, [r0, #0x19] + subs r0, r1, r0 + movs r2, #0x1f + ands r0, r2 + cmp r0, #0x10 + ble _0802E7B6 + cmp r0, #0x1d + bgt _0802E7BE + adds r1, #1 + b _0802E7BC +_0802E7B6: + cmp r0, #2 + ble _0802E7BE + subs r1, #1 +_0802E7BC: + ands r1, r2 +_0802E7BE: + adds r0, r4, r3 + strb r1, [r0, #0x19] + adds r2, r5, #0 + cmp r2, #4 + bls _0802E770 + pop {r4, r5, r6, pc} + .align 2, 0 + .syntax divided diff --git a/asm/non_matching/gleerok/sub_0802EA88.inc b/asm/non_matching/gleerok/sub_0802EA88.inc new file mode 100644 index 00000000..b419969b --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802EA88.inc @@ -0,0 +1,75 @@ + .syntax unified + + .text +push {r4, r5, r6, lr} + adds r5, r0, #0 + movs r6, #0 + movs r3, #0 +_0802EA90: + lsls r0, r3, #2 + adds r4, r5, r0 + adds r2, r3, #1 + lsls r0, r2, #2 + adds r1, r5, r0 + ldrb r0, [r4, #1] + ldrb r3, [r1, #1] + cmp r0, r3 + beq _0802EAC2 + movs r6, #1 + ldrb r0, [r1, #1] + ldrb r1, [r4, #1] + subs r0, r0, r1 + movs r1, #0x1f + ands r0, r1 + movs r3, #1 + cmp r0, #0x10 + ble _0802EAB6 + movs r3, #0 +_0802EAB6: + adds r0, r5, #0 + adds r1, r2, #0 + movs r2, #0x20 + bl sub_0802EA48 + b _0802EAC8 +_0802EAC2: + adds r3, r2, #0 + cmp r3, #4 + bls _0802EA90 +_0802EAC8: + movs r3, #0 + movs r4, #0x1f +_0802EACC: + adds r2, r3, #1 + lsls r0, r2, #2 + adds r0, r5, r0 + ldrb r1, [r0, #1] + lsls r0, r3, #2 + adds r0, r5, r0 + ldrb r0, [r0, #1] + subs r0, r1, r0 + ands r0, r4 + adds r3, r1, #0 + adds r1, r2, #0 + cmp r0, #0x10 + ble _0802EAEE + cmp r0, #0x1e + bgt _0802EAF6 + adds r3, #1 + b _0802EAF4 +_0802EAEE: + cmp r0, #1 + ble _0802EAF6 + subs r3, #1 +_0802EAF4: + ands r3, r4 +_0802EAF6: + lsls r0, r1, #2 + adds r0, r5, r0 + strb r3, [r0, #1] + adds r3, r1, #0 + cmp r3, #4 + bls _0802EACC + adds r0, r6, #0 + pop {r4, r5, r6, pc} + .align 2, 0 + .syntax divided diff --git a/asm/non_matching/gleerok/sub_0802EB08.inc b/asm/non_matching/gleerok/sub_0802EB08.inc new file mode 100644 index 00000000..f859c19d --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802EB08.inc @@ -0,0 +1,85 @@ + .syntax unified + + .text + push {r4, r5, r6, r7, lr} + mov r7, r8 + push {r7} + adds r5, r0, #0 + adds r6, r1, #0 + adds r7, r2, #0 + movs r0, #0 + mov r8, r0 + movs r3, #0 +_0802EB1A: + lsls r0, r3, #2 + adds r4, r5, r0 + adds r2, r3, #1 + lsls r0, r2, #2 + adds r1, r5, r0 + ldrb r0, [r4, #0x19] + ldrb r3, [r1, #0x19] + cmp r0, r3 + beq _0802EB4E + movs r0, #1 + mov r8, r0 + ldrb r0, [r1, #0x19] + ldrb r1, [r4, #0x19] + subs r0, r0, r1 + movs r1, #0x1f + ands r0, r1 + movs r3, #2 + cmp r0, #0x10 + ble _0802EB42 + movs r3, #3 +_0802EB42: + adds r0, r5, #0 + adds r1, r2, #0 + adds r2, r6, #0 + bl sub_0802EA68 + b _0802EB54 +_0802EB4E: + adds r3, r2, #0 + cmp r3, #4 + bls _0802EB1A +_0802EB54: + movs r3, #0 + movs r4, #0x1f + rsbs r6, r7, #0 + ands r6, r4 +_0802EB5C: + adds r2, r3, #1 + lsls r0, r2, #2 + adds r0, r5, r0 + ldrb r1, [r0, #0x19] + lsls r0, r3, #2 + adds r0, r5, r0 + ldrb r0, [r0, #0x19] + subs r0, r1, r0 + ands r0, r4 + adds r3, r1, #0 + adds r1, r2, #0 + cmp r0, #0x10 + ble _0802EB7E + cmp r6, r0 + ble _0802EB86 + adds r3, #1 + b _0802EB84 +_0802EB7E: + cmp r7, r0 + bge _0802EB86 + subs r3, #1 +_0802EB84: + ands r3, r4 +_0802EB86: + lsls r0, r1, #2 + adds r0, r5, r0 + strb r3, [r0, #0x19] + adds r3, r1, #0 + cmp r3, #4 + bls _0802EB5C + mov r0, r8 + pop {r3} + mov r8, r3 + pop {r4, r5, r6, r7, pc} + .align 2, 0 + .syntax divided diff --git a/linker.ld b/linker.ld index f9f4e0f6..81e26aff 100644 --- a/linker.ld +++ b/linker.ld @@ -328,7 +328,6 @@ SECTIONS { src/enemy/bobomb.o(.text); src/enemy/wallMaster2.o(.text); src/enemy/gleerok.o(.text); - asm/enemy/gleerok.o(.text); src/enemy/vaatiEyesMacro.o(.text); src/enemy/tektite.o(.text); src/enemy/wizzrobeWind.o(.text); diff --git a/src/enemy/gleerok.c b/src/enemy/gleerok.c index a95d0607..ed55e2c2 100644 --- a/src/enemy/gleerok.c +++ b/src/enemy/gleerok.c @@ -7,7 +7,16 @@ #include "object.h" typedef struct { - /*0x00*/ u8 filler[0x30]; + union SplitHWord unk0; + u8 unk2; + u8 unk3; +} Gleerok_HeapStruct2; + +typedef struct { + /*0x00*/ Gleerok_HeapStruct2 filler[6]; + /*0x00*/ Gleerok_HeapStruct2 filler2[5]; + /*0x2c*/ union SplitHWord unk_2c; + /*0x2e*/ u16 filler_2e; /*0x30*/ u8 unk_30[6]; /*0x36*/ u8 filler_36[0x2]; /*0x38*/ Entity* ent; @@ -43,27 +52,31 @@ extern void (*const gUnk_080CD828[])(GleerokEntity*); extern void (*const gUnk_080CD848[])(GleerokEntity*); extern u8 gUnk_080CD774[]; -extern u8 gUnk_080CD7C4[]; +extern Gleerok_HeapStruct2 gUnk_080CD7C4[]; extern u8 gUnk_080CD884[]; extern u8 gUnk_080CD7F8[]; extern u8 gUnk_080CD840[]; extern u8 gUnk_080CD844[]; +extern u8 gUnk_080CD850[]; +extern u8 gUnk_080CD854[]; +extern const u8* gUnk_080CD86C[]; +extern const u8* gUnk_080CD878[]; extern u32 sub_0806FC80(Entity*, Entity*, s32); extern void sub_0802E518(GleerokEntity* this); extern void sub_0802E7E4(Gleerok_HeapStruct* this); extern void sub_0802E1D0(GleerokEntity* this); -extern u32 sub_0802EB9C(GleerokEntity* this); +extern void sub_0802EB9C(GleerokEntity* this); extern void sub_0802D86C(GleerokEntity* this); extern void sub_0802E430(GleerokEntity* this); extern void sub_0802EBC4(GleerokEntity* this); extern void sub_0802E9B0(GleerokEntity* this); -extern bool32 sub_0802EB08(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3); -extern bool32 sub_0802EA18(u16 param_1, u16 param_2, u32 param_3); -extern bool32 sub_0802EA48(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); -extern bool32 sub_0802EA68(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); +extern bool32 sub_0802EB08(Gleerok_HeapStruct* param_1, u32 param_2, s32 param_3); +extern bool32 sub_0802EA18(u32 param_1, u32 param_2, u32 param_3); +extern void sub_0802EA48(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); +extern void sub_0802EA68(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); extern bool32 sub_0802E7CC(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); extern bool32 sub_0802EA88(Gleerok_HeapStruct* param_1); extern bool32 sub_0802E768(Gleerok_HeapStruct* param_1); @@ -134,8 +147,8 @@ void sub_0802D170(GleerokEntity* this) { return; if (super->action == 1) { - this->unk_84->filler[1] = 0x10; - this->unk_84->filler[0x19] = 0x10; + this->unk_84->filler[0].unk0.HALF.HI = 0x10; + this->unk_84->filler2[0].unk0.HALF.HI = 0x10; if (sub_0802EB08(this->unk_84, 0x40, 2) == 0 && sub_0802EA88(this->unk_84) == 0) { super->action = 2; gPlayerEntity.x.HALF.HI = gRoomControls.origin_x + 0x98; @@ -149,7 +162,7 @@ void sub_0802D170(GleerokEntity* this) { super->action = 3; this->unk_80 = 0; ((Entity*)this->unk_84)->parent->timer = 24; - this->unk_84->filler[0x19] = 0; + this->unk_84->filler2[0].unk0.HALF.HI = 0; } } @@ -162,7 +175,7 @@ void sub_0802D218(GleerokEntity* this) { super->subtimer = 0; this->unk_7c.HALF_U.LO = 0xb4; ((Entity*)(this->unk_84))->parent->timer = 12; - CreateObjectWithParent(super, 0x67, 0x2, this->unk_7c.HALF_U.LO); + CreateObjectWithParent(super, GLEEROK_PARTICLE, 0x2, this->unk_7c.HALF_U.LO); } void sub_0802D258(GleerokEntity* this) { @@ -214,28 +227,21 @@ void sub_0802D258(GleerokEntity* this) { sub_0802E768(this->unk_84); } -NONMATCH("asm/non_matching/gleerok/sub_0802D33C.inc", void sub_0802D33C(GleerokEntity* this)) { - u8* unk_84 = (u8*)this->unk_84; - u8* ptr = unk_84; - u8* ptr2; - u32 i = 0; - ptr += 0x3c; - ptr2 = ptr; +void sub_0802D33C(GleerokEntity* this) { + Gleerok_HeapStruct* unk_84 = this->unk_84; + u32 i; - do { - DeleteEntity(*(Entity**)ptr); - ptr += 4; - } while (i < 4); + for (i = 0; i < 4; i++) { + DeleteEntity(unk_84->entities[i]); + } - ptr2 += (i << 2); - *(u32*)((*(u8**)ptr2) + 0x45) = 0; - *((*(u8**)ptr2) + 0x6d) |= 1; - ((Entity*)(*(u8**)(unk_84 + 0x50)))->health = 0; - ((Entity*)(*(u8**)(unk_84 + 0x50)))->type2 = 0; - ((Entity*)(*(u8**)(unk_84 + 0x50)))->spriteSettings.draw &= ~1; + unk_84->entities[i]->health = 0; + ((GenericEntity*)unk_84->entities[i])->field_0x6c.HALF.HI |= 1; + unk_84->ent2->health = 0; + unk_84->ent2->type2 = 0; + unk_84->ent2->spriteSettings.draw &= ~1; DeleteThisEntity(); } -END_NONMATCH void Gleerok_OnTick(GleerokEntity* this) { gUnk_080CD7B8[super->action](this); @@ -247,8 +253,8 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE Entity* ent; Gleerok_HeapStruct* heap; u32 val; - u8* ptr; - u8* ptr2; + Gleerok_HeapStruct2* ptr; + Gleerok_HeapStruct2* ptr2; if (CheckGlobalFlag(LV2_CLEAR)) { gScreen.lcd.displayControl &= 0xFDFF; @@ -281,10 +287,9 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE uvar1 = 0; do { - ent = CreateEnemy(GLEEROK, 1); - super->child = ent; - if (ent != NULL) { - ent->type2 = uvar1 + 1; + super->child = CreateEnemy(GLEEROK, 1); + if (super->child != NULL) { + super->child->type2 = uvar1 + 1; super->child->collisionLayer = super->collisionLayer; super->child->x.HALF.HI = super->x.HALF.HI; super->child->y.HALF.HI = super->y.HALF.HI + ((uvar1 + 1) * 12); @@ -292,10 +297,10 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE ((GleerokEntity*)super->child)->unk_84 = this->unk_84; this->unk_84->entities[uvar1] = super->child; ptr = this->unk_84->filler; - ptr2 = ptr + uvar1 * 4; - ptr2[1] = 0x10; - ptr2[0x19] = 0; - ptr[0x35] = 0; + ptr2 = ptr + uvar1; + ptr2[0].unk0.HALF.HI = 0x10; + ptr2[6].unk0.HALF.HI = 0; + ptr[13].unk0.HALF.HI = 0; } } while (++uvar1 < 5); @@ -308,9 +313,9 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE super->child->parent = super; ((GleerokEntity*)super->child)->unk_84 = this->unk_84; heap->ent2 = super->child; - heap->filler[0x15] = 0x10; - heap->filler[0x2d] = 0; - heap->filler[0x35] = 0; + heap->filler[5].unk0.HALF.HI = 0x10; + heap->filler2[5].unk0.HALF.HI = 0; + heap->filler[13].unk0.HALF.HI = 0; } #ifndef EU gPlayerState.controlMode = CONTROL_DISABLED; @@ -322,9 +327,7 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE COLLISION_ON(super); super->flags2 |= 0x80; } - ptr = gUnk_080CD7C4; - ptr += super->type2 * 4; - super->spritePriority.b0 = *(ptr + 1); + super->spritePriority.b0 = gUnk_080CD7C4[super->type2].unk0.HALF.HI; super->subtimer = 0; InitializeAnimation(super, 0x24); break; @@ -411,15 +414,14 @@ void sub_0802D714(GleerokEntity* this) { Entity* enemy; u32 index; u32 val1, val2; - u8* ptr; + Gleerok_HeapStruct2* ptr; Gleerok_HeapStruct* heap; if (--this->unk_7c.WORD != -1) return; - for (heap = this->unk_84, index = 0, val1 = 0, val2 = 0x10, ptr = this->unk_84->filler; index < 6; - ptr += 4, ++index) { - *(u16*)(ptr + 0x18) = val1; - *(ptr + 1) = val2; + for (heap = this->unk_84, index = 0, val1 = 0, val2 = 0x10, ptr = this->unk_84->filler; index < 6; ptr++, ++index) { + ptr[6].unk0.HWORD = val1; + ptr->unk0.HALF.HI = val2; } super->subAction = 3; @@ -577,7 +579,7 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D86C.inc", void sub_0802D86C(GleerokE super->child = enemy; if (enemy) { enemy->parent = super->parent; - super->timer = this->unk_84->filler[1]; + super->timer = this->unk_84->filler[0].unk0.HALF.HI; this->unk_84->ent = super->child; ((GleerokEntity*)super->child)->unk_84 = this->unk_84; } @@ -608,8 +610,8 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D86C.inc", void sub_0802D86C(GleerokE SoundReq(SFX_BUTTON_PRESS); } } else { - if (super->timer != this->unk_84->filler[1]) { - if (((super->timer - this->unk_84->filler[1]) & 0x1f) > 0x10) { + if (super->timer != this->unk_84->filler[0].unk0.HALF.HI) { + if (((super->timer - this->unk_84->filler[0].unk0.HALF.HI) & 0x1f) > 0x10) { if (++super->frameIndex >= 0x31) { super->frameIndex = 0x28; } @@ -619,7 +621,7 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D86C.inc", void sub_0802D86C(GleerokE } } - super->timer = this->unk_84->filler[1]; + super->timer = this->unk_84->filler[0].unk0.HALF.HI; } } @@ -654,13 +656,13 @@ END_NONMATCH void sub_0802DB84(GleerokEntity* this) { u32 timer; super->direction = GetFacingDirection(super, &gPlayerEntity); - if (this->unk_84->filler[0x1] == super->direction) { + if (this->unk_84->filler[0].unk0.HALF.HI == super->direction) { super->subAction = 1; this->unk_78 = 0; return; } - if (((this->unk_84->filler[0x1] - super->direction) & 0x1f) > 0x10) { + if (((this->unk_84->filler[0].unk0.HALF.HI - super->direction) & 0x1f) > 0x10) { timer = 0; super->timer &= 0xfe; } else { @@ -688,7 +690,7 @@ void sub_0802DB84(GleerokEntity* this) { void sub_0802DC1C(GleerokEntity* this) { u32 diff = GetFacingDirection(super, &gPlayerEntity); - diff = (this->unk_84->filler[1] - diff) & 0x1f; + diff = (this->unk_84->filler[0].unk0.HALF.HI - diff) & 0x1f; if (diff > 0x10) { if (diff <= 0x1d) { @@ -711,11 +713,11 @@ void sub_0802DC1C(GleerokEntity* this) { } sub_0802EA48(this->unk_84, 5, 0x20, diff); - if (sub_0802EA18(*(u16*)&this->unk_84->filler[0], *(u16*)&this->unk_84->filler[0x14], 4)) { + if (sub_0802EA18(this->unk_84->filler[0].unk0.HWORD, this->unk_84->filler[5].unk0.HWORD, 4)) { if (super->timer == 1) { - *(u16*)&this->unk_84->filler[0x14] = (((this->unk_84->filler[0x1] - 4) & 0x1f) << 8) | 0xff; + this->unk_84->filler[5].unk0.HWORD = (((this->unk_84->filler[0].unk0.HALF.HI - 4) & 0x1f) << 8) | 0xff; } else { - *(u16*)&this->unk_84->filler[0x14] = (((this->unk_84->filler[0x1] + 4) & 0x1f) << 8); + this->unk_84->filler[5].unk0.HWORD = (((this->unk_84->filler[0].unk0.HALF.HI + 4) & 0x1f) << 8); } super->timer ^= 1; @@ -732,13 +734,13 @@ void sub_0802DC1C(GleerokEntity* this) { void sub_0802DCE0(GleerokEntity* this) { if (this->unk_84->ent2->timer != 12) { super->direction = GetFacingDirection(super, &gPlayerEntity); - if (this->unk_84->filler[0x15] == super->direction) { + if (this->unk_84->filler[5].unk0.HALF.HI == super->direction) { this->unk_84->ent2->timer = 12; this->unk_82 = 4; super->subtimer = 0; } else { s32 svar1, diff; - diff = ((this->unk_84->filler[0x15] - super->direction) & 0x1f); + diff = ((this->unk_84->filler[5].unk0.HALF.HI - super->direction) & 0x1f); svar1 = 1; if (diff > 0x10) { svar1 = 0; @@ -761,7 +763,7 @@ void sub_0802DCE0(GleerokEntity* this) { super->child = CreateProjectileWithParent(super, GLEEROK_PROJECTILE, 0); if (super->child != NULL) { - super->child->direction = this->unk_84->filler[0x15]; + super->child->direction = this->unk_84->filler[5].unk0.HALF.HI; super->child->type2 = this->unk_84->ent2->frame & 0xf; super->child->parent = this->unk_84->ent2; super->child->child = this->unk_84->entities[0]; @@ -805,10 +807,10 @@ void sub_0802DDD8(GleerokEntity* this) { if ((Random() & 1) == 0) { super->direction = 0; - this->unk_7a = (this->unk_84->filler[1] + uvar1) & 0x1f; + this->unk_7a = (this->unk_84->filler[0].unk0.HALF.HI + uvar1) & 0x1f; } else { super->direction = 1; - this->unk_7a = (this->unk_84->filler[1] - uvar1) & 0x1f; + this->unk_7a = (this->unk_84->filler[0].unk0.HALF.HI - uvar1) & 0x1f; } break; @@ -828,7 +830,7 @@ void sub_0802DDD8(GleerokEntity* this) { if (this->unk_84->ent2->subtimer == 1) { super->child = CreateProjectileWithParent(super, GLEEROK_PROJECTILE, r2); if (super->child != NULL) { - super->child->direction = this->unk_84->filler[0x15]; + super->child->direction = this->unk_84->filler[5].unk0.HALF.HI; super->child->type2 = this->unk_84->ent2->frame & 0xf; super->child->parent = this->unk_84->ent2; super->child->child = this->unk_84->entities[0]; @@ -858,7 +860,7 @@ void sub_0802DDD8(GleerokEntity* this) { } sub_0802E768(this->unk_84); - if (this->unk_7a == this->unk_84->filler[0x15]) { + if (this->unk_7a == this->unk_84->filler[5].unk0.HALF.HI) { if (super->type2 == 1) { super->type2 = 2; super->direction ^= 1; @@ -888,7 +890,7 @@ void sub_0802DFA8(GleerokEntity* this) { } void sub_0802DFC0(GleerokEntity* this) { - u32 val = this->unk_84->filler[1] & 7; + u32 val = this->unk_84->filler[0].unk0.HALF.HI & 7; if (val) { if (val > 4) { super->direction = 0; @@ -921,10 +923,10 @@ void sub_0802E034(GleerokEntity* this) { val = 0; } else { super->direction = 3; - val = gUnk_080CD840[heap->filler[1] >> 3]; + val = gUnk_080CD840[heap->filler[0].unk0.HALF.HI >> 3]; } - if (val != heap->filler[0x19]) { + if (val != heap->filler2[0].unk0.HALF.HI) { sub_0802EA68(heap, 0, 0x40, super->direction); sub_0802EB08(heap, 0x40, 2); } else { @@ -936,7 +938,7 @@ void sub_0802E034(GleerokEntity* this) { } super->type2++; - heap->filler[0x19] = 1; + heap->filler2[0].unk0.HALF.HI = 1; } } @@ -1043,7 +1045,7 @@ void sub_0802E1D0(GleerokEntity* this) { void sub_0802E300(GleerokEntity* this) { u32 dir, tmp; u32 index; - u8* ptr; + Gleerok_HeapStruct2* ptr; u8* ptr2; Entity* ent; Gleerok_HeapStruct* heap; @@ -1082,9 +1084,9 @@ void sub_0802E300(GleerokEntity* this) { tmp = 0; ptr = heap->filler; do { - ((u16*)ptr)[0xc] = tmp; - ptr[1] = dir; - ptr += 4; + ptr[6].unk0.HWORD = tmp; + ptr->unk0.HALF.HI = dir; + ptr++; index++; } while (index <= 5); @@ -1118,7 +1120,7 @@ void sub_0802E448(GleerokEntity* this) { Gleerok_HeapStruct* heap = this->unk_84; s32 index; for (index = 5; index >= 0; index--) { - u8* ptr = &heap->filler[0x30]; + u8* ptr = heap->unk_30; if (ptr[index] == 0) { CreateFx(heap->entities[0], FX_LAVA_SPLASH, 0); SoundReq(SFX_PLY_LAND); @@ -1132,7 +1134,7 @@ void sub_0802E448(GleerokEntity* this) { } } - if (heap->filler[0x2d] <= 9) { + if (heap->unk_2c.HALF.HI <= 9) { sub_0802EA68(heap, 5, 0x40, 3); } @@ -1171,9 +1173,9 @@ NONMATCH("asm/non_matching/gleerok/sub_0802E518.inc", void sub_0802E518(GleerokE s32 r7; Gleerok_HeapStruct* heap = this->unk_84; CopyPosition(heap->entities[0]->parent, heap->entities[0]); - heap->entities[0]->direction = heap->filler[1]; + heap->entities[0]->direction = heap->filler->unk0.HALF.HI; - r6 = heap->filler[1]; + r6 = heap->filler->unk0.HALF.HI; if (r6 > 0x10) { r6 ^= 0xf; r6 = (r6 + 1) & 0xf; @@ -1185,29 +1187,29 @@ NONMATCH("asm/non_matching/gleerok/sub_0802E518.inc", void sub_0802E518(GleerokE heap->entities[0]->speed = ((r6 ^ 0xf) + 0x12) << 8; LinearMoveUpdate(heap->entities[0]); - sp4 = *(u32*)&heap->filler[0x30]; + sp4 = *(u32*)&heap->unk_30; sp8 = this->unk_80; for (index = 0; index <= 4; index++) { s32 result; CopyPosition(heap->entities[index], heap->entities[index + 1]); - result = FixedMul(gSineTable[heap->filler[0x19 + (index + 1) * 4]], ((u8*)sp4)[r6]); + result = FixedMul(gSineTable[heap->filler2[(index + 1)].unk0.HALF.HI * 8], (heap->unk_30)[r6] << 8); result = FixedDiv(result, 0x100); - result = FixedMul(gSineTable[heap->filler[0x1 + (index + 1) * 4]], result); + result = FixedMul(gSineTable[heap->filler[(index + 1)].unk0.HALF.HI * 8], result); result = FixedDiv(result, 0x100); heap->entities[index]->x.WORD += result << 8; - result = FixedMul(gSineTable[heap->filler[0x19 + (index + 1) * 4]], ((u8*)sp4)[r6]); + result = FixedMul(gSineTable[heap->filler2[(index + 1)].unk0.HALF.HI * 8 + 0x40], (heap->unk_30)[r6] << 8); result = FixedDiv(result, 0x100); heap->entities[index]->y.WORD -= result << 8; } if (heap->ent2->timer == 24) { - r7 = (heap->filler[0x15] >> 3) << 2; - if (heap->filler[0x2d] > 0xc) { + r7 = (heap->filler[5].unk0.HALF.HI >> 3) << 2; + if (heap->unk_2c.HALF.HI > 0xc) { r7 += 3; } else { - r7 += heap->filler[0x2d] >> 2; + r7 += heap->unk_2c.HALF.HI >> 2; } if (heap->ent2->animIndex != r7 + 0x18) { @@ -1216,15 +1218,21 @@ NONMATCH("asm/non_matching/gleerok/sub_0802E518.inc", void sub_0802E518(GleerokE } else { if (this->unk_80 == 0) { sub_0802E7CC(heap, 5, 0, 0); - r7 = (heap->ent2->animationState / 2 + heap->ent2->animationState) / 4; - r7 += heap->ent2->timer; + r7 = (heap->ent2->animationState + (heap->ent2->animationState >> 1)); + r7 = (r7 >> 2) + heap->ent2->timer; } else { if (super->iframes == 0) { - if ((super->animIndex != (heap->filler[0x15] >> 3) + 0x2f) || (super->frame & ANIM_DONE) != 0) { - r7 = (heap->filler[0x15] >> 3) + 0x28; + if ((super->animIndex != (heap->filler[5].unk0.HALF.HI >> 3) + 0x2f)) { + r7 = (heap->filler[5].unk0.HALF.HI >> 3) + 0x28; + } else { + if ((super->frame & ANIM_DONE) != 0) { + r7 = (heap->filler[5].unk0.HALF.HI >> 3) + 0x28; + } else { + r7 = super->animIndex; + } } } else { - r7 = (heap->filler[0x15] >> 3) + 0x2f; + r7 = (heap->filler[5].unk0.HALF.HI >> 3) + 0x2f; } } @@ -1240,9 +1248,9 @@ NONMATCH("asm/non_matching/gleerok/sub_0802E518.inc", void sub_0802E518(GleerokE u32 val; sub_0802E7CC(heap, (u8)index, 0, 0); r7 = heap->entities[index]->animationState * 12; - r7 += (((s32)heap->filler[0x19 + (index + 1) * 4]) / 3) * 12; + r7 += (((s32)heap->filler2[(index + 1)].unk0.HALF.HI) / 3) * 12; } else { - r7 = heap->filler[0x1 + index * 4] >> 3; + r7 = heap->filler[index].unk0.HALF.HI >> 3; r7 += 0x48; } if (heap->entities[index]->animIndex != r7) { @@ -1251,3 +1259,273 @@ NONMATCH("asm/non_matching/gleerok/sub_0802E518.inc", void sub_0802E518(GleerokE } } END_NONMATCH + +NONMATCH("asm/non_matching/gleerok/sub_0802E768.inc", bool32 sub_0802E768(Gleerok_HeapStruct* param_1)) { + s32 bVar2; + s32 bVar2a; + u32 bVar3; + + // solves regalloc + // register u32 bVar3 asm("r1"); + u32 bVar3a; + u32 uVar4; + s32 iVar5; + + for (uVar4 = 0; uVar4 <= 4; uVar4++) { + bVar3 = param_1->filler[uVar4].unk0.HALF.HI; + bVar2 = (bVar3 - param_1->filler[uVar4 + 1].unk0.HALF.HI) & 0x1f; + + if (bVar2 > 0x10) { + if (bVar2 <= 0x1e) { + bVar3 = (bVar3 + 1) & 0x1f; + } + } else if (bVar2 > 1) { + bVar3 = (bVar3 - 1) & 0x1f; + } + + param_1->filler[uVar4].unk0.HALF.HI = bVar3; + bVar3 = param_1->filler2[uVar4].unk0.HALF.HI; + bVar2 = (bVar3 - param_1->filler2[uVar4 + 1].unk0.HALF.HI) & 0x1f; + + if (bVar2 > 0x10) { + if (bVar2 <= 0x1d) { + bVar3 = (bVar3 + 1) & 0x1f; + } + } else if (bVar2 > 2) { + bVar3 = (bVar3 - 1) & 0x1f; + } + + param_1->filler2[uVar4].unk0.HALF.HI = bVar3; + } +} +END_NONMATCH + +u32 sub_0802E7CC(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4) { + param_1->entities[(u8)param_2]->animationState = param_1->filler[(u8)param_2].unk0.HALF.HI; + return param_1->entities[(u8)param_2]->animationState; +} + +void sub_0802E7E4(Gleerok_HeapStruct* this) { + u32 i; + u32 bVar6; + + if ((this->ent2->frame & 0x40) != 0) { + bVar6 = 0; + for (i = 0; i < 6; i++) { + this->entities[i]->spritePriority.b0 = bVar6++; + if (this->unk_30[i] == 0) { + this->entities[i]->spriteSettings.draw &= ~1; + } else { + this->entities[i]->spriteSettings.draw = 1; + } + } + for (i = 0; i < 5; i++) { + if ((u8)(this->filler[i].unk0.HALF.HI - 8) < 0x11) { + bVar6 = this->entities[i]->spritePriority.b0; + this->entities[i]->spritePriority.b0 = this->entities[i + 1]->spritePriority.b0; + this->entities[i + 1]->spritePriority.b0 = bVar6; + } + } + this->ent->spritePriority.b0 = 0; + } else { + bVar6 = 5; + + for (i = 0; i < 6; i++) { + this->entities[i]->spritePriority.b0 = bVar6--; + if (this->unk_30[i] == 0) { + this->entities[i]->spriteSettings.draw &= ~1; + } else { + this->entities[i]->spriteSettings.draw = 1; + } + } + + for (i = 0; i < 5; i++) { + if (0x10 < (u8)(this->filler[i].unk0.HALF.HI - 8)) { + bVar6 = this->entities[i]->spritePriority.b0; + this->entities[i]->spritePriority.b0 = this->entities[i + 1]->spritePriority.b0; + this->entities[i + 1]->spritePriority.b0 = bVar6; + } + } + this->ent->spritePriority.b0 = 6; + } +} + +void sub_0802E9B0(GleerokEntity* this) { + u32 uVar1; + s32 iVar2; + s32 uVar4; + Gleerok_HeapStruct* heap; + + iVar2 = sub_080041DC(super, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI) >> 4; + if (iVar2 < 0x60) { + iVar2 = 10; + } else { + uVar4 = iVar2 - 0x60; + if (uVar4 < 0) { + uVar4 = iVar2 - 0x5d; + } + iVar2 = 10 - (uVar4 >> 2); + if (iVar2 < 4) { + iVar2 = 4; + } + } + heap = this->unk_84; + if (iVar2 != heap->unk_2c.HALF.HI) { + if (iVar2 > heap->unk_2c.HALF.HI) { + heap->unk_2c.HWORD = (heap->unk_2c.HWORD + 0x20) & 0x1fff; + } else { + heap->unk_2c.HWORD = (heap->unk_2c.HWORD - 0x20) & 0x1fff; + } + } +} + +bool32 sub_0802EA18(u32 arg0, u32 arg1, u32 arg2) { + u32 r1; + + r1 = arg1 + 0x1000; + r1 -= arg0; + r1 &= 0x1FFF; + arg2 <<= 8; + + if (r1 >= 0x1000 - arg2) { + if (r1 <= 0x1000 + arg2) { + return FALSE; + } + } + return TRUE; +} + +void sub_0802EA48(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4) { + if (param_4 == 1) { + param_3 = -param_3; + } + param_1->filler[param_2].unk0.HWORD = (param_1->filler[param_2].unk0.HWORD + param_3) & 0x1fff; +} + +void sub_0802EA68(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4) { + if (param_4 == 2) { + param_3 = -param_3; + } + param_1->filler2[param_2].unk0.HWORD = (param_1->filler2[param_2].unk0.HWORD + param_3) & 0x1fff; +} + +NONMATCH("asm/non_matching/gleerok/sub_0802EA88.inc", bool32 sub_0802EA88(Gleerok_HeapStruct* this)) { + s32 bVar2; + u32 uVar3; + u32 bVar4; + u32 uVar5; + u32 uVar6; + + uVar6 = FALSE; + + for (uVar5 = 0; uVar5 < 5; uVar5++) { + if (this->filler[uVar5].unk0.HALF.HI != this->filler[uVar5 + 1].unk0.HALF.HI) { + uVar6 = TRUE; + if ((s32)((this->filler[uVar5 + 1].unk0.HALF.HI - this->filler[uVar5].unk0.HALF.HI) & 0x1fU) > 0x10) { + uVar3 = 0; + } else { + uVar3 = 1; + } + sub_0802EA48(this, uVar5 + 1, 0x20, uVar3); + break; + } + } + + for (uVar5 = 0; uVar5 <= 4; uVar5++) { + bVar4 = this->filler[uVar5 + 1].unk0.HALF.HI; + bVar2 = (bVar4 - this->filler[uVar5].unk0.HALF.HI) & 0x1f; + if (bVar2 >= 0x11) { + if (bVar2 < 0x1f) { + bVar4 = (bVar4 + 1) & 0x1f; + } + } else { + if (1 < bVar2) { + bVar4 = (bVar4 - 1) & 0x1f; + } + } + this->filler[uVar5 + 1].unk0.HALF.HI = bVar4; + } + return uVar6; +} +END_NONMATCH + +NONMATCH("asm/non_matching/gleerok/sub_0802EB08.inc", + bool32 sub_0802EB08(Gleerok_HeapStruct* param_1, u32 param_2, s32 param_3)) { + s32 uVar2; + u32 bVar4; + u32 uVar5; + u32 uVar6; + u32 uVar7; + + uVar7 = FALSE; + + for (uVar6 = 0; uVar6 < 5; uVar6++) { + if (param_1->filler2[uVar6].unk0.HALF.HI != param_1->filler2[uVar6 + 1].unk0.HALF.HI) { + uVar7 = TRUE; + if (0x10 < + (s32)((param_1->filler2[uVar6 + 1].unk0.HALF.HI - param_1->filler2[uVar6].unk0.HALF.HI) & 0x1fU)) { + uVar5 = 3; + } else { + uVar5 = 2; + } + sub_0802EA68(param_1, uVar6 + 1, param_2, uVar5); + break; + } + } + + for (uVar6 = 0; uVar6 <= 4; uVar6++) { + bVar4 = param_1->filler2[uVar6 + 1].unk0.HALF.HI; + uVar2 = (bVar4 - param_1->filler2[uVar6].unk0.HALF.HI) & 0x1f; + if (uVar2 >= 0x11) { + if ((-param_3 & 0x1f) > uVar2) { + bVar4 = (bVar4 + 1) & 0x1f; + } + } else { + if (param_3 < (int)uVar2) { + bVar4 = (bVar4 - 1) & 0x1f; + } + } + param_1->filler2[uVar6 + 1].unk0.HALF.HI = bVar4; + } + return uVar7; +} +END_NONMATCH + +void sub_0802EB9C(GleerokEntity* this) { + this->unk_74 = gUnk_080CD854[GetRandomByWeight(gUnk_080CD850)]; + this->unk_75++; +} + +void sub_0802EBC4(GleerokEntity* this) { + u32 bVar3; + s32 iVar4; + + if (this->unk_74 == 0) { + iVar4 = GetRandomByWeight(gUnk_080CD86C[this->unk_79]); + if (gUnk_080CD878[this->unk_79][iVar4] < this->unk_75) { + this->unk_75 = 0; + if (this->unk_79 == 0) { + this->unk_76 = 0; + this->unk_77 = 3; + } else { + bVar3 = Random() & 1; + if (bVar3 != this->unk_76) { + this->unk_76 = bVar3; + this->unk_77 = 1; + } else { + if (++this->unk_77 > 2) { + bVar3 ^= 1; + this->unk_77 = 1; + } + this->unk_76 = bVar3; + } + } + this->base.subAction = 3; + this->base.type2 = 0; + } else { + this->base.subAction = 2; + } + } else { + this->unk_74--; + } +}