;;; $897B: Move enemy projectile vertically ;;;
{
;; Parameters:
;;     X: Enemy projectile index
;; Returns:
;;     Carry: Set if collided with block

; This routine expects:
;     Enemy projectile $1A6F: Y subposition
;     Enemy projectile $1ADB: Y velocity (unit 1/100h px/frame)
$86:897B DA PHX
$86:897C 64 12 STZ $12 [$7E:0012] ;\
$86:897E 64 14 STZ $14 [$7E:0014] ;|
$86:8980 BD DB 1A LDA $1ADB,x[$7E:1AFD] ;|
$86:8983 10 02 BPL $02 [$8987] ;} $14.$12 = [enemy projectile Y velocity] / 100h
$86:8985 C6 14 DEC $14 [$7E:0014] ;|
;|
$86:8987 85 13 STA $13 [$7E:0013] ;/
$86:8989 BD B4 1B LDA $1BB4,x[$7E:1BD6] ;\
$86:898C 29 FF 00 AND #$00FF ;} $1E = [enemy projectile Y radius]
$86:898F 85 1E STA $1E [$7E:001E] ;/
$86:8991 BD B3 1B LDA $1BB3,x[$7E:1BD5] ;\
$86:8994 29 FF 00 AND #$00FF ;} $1C = [enemy projectile X radius]
$86:8997 85 1C STA $1C [$7E:001C] ;/
$86:8999 BD 4B 1A LDA $1A4B,x[$7E:1A6D] ;\
$86:899C 38 SEC ;|
$86:899D E5 1C SBC $1C [$7E:001C] ;|
$86:899F 29 F0 FF AND #$FFF0 ;|
$86:89A2 85 1A STA $1A [$7E:001A] ;|
$86:89A4 BD 4B 1A LDA $1A4B,x[$7E:1A6D] ;|
$86:89A7 18 CLC ;|
$86:89A8 65 1C ADC $1C [$7E:001C] ;|
$86:89AA 3A DEC A ;} $1A = (enemy projectile right boundary) / 10h - (enemy projectile left boundary) / 10h (number of blocks left to check)
$86:89AB 38 SEC ;|
$86:89AC E5 1A SBC $1A [$7E:001A] ;|
$86:89AE 4A LSR A ;|
$86:89AF 4A LSR A ;|
$86:89B0 4A LSR A ;|
$86:89B1 4A LSR A ;|
$86:89B2 85 1A STA $1A [$7E:001A] ;/
$86:89B4 85 20 STA $20 [$7E:0020] ; $20 = [$1A] (enemy projectile X block span)
$86:89B6 BD 6F 1A LDA $1A6F,x[$7E:1A91] ;\
$86:89B9 18 CLC ;|
$86:89BA 65 12 ADC $12 [$7E:0012] ;|
$86:89BC 85 16 STA $16 [$7E:0016] ;} $18.$16 = [enemy projectile Y position] + [$14].[$12] (target position)
$86:89BE BD 93 1A LDA $1A93,x[$7E:1AB5] ;|
$86:89C1 65 14 ADC $14 [$7E:0014] ;|
$86:89C3 85 18 STA $18 [$7E:0018] ;/
$86:89C5 24 14 BIT $14 [$7E:0014] ;\
$86:89C7 30 06 BMI $06 [$89CF] ;} If [$14] >= 0: (moving down)
$86:89C9 18 CLC ;\
$86:89CA 65 1E ADC $1E [$7E:001E] ;} $22 = [$18] + [enemy projectile Y radius] - 1 (target front boundary)
$86:89CC 3A DEC A ;/
$86:89CD 80 03 BRA $03 [$89D2]
$86:89CF 38 SEC ;\ Else ([$14] < 0): (moving up)
$86:89D0 E5 1E SBC $1E [$7E:001E] ;} $22 = [$18] - [enemy projectile Y radius] (target front boundary)
$86:89D2 85 22 STA $22 [$7E:0022]
$86:89D4 4A LSR A ;\
$86:89D5 4A LSR A ;|
$86:89D6 4A LSR A ;|
$86:89D7 4A LSR A ;|
$86:89D8 E2 20 SEP #$20 ;|
$86:89DA 8D 02 42 STA $4202 ;|
$86:89DD AD A5 07 LDA $07A5 [$7E:07A5] ;|
$86:89E0 8D 03 42 STA $4203 ;|
$86:89E3 C2 20 REP #$20 ;|
$86:89E5 BD 4B 1A LDA $1A4B,x[$7E:1A6D] ;|
$86:89E8 38 SEC ;} X = ((enemy projectile front boundary) / 10h * [room width] + (enemy projectile left boundary) / 10h) * 2 (index of leftmost block to check)
$86:89E9 E5 1C SBC $1C [$7E:001C] ;|
$86:89EB 4A LSR A ;|
$86:89EC 4A LSR A ;|
$86:89ED 4A LSR A ;|
$86:89EE 4A LSR A ;|
$86:89EF 18 CLC ;|
$86:89F0 6D 16 42 ADC $4216 ;|
$86:89F3 0A ASL A ;|
$86:89F4 AA TAX ;/
; LOOP
$86:89F5 20 9E 88 JSR $889E [$86:889E] ; Enemy projectile vertical block reaction
$86:89F8 B0 13 BCS $13 [$8A0D] ; If solid: go to BRANCH_SOLID
$86:89FA E8 INX ;\
$86:89FB E8 INX ;} X += 2
$86:89FC C6 1A DEC $1A [$7E:001A] ; Decrement $1A
$86:89FE 10 F5 BPL $F5 [$89F5] ; If [$1A] >= 0: go to LOOP
$86:8A00 FA PLX
$86:8A01 A5 16 LDA $16 [$7E:0016] ;\
$86:8A03 9D 6F 1A STA $1A6F,x[$7E:1A91] ;|
$86:8A06 A5 18 LDA $18 [$7E:0018] ;} Enemy projectile Y position = [$18].[$16]
$86:8A08 9D 93 1A STA $1A93,x[$7E:1AB5] ;/
$86:8A0B 18 CLC ;\
$86:8A0C 60 RTS ;} Return carry clear
; BRANCH_SOLID
$86:8A0D FA PLX
$86:8A0E 9E 6F 1A STZ $1A6F,x[$7E:1A91] ; Enemy projectile Y subposition = 0
$86:8A11 A5 22 LDA $22 [$7E:0022]
$86:8A13 24 14 BIT $14 [$7E:0014] ;\
$86:8A15 30 10 BMI $10 [$8A27] ;} If [$14] < 0: go to BRANCH_MOVING_UP
$86:8A17 29 F0 FF AND #$FFF0 ; A = [$22] - [$22] % 10h (target bottom boundary rounded down to top of 16x16 tile)
$86:8A1A 38 SEC ;\
$86:8A1B E5 1E SBC $1E [$7E:001E] ;|
$86:8A1D DD 93 1A CMP $1A93,x[$7E:1AB5] ;} Enemy projectile Y position = max([enemy projectile Y position], [A] - [enemy projectile Y radius])
$86:8A20 90 03 BCC $03 [$8A25] ;|
$86:8A22 9D 93 1A STA $1A93,x[$7E:1AB5] ;/
$86:8A25 38 SEC ;\
$86:8A26 60 RTS ;} Return carry set
; BRANCH_MOVING_UP
$86:8A27 09 0F 00 ORA #$000F ;\
$86:8A2A 38 SEC ;} A = [$22] - [$22] % 10h + 10h (target right boundary rounded up to bottom of 16x16 tile)
$86:8A2B 65 1E ADC $1E [$7E:001E] ;\
$86:8A2D DD 93 1A CMP $1A93,x[$7E:1AB3] ;|
$86:8A30 F0 02 BEQ $02 [$8A34] ;} Enemy projectile Y position = min([enemy projectile Y position], [A] + [enemy projectile Y radius])
$86:8A32 B0 03 BCS $03 [$8A37] ;|
;|
$86:8A34 9D 93 1A STA $1A93,x[$7E:1AB3] ;/
$86:8A37 38 SEC ;\
$86:8A38 60 RTS ;} Return carry set
} }