;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Donut Lift (sprite portion), by mikeyk
;;
;; Description: 
;;
;; NOTE: This sprite works in conjunction with a blocktool block.  The MAP16 number for
;; the block must be specified where it says DONUT_MAP16_NUM, and the sprite must
;; be inserted as sprite 85.
;; 
;; Uses first extra bit: NO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm

        DONUT_MAP16_NUM = $0385             ; map16 value of the donut block in hex
        
        DONUT_SPRITE_TILE = $86             ; graphic tile to use for donut sprite
        DONUT_SPRITE_PAL = $02              ; xyppccct format
        

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

                    dcb "INIT"
                    RTL

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

                    dcb "MAIN"
                    PHB                     ; \ 
                    PHK                     ;  |
                    PLB                     ;  |
                    JSR DONUT_CODE_START    ;  |
                    PLB                     ;  |
                    RTL                     ; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; donut main code 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DONUT_CODE_START    JSR DONUT_GRAPHICS      ;gfx routine
                    JSL SubOffscreenX3   ; handle off screen situation                   

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

NOTLOCKED           LDA $AA,x               ;if y speed = 0, jumps to timer code
                    BEQ NOSPEED
                    LDA $AA,x               ;caps y speed at 40
                    CMP #$38  
                    BPL SETSPEED 
                    CLC                     ;increments y speed by 2
                    ADC #$02   
                    STA $AA,x
SETSPEED            JSL $81801A             ;sets speed
                    LDA #$01
                    STA $1558,x

NOSPEED             JSL $81B44F             ;interact with sprite
                    BCC MAKE_BLOCK          ;if not on donut lift, change sprite to map16 block
                    
                    LDA $1558,x             ;if the timer hasn't been set, set timer
                    BNE DONTSETTIME
                    LDA #$28    
                    STA $1558,x 
DONTSETTIME         DEC A                   ;decrements timer
                    STA $1558,x     
                    CMP #$01                ;if the timer is down to 1, set y speed
                    BNE RETURN 
                    LDA #$0B                ;y speed=0B
                    STA $AA,x       
RETURN              RTS        

MAKE_BLOCK          LDA $AA,x
                    BNE RETURN
                    STZ $14C8,x             ; destroy the sprite
                    STZ $1558,x             ; reset timer
                    
                    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                ; \ change sprite to block 
                    LDA.W #DONUT_MAP16_NUM  ;  |
                    STA $03                 ;  |
                    JSL SubSetMap16      ;  |
                    PLP                     ; / 
                    
                    RTS     


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; donut graphics routine - specific 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DONUT_GRAPHICS      JSL GetDrawInfo       ; sets y = OAM offset
                    
                    STZ $02                 
                    STZ $03                 
                    
                    LDA $AA,x
                    BNE LABEL40
                    LDA $14    
                    AND #$02   
                    BNE LABEL40
                    LDA $1558,x
                    BEQ LABEL40
                    LDA $00    
                    INC A
                    BRA LABEL41
LABEL40             LDA $00
LABEL41             STA $0300,y

                    LDA $01                 ; \ tile y position = sprite y location ($01)
                    STA $0301,y             ; /

                    LDA $15F6,x             ; tile properties yxppccct, format
                    ORA $64                 ; add in tile priority of level
                    STA $0303,y             ; store tile properties

                    LDA #DONUT_SPRITE_TILE  ; \ store tile
                    STA $0302,y             ; /

;                    INY                     ; \ increase index to sprite tile map ($0300)...
;                    INY                     ;  |    ...we wrote 1 16x16 tile...
;                    INY                     ;  |    ...mikeyk is a derp...
;                    INY                     ; /    ...so increment 4 times

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

