;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Fire/Ice Boss (Possibly for World 7's Boss in ASMWCP2)
;;
;; Description:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm
		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
		RTL                 

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

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

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

SCODE_START:	LDA $7FAB10,x
 		AND #$04
		BNE WATER_POOL	
		JSR SUB_GFX             ; Big Boo Boss graphics routine

		LDA $9D                 ; \ if sprites locked, return
		BNE STOP		; /
		LDA $14C8,x
		CMP #$04
		BEQ END_PILLAR
		LDA $1528,x
		BEQ END_PILLAR
		JSL $81A7DC
		BCC STATEMACH
		JSL $80F5B7             ; interact with other sprites

STATEMACH:	LDA $157C,x	
		BNE RIGHT_WALK
		LDA $E4,x		; Compare to its current position.
		CMP #$10
		BCS CONTINUE1
		LDA #$01
		STA $157C,x
		DEC $1528,x
		BRA CONTINUE1		
RIGHT_WALK:	LDA $E4,x		; Compare to its current position.
		CMP #$E0
		BCC CONTINUE2
		STZ $157C,x
		DEC $1528,x
		BRA CONTINUE2	

CONTINUE1:	LDA #$D0
		BRA APPLY_SPEED
CONTINUE2:	LDA #$30
APPLY_SPEED:	STA $B6,x		; Store Sprite's X Speed from XSPEED.
		STZ $AA,x		; Store Sprite's Y Speed which is 0.
		JSL $81802A		; Apply speed.
STOP:		RTS
END_PILLAR:	LDA #$04
		STA $14C8,x
		RTS

WATER_POOL:	JSR SUB_GFX2
		LDA $9D                 ; \ if sprites locked, return
		BNE STOP		; /
		LDA $1540,x
		BEQ SET_WATER
		CMP #$01
		BEQ END_POOL
		CMP #$11
		BCC STOP
		AND #$07
		BNE STOP
		DEC $D8,x
		RTS
		
SET_WATER:	LDA #$61
		STA $1540,x
		RTS

END_POOL:	INC $1540,x
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TILE: 	db $0C,$0E

XDISP:  db $00,$00
	
YDISP:  db $F0,$00

SUB_GFX:
	JSL GetDrawInfo
	PHX			
SINGLE:	LDX #$01
Loop:	LDA $00			;\
	CLC			; | Apply X displacement of the sprite.
	ADC XDISP,x		; |
	STA $0300,y		;/ 

	LDA $01			;\
	CLC			; | Y displacement is added for the Y position, so one tile is higher than the other.
	ADC YDISP,x		; | Otherwise, both tiles would have been drawn to the same position!
	STA $0301,y		; | If X is 00, i.e. first tile, then load the first value from the table and apply that
				;/ as the displacement. For the second tile, F0 is added to make it higher than the first.
	LDA TILE,x
	STA $0302,y

	LDA #$37
	STA $0303,y		
		
	INY	
	INY	
	INY	
	INY
	DEX			; After drawing this tile, decrease number of tiles to go through loop. If the second tile
				; is drawn, then loop again to draw the first tile.

	BPL Loop		; Loop until X becomes negative (FF).
	
	PLX			; Pull back the sprite index! We pushed it at the beginning of the routine.

	LDY #$02		; Y ends with the tile size .. 02 means it's 16x16
	LDA #$01		; A -> number of tiles drawn - 1.
				; I drew 2 tiles, so 2-1 = 1. A = 01.
	JSL $81B7B3		; Call the routine that draws the sprite.
	RTS			; Never forget this!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TILE2: 		db $84,$94,$BA,$BB,$94,$84
XDISP2:  	db $F0,$F8,$00,$08,$10,$18
PROP2:		db $0D,$0D,$0D,$0D,$4D,$4D

SUB_GFX2:	JSL GetDrawInfo
		PHX			
SINGLE2:	LDX #$05
Loop2:		LDA $00			;\
		CLC			; | Apply X displacement of the sprite.
		ADC XDISP2,x		; |
		STA $0200,y		;/ 

		LDA $01
		STA $0201,y		; | If X is 00, i.e. first tile, then load the first value from the table and apply that
					;/ as the displacement. For the second tile, F0 is added to make it higher than the first.
		LDA TILE2,x
		STA $0202,y

		LDA $14AF
		AND #$01
		ASL
		ORA PROP2,x
		STA $0203,y		
		
		INY	
		INY	
		INY	
		INY
		DEX			; After drawing this tile, decrease number of tiles to go through loop. If the second tile
					; is drawn, then loop again to draw the first tile.

		BPL Loop2		; Loop until X becomes negative (FF).
	
		PLX			; Pull back the sprite index! We pushed it at the beginning of the routine.

		LDY #$01		; Y ends with the tile size .. 02 means it's 16x16
		LDA #$05		; A -> number of tiles drawn - 1.
					; I drew 2 tiles, so 2-1 = 1. A = 01.
		JSL $81B7B3		; Call the routine that draws the sprite.
		RTS			; Never forget this!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ROUTINES FROM THE LIBRARY ARE PASTED BELOW
; You should never have to modify this code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SUB_SMOKE           LDY #$03                ; \ find a free slot to display effect
FINDFREE            LDA $17C0,y             ;  |
                    BEQ FOUNDONE            ;  |
                    DEY                     ;  |
                    BPL FINDFREE            ;  |
                    RTS                     ; / return if no slots open

FOUNDONE            LDA #$01                ; \ set effect graphic to smoke graphic
                    STA $17C0,y             ; /
                    LDA #$1B                ; \ set time to show smoke
                    STA $17CC,y             ; /
                    LDA $D8,x               ; \ smoke y position = generator y position
                    STA $17C4,y             ; /
                    LDA $E4,x               ; \ load generator x position and store it for later
                    STA $17C8,y             ; /
                    RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hammer routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NEW_SPRITE_NUM = $7FAB9E
EXTRA_BITS = $7FAB10
X_OFFSET            dcb $06,$FA
X_OFFSET2           dcb $00,$FF
                    
SUB_HAMMER_THROW    LDA $15A0,x             ; \ no egg if off screen
                    ORA $186C,x             ;  |
                    ORA $15D0,x
                    BNE RETURN67
                    
                    JSL $82A9DE             ; \ get an index to an unused sprite slot, return if all slots full
                    BMI RETURN67            ; / after: Y has index of sprite being generated

                    lda #$10
		    sta $1df9 
                    
                    LDA #$08                ; \ set sprite status for new sprite
                    STA $14C8,y             ; /

                    PHX
                    LDA NEW_SPRITE_NUM,x
                    INC A
                    TYX
                    STA NEW_SPRITE_NUM,x
                    PLX

                    PHY
                    LDA $157C,x
                    TAY
                    LDA $E4,x               ; \ set x position for new sprite
                    CLC
                    ADC X_OFFSET,y
                    PLY
                    STA $00E4,y

                    PHY
                    LDA $157C,x
                    TAY
                    LDA $14E0,x             ;  |
                    ADC X_OFFSET2,y
                    PLY
                    STA $14E0,y             ; /

                    LDA $D8,x               ; \ set y position for new sprite
                    ;SEC                     ;  | (y position of generator - 1)
                    SBC #$00                ;  |
                    STA $00D8,y             ;  |
                    LDA $14D4,x             ;  |
                    SBC #$00                ;  |
                    STA $14D4,y             ; /

                    PHX                     ; \ before: X must have index of sprite being generated
                    TYX                     ;  | routine clears *all* old sprite values...
                    JSL $87F7D2             ;  | ...and loads in new values for the 6 main sprite tables
                    JSL $8187A7             ;  get table values for custom sprite
                    LDA #$88
                    STA EXTRA_BITS,x
                    PLX                       ; / 

                    LDA $157C,x
                    STA $157C,y
                
                    
                    
RETURN67            RTS                     ; return

