;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;The hammer that the hammer throwing raven sprite spawns
;;by Joey : ) (Masashi27)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Initial Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Main Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
PHB
PHK
PLB
JSR SpriteRoutine
JSL SubOffscreenX3           ;Erase, if the sprite goes offscreen
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Sprite Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Return33:
JSL $81A7DC       ;Check for the sprite/Mario contact
RTS

Xspeed: dcb $10,$F0
Yspeed: dcb $E5,$F0,$00,$1C,$3C

SpriteRoutine:
JSR Graphics
LDA $14C8,x
CMP #$08
BNE Return33
LDA $9D
BNE Return33

LDY $157C,x
LDA Xspeed,y
STA $B6,x
JSL $81802A

LDY $C2,x
LDA Yspeed,y
STA $AA,x
JSL $81802A

LDA $C2,x                                 ;\
CMP #$04                                  ;|These
BEQ FallSpeed                        ;|cmps and beqs
CMP #$03                                  ;|update
BEQ StartingToFallSpeed    ;|the sprite's
CMP #$02                                  ;|Y speed
BEQ InTheAirSpeed               ;|...well, they
CMP #$01                                  ;|actually check some stuff...
BEQ RisingSpeed                   ;/
JMP InitialSpeed

FallSpeed:
STZ $1534,x
BRA Return

StartingToFallSpeed:
LDA $1534,x
CMP #$07
BEQ IncreaseState
INC $1534,x
BRA Return

InTheAirSpeed:
LDA $1534,x
CMP #$03
BEQ IncreaseState
INC $1534,x
BRA Return

RisingSpeed:
LDA $1534,x
CMP #$07
BEQ IncreaseState
INC $1534,x
BRA Return

InitialSpeed:
LDA $1534,x
CMP #$07
BEQ IncreaseState
INC $1534,x
BRA Return

IncreaseState:
STZ $1534,x
INC $C2,x

Return:
JSL $81A7DC       ;Check for the sprite/Mario contact
BCC OkReturn
JSL $80F5B7        ;Hurt Mario

OkReturn:
RTS

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

Tiles: dcb $C0,$C2,$C4,$C6

Graphics:

JSL GetDrawInfo       ; sets y = OAM offset
LDA $157C,x             ; \ $02 = direction
STA $02                 ; /     
LDA $14
LSR A
LSR A
AND #$03
STA $03             
                    
PHX
LDA $00                 ; \ tile x position = sprite x location ($00)
STA $0300,y             ; /
                    
LDA $01                 ; \ tile y position = sprite y location ($01)
STA $0301,y             ; /
PLX
LDA $15F6,x             ; tile properties xyppccct, format
PHX
LDX $02                 ; \ if direction == 0...
BNE No_Flip             ;  |
ORA #$40                ; /    ...flip tile
No_Flip
ORA $64                 ; add in tile priority of level
STA $0303,y             ; store tile properties

LDX $03
LDA Tiles,x
STA $0302,y             
PLX
INY                     ; \ increase index to sprite tile map ($300)...
INY                     ;  |    ...we wrote 1 16x16 tile...
INY                     ;  |    ...sprite OAM is 8x8...
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

