;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Timed Lift 2, adapted by Davros.
;;
;; Description: A timed lift that will fall down once it runs out of time.
;;
;; Uses first extra bit: YES
;; If the extra bit is set, it will go to the left.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Extra Property Byte 1
;;    Bit 0 - set timer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm

                    EXTRA_BITS = $7FAB10
                    EXTRA_PROP_1 = $7FAB28

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

                    dcb "INIT"
                    LDA EXTRA_PROP_1,x      ; \ time until the platform falls down
		    STA $1570,x             ; /
                    RTL                     ; return

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

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

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


                    RIGHT_X_SPEED = $10
                    LEFT_X_SPEED = $F0


SPRITE_CODE_START   JSR SUB_GFX             ; graphics routine
		    LDA $9D                 ; \ if sprites locked, return
		    BNE RETURN              ; /

		    JSL SubOffscreenX3   ; handle off screen situation

		    LDA $13                 ; \ if the animated frame is zero...
		    AND #$00                ;  |
		    BNE CALC_FRAME          ; /
		    LDA $C2,x               ; \ if the sprite state is set
		    BEQ CALC_FRAME          ; /
		    LDA $1570,x             ; \ calculate which frame to show
		    BEQ CALC_FRAME          ; /
		    DEC $1570,x             ; decrease number of frames
CALC_FRAME	    LDA $1570,x             ; \ calculate which frame to show
		    BEQ UPDATE              ; /

		    JSL $818022             ; update speed position without y speed

		    STA $1528,x             ; prevent Mario from sliding horizontally
		    JSL $81B44F             ; interact with sprites
		    BCC RETURN              ; return if no contact
                
                    LDA EXTRA_BITS,x        ; \ set to the left if the extra bits are set...
	            AND #$04                ;  |
	            BNE LEFT_SPEED          ; /

RIGHT_SPEED         LDA #RIGHT_X_SPEED      ; \ set right x speed
                    BRA STORE_X_SPEED       ; /

LEFT_SPEED          LDA #LEFT_X_SPEED       ; \ set left x speed
STORE_X_SPEED	    STA $B6,x               ; / 
		    STA $C2,x               ; store sprite state
RETURN		    RTS                     ; return
                    
UPDATE	            JSL $81802A             ; update position based on speed values
		    LDA $1491               ; amount to move Mario                    
		    STA $1528,x             ; prevent Mario from sliding horizontally
		    JSL $81B44F             ; interact with sprites
		    RTS                     ; return


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


TILEMAP		    dcb $C4,$C4
TILE_SIZE	    dcb $02,$02,$00
PROPERTIES	    dcb $00,$40,$00
HORZ_DISP	    dcb $00,$10,$0C
VERT_DISP	    dcb $00,$00,$04
NUM_TILES	    dcb $B6,$B5,$B4,$B3


SUB_GFX		    JSL GetDrawInfo       ; after: Y = index to sprite tile map ($300)
                                            ; $00 = sprite x position relative to screen boarder 
                                            ; $01 = sprite y position relative to screen boarder
		    LDA $1570,x             ; \ calculate the frames for the tilemap
		    PHX                     ;  |
		    PHA                     ;  |
		    LSR A                   ;  |
		    LSR A                   ;  |
		    LSR A                   ;  |
		    LSR A                   ;  |
		    LSR A                   ;  |
		    LSR A                   ;  |
		    TAX                     ; /
		    LDA NUM_TILES,x         ; \ store tilemap for the numbers
		    STA $02                 ; /

		    LDX #$02
		    PLA
		    CMP #$08
		    BCS LOOP_START
		    DEX

LOOP_START	    LDA $00                 ; \ tile x position = sprite x location ($00) + tile displacement
		    CLC                     ;  |
		    ADC HORZ_DISP,x         ;  |
		    STA $0300,y             ; /

		    LDA $01                 ; \ tile y position = sprite x location ($01) + tile displacement
		    CLC                     ;  |
		    ADC VERT_DISP,x         ;  |
		    STA $0301,y             ; /

		    LDA TILEMAP,x           ; \ store tilemap
		    CPX #$02                ;  |
		    BNE STORE_TILE          ;  |
		    LDA $02                 ;  |
STORE_TILE	    STA $0302,y             ; /

                    PHX                     ;
                    LDX $15E9               ;
                    LDA $15F6,x             ; get palette info
                    PLX                     ;
                    ORA PROPERTIES,x        ; flip tile if necessary
		    ORA $64                 ; add in tile priority of level
		    STA $0303,y             ; store tile properties

                    PHY                     ; set tile to be 8x8 or 16x16
                    TYA                     ;
                    LSR A                   ;
                    LSR A                   ;
                    TAY                     ;
                    LDA TILE_SIZE,x         ; 
                    STA $0460,y             ;
                    PLY                     ;

                    INY                     ; \ increase index to sprite tile map ($300)...
                    INY                     ;  |    ...we wrote 1 16x16 tile...
                    INY                     ;  |    ...sprite OAM is 8x8...
                    INY                     ;  |    ...so increment 4 times
                    DEX                     ;  | go to next tile of frame and loop
                    BPL LOOP_START          ; /

                    PLX                     ; pull, X = sprite index
                    LDY #$FF                ; \ we've already set 460 so use FF
                    LDA #$02                ;  | A = number of tiles drawn - 1
                    JSL $81B7B3             ; / don't draw if offscreen
                    RTS                     ; return


