;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Air mushroom, by Davros, and later modified by makinaman. Give credit to both us!
;;
;; Description: An air mushroom that fills mikeyk's air meter and lets you swim longer
;;
;; Uses first extra bit: YES
;; When the first extra bit is clear, it will appear in front of objects. When it is set, 
;; it will appear from behind the objects.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Extra Property Byte 1
;;    Bit 0 - interact with the ground
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm
                          
                    EXTRA_BITS = $7FAB10
                    EXTRA_PROP_1 = $7FAB28                   

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

                    dcb "INIT"
                    LDA EXTRA_BITS,x	    ; \ if the extra bits are set...
		    AND #$04                ;  |
		    BNE BEHIND              ; /

                    LDA EXTRA_PROP_1,x	    ; \ face Mario if the extra property is set
		    AND #$01                ;  |
		    BEQ END_INIT            ; /

                    PHY
                    JSL SubHorizPos
                    TYA
                    STA $157C,x
                    PLY
                    BRA END_INIT

BEHIND              LDA #$01                ; \ appear behind the scenery
	            STA $1632,x             ; /
END_INIT            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 $08,$F8


RETURN              RTS                     ; return
SPRITE_CODE_START   LDA $64		    ; call gfx routine with layer priority worked in
	            PHA                     ;
	            LDA $1632,x             ;
	            BEQ DO_GFX              ;
	            LDA #$10                ;
	            STA $64                 ;

DO_GFX              JSR SUB_GFX             ; graphics routine	
	            PLA                     ;
	            STA $64                 ;

                    JSL SubOffscreenX3   ; handle off screen situation
                    LDA $9D                 ; \ if sprites locked, return
                    BNE RETURN              ; /

                    LDA EXTRA_BITS,x	    ; \ set speed if the extra bit is set
		    AND #$04                ;  |
		    BNE NO_X_SPEED          ; /

                    LDA EXTRA_PROP_1,x	    ; \ interact with objects if the extra property is set...
		    AND #$01                ;  |
		    BEQ NO_X_SPEED          ; /

                    LDA $1588,x             ; \ if sprite is touching the side of an object...
                    AND #$03                ;  |
                    BEQ DONT_CHANGE_DIR     ;  |
                    LDA $157C,x             ;  |
                    EOR #$01                ;  | ...change sprite direction
                    STA $157C,x             ; /

DONT_CHANGE_DIR     LDY $157C,x             ; \ set x speed based on direction
                    LDA X_SPEED,y           ;  |
                    STA $B6,x               ; /

                    LDA $1588,x             ; \ if on the ground, reset the turn counter
                    AND #$04                ;  |
                    BEQ IN_AIR              ; /
                    LDA #$10                ; \ set y speed
                    STA $AA,x               ; /
                    BRA IN_AIR
 
NO_X_SPEED          STZ $B6,x               ; no x speed
                    STZ $AA,x               ; no y speed
IN_AIR              JSL $81802A             ; update position based on speed values

                    JSL $81A7DC             ; check for Mario/sprite contact
                    BCC RETURN              ; return if no contact
		    STZ $14C8,x             ; disappear the sprite

                    LDA #$01                ; \ give 200 points
	            JSL $82ACE5             ; /
	            LDA #$01		    ; \ play sound effect
	            STA $1DFC               ; /

                    LDA #$FF
;		    STA $7E005C
		STA $5C				; what kind of derphead writes $7E005C anyway
                    BRA GLITTER 

GLITTER	            JSR DISPLAY_GLITTER	    ; show glitter trail

RETURN2             RTS                     ; return                 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; display glitter routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	

DISPLAY_GLITTER     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 #$05                ; \ set effect graphic to glitter graphic
                    STA $17C0,y             ; /
                    LDA #$10                ; \ set time to show glitter
                    STA $17CC,y             ; /
                    LDA $D8,x               ; \ glitter y position = generator y position
                    STA $17C4,y             ; /
                    LDA $E4,x               ; \ load generator x position and store it for later
                    STA $17C8,y             ; /
                    RTS                     ; return


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


                    TILE = $24


SUB_GFX             JSL GetDrawInfo           ; after: Y = index to sprite OAM ($300)
                                            ; $00 = sprite x position relative to screen boarder 
                                            ; $01 = sprite y position relative to screen boarder  

                    LDA $00                 ; \ tile x position
                    STA $0300,y             ; /
                    
                    LDA $01                 ; \ tile y position
                    STA $0301,y             ; /
                    
                    LDA #TILE               ; \ store tile
                    STA $0302,y             ; / 
                    
                    PHX                     ;
                    LDX $15E9               ;
                    LDA $15F6,x             ; get palette info
                    PLX                     ;
                    ORA #$40                ; flip tile
                    ORA $64                 ; add in tile priority of level
                    STA $0303,y             ; store tile properties
                    
;                    INY                     ; | increase index to sprite tile map ($300)...
;                    INY                     ; |    ...we wrote 1 16x16 tile...
;                    INY                     ; |    ...sprite OAM is 8x8...
;                    INY                     ; |    ...so increment 4 times
; okay, first of all, that is NOT how the OAM mirror table works, and second of all, there is no need for these INYs when you're drawing only one tile

                    LDY #$02                ; \ (460 &= 2) 16x16 tiles maintained
                    LDA #$00                ;  | A = number of tiles drawn - 1
                    JSL $81B7B3             ; / don't draw if offscreen
                    RTS                     ; return


