;;; Enemy_WithinRange ;;;
;; Parameters:
;; r0: Vertical range
;; r1: Horizontal range in front
;; r2: Horizontal range behind
;; Returns r0: 0 if out of range, 3 if in front range, Ch if in behind range
08011BE4 (T) push r4-r7,r14
08011BE6 (T) mov r7,r9
08011BE8 (T) mov r6,r8
08011BEA (T) push r6,r7
08011BEC (T) lsl r0,r0,10h ;\
08011BEE (T) lsr r7,r0,10h ;} r7 = r0 parameter
08011BF0 (T) lsl r1,r1,10h ;\
08011BF2 (T) lsr r1,r1,10h ;} r9 = r1 parameter
08011BF4 (T) mov r9,r1 ;/
08011BF6 (T) lsl r2,r2,10h ;\
08011BF8 (T) lsr r2,r2,10h ;} r8 = r2 parameter
08011BFA (T) mov r8,r2 ;/
08011BFC (T) mov r0,0h ;\
08011BFE (T) mov r12,r0 ;} r12 = return value (default 0)
08011C00 (T) mov r6,0h ; Which direction enemy is facing (default left)
08011C02 (T) ldr r2,=SamusData ;\
08011C04 (T) mov r1,26h ;|
08011C06 (T) ldsh r0,[r2,r1] ;|
08011C08 (T) lsr r1,r0,1Fh ;|
08011C0A (T) add r0,r0,r1 ;|
08011C0C (T) asr r0,r0,1h ;|
08011C0E (T) ldrh r1,[r2,18h] ;|
08011C10 (T) add r0,r0,r1 ;|
08011C12 (T) lsl r0,r0,10h ;|
08011C14 (T) lsr r3,r0,10h ;|
08011C16 (T) ldrh r5,[r2,16h] ; r5 = XPosition
08011C18 (T) ldr r0,=EnemyOrientation ;|
08011C1A (T) ldrh r2,[r0,2h] ;} If |EnemyYPosition - YPosition + TopBoundryOffset(1+sgn)/2| >= r0 parameter
08011C1C (T) ldrh r4,[r0,4h] ; r4 = EnemyXPosition
08011C1E (T) mov r1,r0 ;|
08011C20 (T) cmp r2,r3 ;|
08011C22 (T) bls 8011C30h ;|
08011C24 (T) sub r0,r2,r3 ;|
08011C26 (T) b 8011C32h ;|
08011C28 dd 003001244h,0030006BCh ;|
;|
08011C30 (T) sub r0,r3,r2 ;|
;|
08011C32 (T) cmp r0,r7 ;|
08011C34 (T) blt 8011C3Ah ;/
08011C36 (T) mov r0,0h ;\
08011C38 (T) b 8011C80h ;} Return 0
08011C3A (T) ldrh r1,[r1] ;\
08011C3C (T) mov r0,40h ;|
08011C3E (T) and r0,r1 ;} If EnemyOrientation has 40h (facing right)
08011C40 (T) cmp r0,0h ;|
08011C42 (T) beq 8011C46h ;/
08011C44 (T) mov r6,1h ; r6 = 1 (facing right)
08011C46 (T) cmp r4,r5 ;\
08011C48 (T) bls 8011C64h ;} If EnemyXPosition > XPosition:
08011C4A (T) cmp r6,0h ;\
08011C4C (T) beq 8011C5Ah ;} If r6 != 0 (facing right):
08011C4E (T) sub r0,r4,r5 ;\
08011C50 (T) cmp r0,r8 ;} If EnemyXPosition-XPosition >= r2 parameter: return
08011C52 (T) bge 8011C7Eh ;/
08011C54 (T) mov r0,0Ch ;\
08011C56 (T) mov r12,r0 ;} Return Ch
08011C58 (T) b 8011C7Eh ;/
08011C5A (T) sub r0,r4,r5 ;\ r6 == 0 (facing left):
08011C5C (T) cmp r0,r9 ;} If EnemyXPosition-XPosition >= r1 parameter: return
08011C5E (T) bge 8011C7Eh ;/
08011C60 (T) mov r1,3h ;\
08011C62 (T) b 8011C7Ch ;} Return 3
08011C64 (T) cmp r6,0h ;\ EnemyXPosition <= XPosition:
08011C66 (T) beq 8011C74h ;} If r6 != 0 (facing right):
08011C68 (T) sub r0,r5,r4 ;\
08011C6A (T) cmp r0,r9 ;} If XPosition-EnemyXPosition >= r1 parameter: return
08011C6C (T) bge 8011C7Eh ;/
08011C6E (T) mov r0,3h ;\
08011C70 (T) mov r12,r0 ;} Return 3
08011C72 (T) b 8011C7Eh ;/
08011C74 (T) sub r0,r5,r4 ;\ r6 == 0 (facing left):
08011C76 (T) cmp r0,r8 ;} If XPosition-EnemyXPosition >= r2 parameter: return
08011C78 (T) bge 8011C7Eh ;/
08011C7A (T) mov r1,0Ch ; Return Ch
08011C7C (T) mov r12,r1
08011C7E (T) mov r0,r12
08011C80 (T) pop r3,r4
08011C82 (T) mov r8,r3
08011C84 (T) mov r9,r4
08011C86 (T) pop r4-r7
08011C88 (T) pop r1
08011C8A (T) bx r1