;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Cave-In Block, by yoshicookiezeus
;;
;; Description: A block that falls, bounces when it hits the ground, and then falls
;;		offscreen. It is 16x16 if the extra bit is set, and 32x32 if it isn't.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_xkas.asm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			print "INIT ",pc
			LDA $7FAB10,x			;\ if extra bit clear,
			AND #$04			; |
			BEQ InitReturn			;/ branch
			LDA #$01			;\ mark block as small
			STA $C2,x			;/
			STZ $1662,x 			; set sprite clipping value for small block
			STZ $1656,x			; set object clipping value for small block
InitReturn:
			RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			print "MAIN ",pc
			PHB
			PHK
			PLB
			JSR SpriteMain
			PLB
			RTL
	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SpriteMain:
			JSR SpriteGraphics
			JSL !SubOffscreenX0

			LDA $9D				;\ if sprites locked,
			BNE Return			;/ return

			JSL $81802A			; update sprite position
			JSL $81A7DC

			JSL $819138			; interact with objects

			LDA $1588,x			;\ if sprite isn't touching the ground,
			AND #$04			; |
			BEQ Return			;/ branch

			LDA $1686,x			;\ disable sprite's interaction with objects
			ORA #$80			; |
			STA $1686,x			;/

			LDA #$E0			;\ set new sprite Y speed
			STA $AA,x			;/

			LDA #$09			;\ play sound effect
			STA $1DFC			;/

Return:
			RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

OffsetX:		db $00,$10,$00,$10		;\ just your generic 32x32 square
OffsetY:		db $00,$00,$10,$10		; |
TilemapBig:		db $44,$46,$64,$66		;/

!TileSmall		= $0A

SpriteGraphics:
			JSL !GetDrawInfo

			LDA $C2,x			;\ if block is small,
			BNE Small			;/ branch

; graphics routine for big block
			PHX				; preserve sprite index
			LDX #$03			; setup loop

LoopStart:
			LDA $00				;\ set tile x position
			CLC				; |
			ADC OffsetX,x			; |
			STA $0300,y			;/

			LDA $01				;\ set tile y position
			CLC				; |
			ADC OffsetY,x			; |
			STA $0301,y			;/

			LDA TilemapBig,x		;\ set tile number
			STA $0302,y			;/

			PHX				;\ set tile properties
			LDX $15E9			; |
			LDA $15F6,x			; |
			ORA $64				; |
			AND #$CF			; | clear priority bytes - IF YOU WANT THE SPRITE TO APPEAR IN FRONT OF THE GROUND, COMMENT OUT THIS LINE
			STA $0303,y			; |
			PLX				;/

			INY				;\ increase OAM index
			INY				; |
			INY				; |
			INY				;/

			DEX				;\ if tiles left to draw,
			BPL LoopStart			;/ go to start of loop

			PLX				; retrieve sprite index

			LDY #$02			; the tiles drawn were 16x16
			LDA #$03			; four tiles were drawn
			JSL $81B7B3			; finish OAM write

			RTS

; graphics routine for small block
Small:
			LDA $00				;\ set tile x position
			STA $0300,y			;/

			LDA $01				;\ set tile y position
			STA $0301,y			;/

			LDA #!TileSmall			;\ set tile number
			STA $0302,y			;/

			PHX				;\ set tile properties
			LDX $15E9			; |
			LDA $15F6,x			; |
			ORA $64				; |
			AND #$CF			; | clear priority bytes - IF YOU WANT THE SPRITE TO APPEAR IN FRONT OF THE GROUND, COMMENT OUT THIS LINE yay copypasta
			STA $0303,y			; |
			PLX				;/

			LDY #$02			; the tiles wri(ry
			LDA #$00			; if you really need to know what this does, look at the other graphics routine
			JSL $81B7B3			; 

			RTS

