mirror of
https://github.com/zeldaret/tmc
synced 2026-07-03 13:00:36 -04:00
define collisions
This commit is contained in:
+134
-114
@@ -286,77 +286,80 @@ UpdateCollision: @ 0x080B1C54
|
||||
|
||||
arm_func_start arm_CollideAll
|
||||
arm_CollideAll: @ 0x080B1C7C
|
||||
THIS .req r4
|
||||
OTHER .req r5
|
||||
|
||||
push {r4, r5, r6, r7, r8, sb, sl, lr}
|
||||
add r0, pc, #0x104 @ =_080B1D8C
|
||||
ldm r0, {r8, sb, sl}
|
||||
ldrb sl, [sl]
|
||||
cmp sl, #0
|
||||
beq _080B1D84
|
||||
ldr r8, [r8]
|
||||
ldr r8, [r8] // load entity
|
||||
mov r7, r8
|
||||
_080B1C9C:
|
||||
ldr r4, [r8, #8]
|
||||
ldrb r0, [r4, #0x10]
|
||||
ands r0, r0, #0x80
|
||||
beq _080B1D78
|
||||
ldrb r0, [r4, #0x3c]
|
||||
and r0, r0, #7
|
||||
next_this:
|
||||
ldr THIS, [r8, #8]
|
||||
ldrb r0, [THIS, #0x10]
|
||||
ands r0, r0, #0x80 // disable collision flag
|
||||
beq end_check_this
|
||||
ldrb r0, [THIS, #0x3c] // collisionFlags
|
||||
and r0, r0, #7 // first 3 bits
|
||||
mov r1, #1
|
||||
lsl r6, r1, r0
|
||||
ldrb r3, [r4, #0x3c]
|
||||
ldrb r2, [r4, #0x3d]
|
||||
lsl r6, r1, r0 // 1 << (collisionFlags & 7)
|
||||
ldrb r3, [THIS, #0x3c]
|
||||
ldrb r2, [THIS, #0x3d] // iframes
|
||||
mov ip, sl
|
||||
_080B1CC8:
|
||||
next_other: // r4 = this, r5 = other
|
||||
subs ip, ip, #1
|
||||
bmi _080B1D78
|
||||
ldr r5, [sb, ip, lsl #2]
|
||||
cmp r4, r5
|
||||
beq _080B1CC8
|
||||
ldr r0, [r5, #0x3b]
|
||||
ands r0, r0, r6
|
||||
beq _080B1CC8
|
||||
ldrb r0, [r5, #0x10]
|
||||
bmi end_check_this
|
||||
ldr OTHER, [sb, ip, lsl #2]
|
||||
cmp THIS, OTHER
|
||||
beq next_other
|
||||
ldr r0, [OTHER, #0x3b] // collisionMask
|
||||
ands r0, r0, r6 // other.collisionMask & (1 << m)
|
||||
beq next_other
|
||||
ldrb r0, [OTHER, #0x10] // disable collision flag
|
||||
ands r0, r0, #0x80
|
||||
beq _080B1CC8
|
||||
ldrb r0, [r4, #0x38]
|
||||
ldrb r1, [r5, #0x38]
|
||||
beq next_other
|
||||
ldrb r0, [THIS, #0x38] // collisionLayer
|
||||
ldrb r1, [OTHER, #0x38]
|
||||
ands r0, r0, r1
|
||||
beq _080B1CC8
|
||||
ldrb r0, [r5, #0x3c]
|
||||
beq next_other
|
||||
ldrb r0, [OTHER, #0x3c] // collisionFlags
|
||||
orr r0, r0, r3
|
||||
lsrs r0, r0, #7
|
||||
lsrs r0, r0, #7 // top
|
||||
bhs _080B1D20
|
||||
ldrb r0, [r5, #0x3d]
|
||||
ldrb r0, [OTHER, #0x3d] // iframes
|
||||
orrs r0, r0, r2
|
||||
bne _080B1CC8
|
||||
bne next_other
|
||||
_080B1D20:
|
||||
bl arm_CalcCollision
|
||||
cmp r0, #0
|
||||
beq _080B1CC8
|
||||
ldrb r3, [r4, #0x3c]
|
||||
ldrb r0, [r4, #0x3d]
|
||||
ldrb r1, [r4, #0x43]
|
||||
beq next_other
|
||||
ldrb r3, [THIS, #0x3c]
|
||||
ldrb r0, [THIS, #0x3d] // iframes
|
||||
ldrb r1, [THIS, #0x43] // hitType
|
||||
orr r2, r0, r1
|
||||
ldrb r0, [r5, #0x41]
|
||||
ldrb r0, [OTHER, #0x41] // OTHER processing a collision already?
|
||||
ands r0, r0, #0x80
|
||||
bne _080B1D58
|
||||
str r4, [r5, #0x4c]
|
||||
ldrb r0, [r4, #0x40]
|
||||
bne _080B1D58 // branch if set
|
||||
str THIS, [OTHER, #0x4c] // contactedEntity
|
||||
ldrb r0, [THIS, #0x40]
|
||||
orr r0, r0, #0x80
|
||||
strb r0, [r5, #0x41]
|
||||
strb r0, [OTHER, #0x41] // contactFlags |= 0x80
|
||||
_080B1D58:
|
||||
ldrb r0, [r4, #0x41]
|
||||
ldrb r0, [THIS, #0x41] // THIS processing a collision already?
|
||||
ands r0, r0, #0x80
|
||||
bne _080B1CC8
|
||||
str r5, [r4, #0x4c]
|
||||
ldrb r0, [r5, #0x40]
|
||||
bne next_other
|
||||
str OTHER, [THIS, #0x4c]
|
||||
ldrb r0, [OTHER, #0x40]
|
||||
orr r0, r0, #0x80
|
||||
strb r0, [r4, #0x41]
|
||||
b _080B1CC8
|
||||
_080B1D78:
|
||||
strb r0, [THIS, #0x41]
|
||||
b next_other
|
||||
end_check_this:
|
||||
ldr r8, [r8, #4]
|
||||
cmp r8, r7
|
||||
bne _080B1C9C
|
||||
bne next_this
|
||||
_080B1D84:
|
||||
pop {r4, r5, r6, r7, r8, sb, sl, lr}
|
||||
bx lr
|
||||
@@ -366,56 +369,59 @@ _080B1D94: .4byte gCollidableCount
|
||||
|
||||
arm_func_start arm_CalcCollision
|
||||
arm_CalcCollision: @ 0x080B1D98
|
||||
@ r6 = this, r7 = other
|
||||
THIS .req r4
|
||||
OTHER .req r5
|
||||
BB_THIS .req r6
|
||||
BB_OTHER .req r7
|
||||
|
||||
push {r2, r3, r6, r7, r8, sb, ip, lr}
|
||||
ldr r6, [r4, #0x48]
|
||||
ldr r7, [r5, #0x48]
|
||||
ldrh r0, [r4, #0x2e]
|
||||
ldrh r1, [r5, #0x2e]
|
||||
ldr BB_THIS, [THIS, #0x48]
|
||||
ldr BB_OTHER, [OTHER, #0x48]
|
||||
ldrh r0, [THIS, #0x2e]
|
||||
ldrh r1, [OTHER, #0x2e]
|
||||
sub r0, r0, r1
|
||||
ldrsb r1, [r6]
|
||||
ldrsb r1, [BB_THIS]
|
||||
add r0, r0, r1
|
||||
ldrsb r1, [r7]
|
||||
ldrsb r1, [BB_OTHER]
|
||||
sub r0, r0, r1
|
||||
ldrb r1, [r6, #6]
|
||||
ldrb r2, [r7, #6]
|
||||
ldrb r1, [BB_THIS, #6]
|
||||
ldrb r2, [BB_OTHER, #6]
|
||||
add r1, r1, r2
|
||||
add r2, r0, r1
|
||||
cmp r2, r1, lsl #1
|
||||
bhi _080B1F28
|
||||
ldrh r1, [r4, #0x32]
|
||||
ldrh r2, [r5, #0x32]
|
||||
bhi not_overlapping
|
||||
ldrh r1, [THIS, #0x32]
|
||||
ldrh r2, [OTHER, #0x32]
|
||||
sub r1, r1, r2
|
||||
ldrsb r2, [r6, #1]
|
||||
ldrsb r2, [BB_THIS, #1]
|
||||
add r1, r1, r2
|
||||
ldrsb r2, [r7, #1]
|
||||
ldrsb r2, [BB_OTHER, #1]
|
||||
sub r1, r1, r2
|
||||
ldrb r2, [r6, #7]
|
||||
ldrb r3, [r7, #7]
|
||||
ldrb r2, [BB_THIS, #7]
|
||||
ldrb r3, [BB_OTHER, #7]
|
||||
add r2, r2, r3
|
||||
add r3, r1, r2
|
||||
cmp r3, r2, lsl #1
|
||||
bhi _080B1F28
|
||||
bhi not_overlapping
|
||||
mov r2, #5
|
||||
mov r3, #5
|
||||
ldr r8, [r4, #0x3c]
|
||||
ldr r8, [THIS, #0x3c] // collisionFlags & 0x10
|
||||
ands r8, r8, #0x10
|
||||
ldrbne r2, [r6, #8]
|
||||
ldr r8, [r5, #0x3c]
|
||||
ldrbne r2, [BB_THIS, #8] // 3d hitbox
|
||||
ldr r8, [OTHER, #0x3c]
|
||||
ands r8, r8, #0x10
|
||||
ldrbne r3, [r7, #8]
|
||||
ldrbne r3, [BB_OTHER, #8]
|
||||
add r2, r2, r3
|
||||
ldrsh r8, [r4, #0x36]
|
||||
ldrsh sb, [r5, #0x36]
|
||||
ldrsh r8, [THIS, #0x36] // Z
|
||||
ldrsh sb, [OTHER, #0x36]
|
||||
sub r8, r8, sb
|
||||
add r8, r2, r8
|
||||
cmp r8, r2, lsl #1
|
||||
bhi _080B1F28
|
||||
ldrb r2, [r4, #0x3c]
|
||||
bhi not_overlapping
|
||||
ldrb r2, [THIS, #0x3c] // collisionFlags & BBOX_SOLID
|
||||
and r2, r2, #0x20
|
||||
lsr r2, r2, #3
|
||||
ldrb r3, [r5, #0x3c]
|
||||
ldrb r3, [OTHER, #0x3c]
|
||||
and r3, r3, #0x20
|
||||
adds r2, r2, r3, lsr #2
|
||||
beq _080B1E74
|
||||
@@ -428,10 +434,10 @@ _080B1E74:
|
||||
mov ip, #0
|
||||
bl arm_CalcCollisionDirection
|
||||
mov r6, r0
|
||||
ldrb r1, [r5, #0x3f] // hitType
|
||||
ldrb r1, [OTHER, #0x3f] // hitType
|
||||
mov r0, #0x22
|
||||
mul r1, r0, r1
|
||||
ldrb r0, [r4, #0x40] // hurtType
|
||||
ldrb r0, [THIS, #0x40] // hurtType
|
||||
add r0, r0, r1
|
||||
mov r1, #0xc
|
||||
mul r2, r0, r1
|
||||
@@ -449,106 +455,120 @@ _080B1E74:
|
||||
mov lr, pc
|
||||
bx r7
|
||||
_080B1ED4:
|
||||
cmp r0, #0
|
||||
beq _080B1F20
|
||||
cmp r0, #2
|
||||
beq _080B1F1C
|
||||
ldrb r0, [r4, #0x3c]
|
||||
cmp r0, #0 // RESULT_NO_COLLISION
|
||||
beq no_col
|
||||
cmp r0, #2 // RESULT_COLLISION_WITHOUT_SET
|
||||
beq col_no_set
|
||||
// RESULT_COLLISION
|
||||
ldrb r0, [THIS, #0x3c] // collisionFlags
|
||||
and r0, r0, #0x80
|
||||
lsr r0, r0, #5
|
||||
ldrb r1, [r5, #0x3c]
|
||||
ldrb r1, [OTHER, #0x3c] // collisionFlags
|
||||
and r1, r1, #0x80
|
||||
lsr r1, r1, #4
|
||||
add r0, r0, r1
|
||||
add r1, pc, #0xF4 @ =_080B1FFC
|
||||
ldr r0, [r1, r0]
|
||||
mov lr, pc
|
||||
bx r0
|
||||
bx r0 // jumptable 0 1 2
|
||||
_080B1F10:
|
||||
strb r6, [r5, #0x3e]
|
||||
strb r6, [OTHER, #0x3e]
|
||||
eor r6, r6, #0x10
|
||||
strb r6, [r4, #0x3e]
|
||||
_080B1F1C:
|
||||
strb r6, [THIS, #0x3e]
|
||||
col_no_set:
|
||||
mov r0, #1
|
||||
_080B1F20:
|
||||
no_col:
|
||||
pop {r2, r3, r6, r7, r8, sb, ip, lr}
|
||||
bx lr
|
||||
_080B1F28:
|
||||
not_overlapping:
|
||||
mov r0, #0
|
||||
b _080B1F20
|
||||
b no_col
|
||||
|
||||
// BBOX_SOLID THIS
|
||||
arm_func_start arm_sub_080B1F30
|
||||
arm_sub_080B1F30: @ 0x080B1F30
|
||||
ldrh r0, [r4, #0x2e]
|
||||
ldrh r1, [r5, #0x2e]
|
||||
ldrh r0, [THIS, #0x2e]
|
||||
ldrh r1, [OTHER, #0x2e]
|
||||
sub r0, r0, r1
|
||||
ldrsb r1, [r7]
|
||||
ldrsb r1, [BB_OTHER]
|
||||
sub r0, r0, r1
|
||||
ldrh r1, [r4, #0x32]
|
||||
ldrh r2, [r5, #0x32]
|
||||
ldrh r1, [THIS, #0x32]
|
||||
ldrh r2, [OTHER, #0x32]
|
||||
sub r1, r1, r2
|
||||
ldrsb r2, [r7, #1]
|
||||
ldrsb r2, [BB_OTHER, #1]
|
||||
sub r1, r1, r2
|
||||
bx lr
|
||||
|
||||
// BBOX_SOLID OTHER
|
||||
arm_func_start arm_sub_080B1F5C
|
||||
arm_sub_080B1F5C: @ 0x080B1F5C
|
||||
ldrh r0, [r4, #0x2e]
|
||||
ldrh r1, [r5, #0x2e]
|
||||
ldrh r0, [THIS, #0x2e]
|
||||
ldrh r1, [OTHER, #0x2e]
|
||||
sub r0, r0, r1
|
||||
ldrsb r1, [r6]
|
||||
ldrsb r1, [BB_THIS]
|
||||
add r0, r0, r1
|
||||
ldrh r1, [r4, #0x32]
|
||||
ldrh r2, [r5, #0x32]
|
||||
ldrh r1, [THIS, #0x32]
|
||||
ldrh r2, [OTHER, #0x32]
|
||||
sub r1, r1, r2
|
||||
ldrsb r2, [r6, #1]
|
||||
ldrsb r2, [BB_THIS, #1]
|
||||
add r1, r1, r2
|
||||
bx lr
|
||||
|
||||
// BBOX_SOLID BOTH
|
||||
arm_func_start arm_sub_080B1F88
|
||||
arm_sub_080B1F88: @ 0x080B1F88
|
||||
ldrh r0, [r4, #0x2e]
|
||||
ldrh r1, [r5, #0x2e]
|
||||
ldrh r0, [THIS, #0x2e]
|
||||
ldrh r1, [OTHER, #0x2e]
|
||||
sub r0, r0, r1
|
||||
ldrh r1, [r4, #0x32]
|
||||
ldrh r2, [r5, #0x32]
|
||||
ldrh r1, [THIS, #0x32]
|
||||
ldrh r2, [OTHER, #0x32]
|
||||
sub r1, r1, r2
|
||||
bx lr
|
||||
|
||||
// BBOX_REFLECT OTHER
|
||||
arm_func_start arm_sub_080B1FA4
|
||||
arm_sub_080B1FA4: @ 0x080B1FA4
|
||||
ldrb r0, [r5, #0x15]
|
||||
ldrb r0, [r5, #0x15] // invert direction
|
||||
eor r0, r0, #0x10
|
||||
b _080B1FB4
|
||||
|
||||
// BBOX_REFLECT THIS
|
||||
_080B1FB0:
|
||||
ldrb r0, [r4, #0x15]
|
||||
ldrb r0, [THIS, #0x15] // direction
|
||||
_080B1FB4:
|
||||
sub r1, r0, #8
|
||||
and r1, r1, #0x1f
|
||||
sub r1, r6, r1
|
||||
and r1, r1, #0x1f
|
||||
sub r1, r0, #8 // turn counterclockwise
|
||||
and r1, r1, #0x1f // normalize
|
||||
sub r1, r6, r1 // sub calcDir
|
||||
and r1, r1, #0x1f // normalize
|
||||
cmp r1, #0x11
|
||||
bxlo lr
|
||||
sub r0, r6, r0
|
||||
sub r0, r0, #8
|
||||
and r0, r0, #0x1f
|
||||
sub r6, r6, r0, lsl #1
|
||||
bxlo lr // branch if facing to the right
|
||||
sub r0, r6, r0 // sub calcDir
|
||||
sub r0, r0, #8 // turn counterclockwise
|
||||
and r0, r0, #0x1f // normalize
|
||||
sub r6, r6, r0, lsl #1 // calcDir -= 2 * temp
|
||||
and r6, r6, #0x1f
|
||||
bx lr
|
||||
|
||||
// BBOX_REFLECT BOTH
|
||||
arm_func_start arm_sub_080B1FE4
|
||||
arm_sub_080B1FE4: @ 0x080B1FE4
|
||||
ldrb r6, [r4, #0x15]
|
||||
ldrb r6, [THIS, #0x15] // direction
|
||||
|
||||
// BBOX_REFLECT NONE, BBOX_SOLID NONE
|
||||
_080B1FE8:
|
||||
bx lr
|
||||
|
||||
|
||||
_080B1FEC: .4byte ram_sub_080B1FE8
|
||||
_080B1FF0: .4byte ram_sub_080B1F30
|
||||
_080B1FF4: .4byte ram_sub_080B1F5C
|
||||
_080B1FF8: .4byte ram_sub_080B1F88
|
||||
|
||||
_080B1FFC: .4byte ram_sub_080B1FE8
|
||||
_080B2000: .4byte ram_sub_080B1FB0
|
||||
_080B2004: .4byte ram_sub_080B1FA4
|
||||
_080B2008: .4byte ram_sub_080B1FE4
|
||||
|
||||
_080B200C: .4byte gCollidableList
|
||||
_080B2010: .4byte gCollidableCount
|
||||
_080B2014: .4byte gCollisionMtx
|
||||
|
||||
Reference in New Issue
Block a user