;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Mini Chomp Shark, by yoshicookiezeus
;;
;; Description: This sprite travels in a straight line, eating tiles and replacing them
;; with tile 25.
;;
;; Uses first extra bit: YES
;; If the first extra bit is set, the sprite will eat its way through anything.
;; Otherwise, the sprite will disappear in a puff of smoke if it hits a solid tile.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm

			EXTRA_BITS = $7FAB10

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			dcb "INIT"
			PHY
			JSL SubHorizPos
			TYA
			STA $157C,x
			PLY
			RTL                 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			dcb "MAIN"                                    
			PHB			; \
			PHK			;  | main sprite function, just calls local subroutine
			PLB			;  |
			JSR SPRITE_CODE_START	;  |
			PLB			;  |
			RTL			; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


X_SPEED			dcb $10,$F0

RETURN			RTS
SPRITE_CODE_START	JSR SPRITE_GRAPHICS	; graphics routine
			LDA $14C8,x		; \ 
			CMP #$08		;  | if status != 8, return
			BNE RETURN		; /
			JSL SubOffscreenX0	; handle off screen situation
			LDA $9D			; \ if sprites locked, return
			BNE RETURN		; /

			LDY $157C,x		; \ set x speed based on direction
			LDA X_SPEED,y		;  |
			STA $B6,x		; /
			INC $1570,x
                    
			STZ $AA,x
			JSL $81802A		; update position based on speed values
			JSL $81A7DC		; interact with Mario

			LDA EXTRA_BITS,x
			AND #$04
			BNE CONTINUE
	
         
			LDA $1588,x		; \ if sprite is in contact with an object...
			AND #$03		;  |
			BEQ CONTINUE		;  |
			LDA #$04		;  | kill sprite...
			STA $14C8,x		;  |
			LDA #$1F		;  |
			STA $1540,x		;  |
			RTS			; /  and return

CONTINUE		LDA $14E0,x		; \ if sprite is going outside level boundaries...
			CMP #$FF		;  |
			BNE RIGHTCHECK		;  |
			LDA $E4,x		;  |
			CMP #$10		;  |	
			BCC EAT			;  |
			BRA KILL		;  |
RIGHTCHECK		LDA $14E0,x		;  |
			CMP #$20		;  |
			BNE EAT			;  |
			LDA $E4,x		;  |
			CMP #$20		;  |
			BCS EAT			;  |
KILL			LDA #$04		;  | kill sprite...
			STA $14C8,x		;  |
			LDA #$1F		;  |
			STA $1540,x		;  |
			RTS			; /  and return

EAT			LDA $18A7
			CMP #$25
			BEQ RETURN1

			LDA $1570,x
			AND #$0F
			;CMP #$07
			BNE RETURN1
			LDA $E4,x		; \ setup block properties
			STA $9A			;  |
			LDA $14E0,x		;  |
			STA $9B			;  |
			LDA $D8,x		;  |
			STA $98			;  |
			LDA $14D4,x		;  |
			STA $99			; /
                    
			PHP
			REP #$30		; \ spawn tile 25
			LDA.W #$0025		;  |
			STA $03			;  |
			JSL SubSetMap16	;  |
			PLP			; /

			; <wye>

			LDA $98			; \
			CLC			;  | point to tile below
			ADC #$10		;  | (probably not accounting for sub-screen boundaries)
			STA $98			; /

			PHP
			REP #$30		; \ spawn tile 25
			LDA.W #$0025		;  |
			STA $03			;  |
			JSL SubSetMap16	;  |
			PLP			; /

			; </wye>


			PHB			;preserve current bank
			LDA #$02		;push 02
			PHA
			PLB			;bank = 02
			LDA #$00		;default shatter
			JSL $828663		;shatter block
			PLB	

RETURN1			RTS


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPRITE_GRAPHICS     
		; entirely rewritten by WYE

		JSL GetDrawInfo
		LDA $14
		LSR A
		LSR A
		LSR A
		CLC
		ADC $15E9
		AND #$01
		ASL A
		ASL A
		STA $03			; $03 = 0 or 4 depending on the animation frame

		PHX
		LDX #$00

Loop:
		LDA $00
		CLC
		ADC Xpos,x
		STA $0300,y

		LDA $01
		CLC
		ADC YPos,x
		STA $0301,y

		PHX

		TXA
		CLC
		ADC $03
		TAX
		LDA Tilemap,x
		STA $0302,y

		LDX $15E9
		LDA $15F6,x
		ORA $64
		STA $0303,y
		
		INY
		INY
		INY
		INY

		PLX
		INX
		CPX #$04
		BNE Loop

		PLX
		LDY #$02
		LDA #$03
		JSL $81B7B3
		RTS

Xpos:
		dcb $00,$10
		dcb $00,$10

Ypos:
		dcb $00,$00
		dcb $10,$10

Tilemap:
		dcb $0C,$0E ; Frame 1
		dcb $2C,$2E

		dcb $48,$4A ; Frame 2
		dcb $68,$6A

