;;; $88B6: Move enemy projectile horizontally ;;;
{
;; Parameters:
;;     X: Enemy projectile index
;; Returns:
;;     Carry: Set if collided with block

; This routine expects:
;     Enemy projectile $1A27: X subposition
;     Enemy projectile $1AB7: X velocity (unit 1/100h px/frame)
$86:88B6 DA PHX
$86:88B7 64 12 STZ $12 [$7E:0012] ;\
$86:88B9 64 14 STZ $14 [$7E:0014] ;|
$86:88BB BD B7 1A LDA $1AB7,x[$7E:1AD9] ;|
$86:88BE 10 02 BPL $02 [$88C2] ;} $14.$12 = [enemy projectile X velocity] / 100h
$86:88C0 C6 14 DEC $14 [$7E:0014] ;|
;|
$86:88C2 85 13 STA $13 [$7E:0013] ;/
$86:88C4 BD B4 1B LDA $1BB4,x[$7E:1BD6] ;\
$86:88C7 29 FF 00 AND #$00FF ;} $1E = [enemy projectile Y radius]
$86:88CA 85 1E STA $1E [$7E:001E] ;/
$86:88CC BD B3 1B LDA $1BB3,x[$7E:1BD5] ;\
$86:88CF 29 FF 00 AND #$00FF ;} $1C = [enemy projectile X radius]
$86:88D2 85 1C STA $1C [$7E:001C] ;/
$86:88D4 BD 93 1A LDA $1A93,x[$7E:1AB5] ;\
$86:88D7 38 SEC ;|
$86:88D8 E5 1E SBC $1E [$7E:001E] ;|
$86:88DA 29 F0 FF AND #$FFF0 ;|
$86:88DD 85 1A STA $1A [$7E:001A] ;|
$86:88DF BD 93 1A LDA $1A93,x[$7E:1AB5] ;|
$86:88E2 18 CLC ;|
$86:88E3 65 1E ADC $1E [$7E:001E] ;|
$86:88E5 3A DEC A ;} $1A = (enemy projectile bottom boundary) / 10h - (enemy projectile top boundary) / 10h (number of blocks left to check)
$86:88E6 38 SEC ;|
$86:88E7 E5 1A SBC $1A [$7E:001A] ;|
$86:88E9 4A LSR A ;|
$86:88EA 4A LSR A ;|
$86:88EB 4A LSR A ;|
$86:88EC 4A LSR A ;|
$86:88ED 85 1A STA $1A [$7E:001A] ;/
$86:88EF 85 20 STA $20 [$7E:0020] ; $20 = [$1A] (enemy projectile Y block span)
$86:88F1 BD 93 1A LDA $1A93,x[$7E:1AB5] ;\
$86:88F4 38 SEC ;|
$86:88F5 E5 1E SBC $1E [$7E:001E] ;|
$86:88F7 4A LSR A ;|
$86:88F8 4A LSR A ;|
$86:88F9 4A LSR A ;|
$86:88FA 4A LSR A ;} Calculate (enemy projectile top boundary) / 10h * [room width in blocks] (target row block index)
$86:88FB E2 20 SEP #$20 ;|
$86:88FD 8D 02 42 STA $4202 ;|
$86:8900 AD A5 07 LDA $07A5 [$7E:07A5] ;|
$86:8903 8D 03 42 STA $4203 ;|
$86:8906 C2 20 REP #$20 ;/
$86:8908 BD 27 1A LDA $1A27,x[$7E:1A49] ;\
$86:890B 18 CLC ;|
$86:890C 65 12 ADC $12 [$7E:0012] ;|
$86:890E 85 16 STA $16 [$7E:0016] ;} $18.$16 = [enemy projectile X position] + [$14].[$12]
$86:8910 BD 4B 1A LDA $1A4B,x[$7E:1A6D] ;|
$86:8913 65 14 ADC $14 [$7E:0014] ;|
$86:8915 85 18 STA $18 [$7E:0018] ;/
$86:8917 24 14 BIT $14 [$7E:0014] ;\
$86:8919 30 06 BMI $06 [$8921] ;} If [$14] >= 0:
$86:891B 18 CLC ;\
$86:891C 65 1C ADC $1C [$7E:001C] ;} $22 = [$18] + [enemy projectile X radius] - 1 (target front boundary)
$86:891E 3A DEC A ;/
$86:891F 80 03 BRA $03 [$8924]
$86:8921 38 SEC ;\ Else ([$14] < 0):
$86:8922 E5 1C SBC $1C [$7E:001C] ;} $22 = [$18] - [enemy projectile X radius] (target front boundary)
$86:8924 85 22 STA $22 [$7E:0022]
$86:8926 4A LSR A ;\
$86:8927 4A LSR A ;|
$86:8928 4A LSR A ;|
$86:8929 4A LSR A ;|
$86:892A 18 CLC ;} X = ((target row block index) + (target front boundary) / 10h) * 2 (index of top block to check)
$86:892B 6D 16 42 ADC $4216 ;|
$86:892E 0A ASL A ;|
$86:892F AA TAX ;/
; LOOP
$86:8930 20 86 88 JSR $8886 [$86:8886] ; Enemy projectile horizontal block reaction
$86:8933 B0 1A BCS $1A [$894F] ; If solid: go to BRANCH_SOLID
$86:8935 8A TXA ;\
$86:8936 18 CLC ;|
$86:8937 6D A5 07 ADC $07A5 [$7E:07A5] ;} X += [room width in blocks] * 2 (next row)
$86:893A 6D A5 07 ADC $07A5 [$7E:07A5] ;|
$86:893D AA TAX ;/
$86:893E C6 1A DEC $1A [$7E:001A] ; Decrement $1A
$86:8940 10 EE BPL $EE [$8930] ; If [$1A] >= 0: go to LOOP
$86:8942 FA PLX
$86:8943 A5 16 LDA $16 [$7E:0016] ;\
$86:8945 9D 27 1A STA $1A27,x[$7E:1A49] ;|
$86:8948 A5 18 LDA $18 [$7E:0018] ;} Enemy projectile X position = [$18].[$16]
$86:894A 9D 4B 1A STA $1A4B,x[$7E:1A6D] ;/
$86:894D 18 CLC ;\
$86:894E 60 RTS ;} Return carry clear
; BRANCH_SOLID
$86:894F FA PLX
$86:8950 9E 27 1A STZ $1A27,x[$7E:1A41] ; Enemy projectile X subposition = 0
$86:8953 A5 22 LDA $22 [$7E:0022]
$86:8955 24 14 BIT $14 [$7E:0014] ;\
$86:8957 30 10 BMI $10 [$8969] ;} If [$14] < 0: go to BRANCH_MOVING_LEFT
$86:8959 29 F0 FF AND #$FFF0 ;\
$86:895C 38 SEC ;|
$86:895D E5 1C SBC $1C [$7E:001C] ;|
$86:895F DD 4B 1A CMP $1A4B,x[$7E:1A5D] ;} Enemy projectile X position = max([enemy projectile X position], (target front boundary) / 10h * 10h - [enemy projectile X radius])
$86:8962 90 03 BCC $03 [$8967] ;|
$86:8964 9D 4B 1A STA $1A4B,x[$7E:1A5D] ;/
$86:8967 38 SEC ;\
$86:8968 60 RTS ;} Return carry set
; BRANCH_MOVING_LEFT
$86:8969 09 0F 00 ORA #$000F ;\
$86:896C 38 SEC ;|
$86:896D 65 1C ADC $1C [$7E:001C] ;|
$86:896F DD 4B 1A CMP $1A4B,x[$7E:1A65] ;|
$86:8972 F0 02 BEQ $02 [$8976] ;} Enemy projectile X position = min([enemy projectile X position], (target front boundary) / 10h * 10h + 10h + [enemy projectile X radius])
$86:8974 B0 03 BCS $03 [$8979] ;|
;|
$86:8976 9D 4B 1A STA $1A4B,x[$7E:1A65] ;/
$86:8979 38 SEC ;\
$86:897A 60 RTS ;} Return carry set
}