;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Hammer Throwing Raven
;;by Joey : ) (Masashi27)
;;A sprite I coded for An SMW Central Production 2
;;collab hack.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Some Settings
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Hammer_num = $4B                       ;Enter the sprite number of the hammer sprite

RightSpeed: dcb $10,$00,$00,$00              ;\Feel free to modify the sprite's X speed! Don't modify the $00s, though.
LeftSpeed: dcb $F0,$00,$00,$00                 ;/It won't function properly if you alter them.
Yspeed: dcb $00,$00,$40,$00                      ;This is the sprite's verticall speed. Once again, don't modify the $00s.

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

dcb "INIT"
JSL SubHorizPos
TYA
STA $157C,x ;Face Mario Initially
LDA #$30
STA $1504,x
RTL

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

dcb "MAIN"
PHB
PHK
PLB
JSR SpriteRoutine
LDA $1528,x
BNE Label19                                             ;If $1528,x does not = 0, don't check if a shell is hitting the sprite.
JSR Shell_Interact                                   ;Just to check if a shell hits the sprite
Label19:
JSL SubOffscreenX3               ;If the sprite goes offscreen, erase it
PLB
RTL

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

Return14:
RTS

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

LDA $1588,x
AND #$03
BEQ NoFlip
LDA $157C,x
EOR #$01
STA $157C,x

NoFlip:
LDY $1528,x
LDA $157C,x
BEQ Right
LDA LeftSpeed,y
BRA StoreSpeed
Right:
LDA RightSpeed,y
StoreSpeed:
STA $B6,x
LDA Yspeed,y
STA $AA,x
JSL $81802A

LDA $1528,x
CMP #$03
BEQ StateD
CMP #$02
BEQ StateC
CMP #$01
BEQ StateB

CheckC2:
LDA #$02
STA $1662,x
LDA $C2,x
CMP #$01
BCS StateA1

StateA:                  ;Throwing Timer
LDA $1504,x
CMP #$40            ;Wait for 64 frames (hex)
BEQ Throw
INC $1504,x
BRA Label14

StateA1:                ;Throwing Timer 2
LDA $1504,x
CMP #$0F             ;Wait for 15 frames
BEQ Throw
INC $1504,x
BRA Label14

Throw:
JSR Generate_Hammer
LDA $C2,x
BNE NoSfx
LDA #$23
STA $1DF9 ;Lendy/Wendy fall noise
NoSfx:
STZ $1504,x
LDA $C2,x
CMP #$03
BEQ ClearC2
INC $C2,x
BRA Label14

ClearC2:
STZ $C2,x
BRA Label14

Label14:
BRA Return

StateB:
LDA $1534,x
CMP #$2C             ;Stay stationary for 44 frames
BEQ IncState
INC $1534,x
BRA Return

StateC:
LDA $1588,x
AND #$04             ;If the sprite is not on the ground, return
BEQ Return

IncState:
STZ $1534,x
INC $1528,x          ;$1528,x should = 2 now
BRA Return

StateD:                  ;Final Countdown!
LDA $1534,x
CMP #$60             ;Wait for 60 frames
BEQ KillSprite
INC $1534,x
BRA Return

KillSprite
JSR Puff
STZ $14C8,x        ;The sprite is non-existant now
LDA #$08
STA $1DF9          ;Make a noise
BRA RealReturn

Return:
LDA $1528,x
CMP #$01
BCS RealReturn
JSL $81A7DC     ;Check Mario/Sprite contact
BCC RealReturn
JSL SubVertPos
LDA $7D
BMI HurtMario
JSR Puff
STZ $14C8,x        ;Let the sprite disappear
LDA #$20
STA $1DF9          ;Set Sound Effect
LDA $15
AND #$80
BNE LongJump
LDA $16
AND #$80
BNE LongJump
LDA #$E0
STA $7D
BRA RealReturn

HurtMario:
JSL $80F5B7
BRA RealReturn

LongJump:
LDA #$B3
STA $7D

RealReturn
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Sprite interaction
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Shell_Interact	    LDY #$0B                ; 
Loop		    LDA $14C8,y             ; \ if the sprite status is..
		    CMP #$09                ;  | ...shell-like
		    BEQ Process_Sprite      ; /
		    CMP #$0A                ; \ ...throwned shell-like
		    BEQ Process_Sprite      ; /
Next_Sprite	    DEY                     ;
		    BPL Loop                ; ...otherwise, loop
		    RTS                     ; return

Process_Sprite	    PHX                     ; push x
		    TYX                     ; transfer y to x
		    JSL $83B6E5             ; get sprite clipping B routine
		    PLX                     ; pull x
		    JSL $83B69F             ; get sprite clipping A routine
		    JSL $83B72B             ; check for contact routine
                                            BCC Next_Sprite      ;
                                            INC $1528,x                ;Increment the sprite status by 1
                                            LDA #$3F
                                            STA $166E
                                            LDA #$02
                                            STA $14C8,y              ;Kill the sprite
                                            LDA #$28
                                            STA $1DFC ;Make the "bonce off chuck" sound effect
                                            RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Disappear in puff of smoke
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Puff:
LDY #$03
Findfree:
LDA $17C0,y
BEQ FoundOne
DEY
BPL Findfree
RTS
FoundOne
LDA #$01
STA $17C0,y
LDA $E4,x
STA $17C8,y
LDA $D8,x
STA $17C4,y
LDA #$1B
STA $17CC,y
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Generate Hammer Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Return94:
RTS     
Generate_Hammer:
JSL $82A9DE
BMI Return94

LDA #$08
STA $14C8,y

LDA #Hammer_Num
PHX
TYX
STA $7FAB9E,x
PLX
                    
LDA $E4,x
STA $00E4,y
LDA $14E0,x
STA $14E0,y

LDA $D8,x
STA $00D8,y
LDA $14D4,x
STA $14D4,y

PHX
TYX
JSL $87F7D2
JSL $8187A7
LDA #$88
STA $7FAB10,x
PLX
LDA $157C,x
STA $157C,y
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Graphics Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

AddToTiles: dcb $00,$04,$08,$04

Properties: dcb $4F,$0F

Tiles:
dcb $80,$82,$A0,$A2
dcb $84,$86,$A4,$EE
dcb $88,$8A,$A8,$AA
dcb $84,$86,$A4,$EE

Xdisp:
dcb $10,$00
dcb $10,$00
dcb $00,$10
dcb $00,$10

Ydisp:
dcb $F0,$F0
dcb $00,$00

Graphics:
JSL GetDrawInfo

LDA $1528,x
CMP #$02
BCC NoDead
JSR DeadRavenGraphics
RTS

NoDead:
LDA $14C8,x
CMP #$08
BCC Label67
LDA $14
LSR A
LSR A
LSR A
AND #$03

Label67:
PHX
TAX
LDA AddToTiles,x
PLX
STA $03

STZ $02
LDA $157C,x
STA $02
PHX
TAX
LDA Properties,x
PLX
STA $04

PHX
LDX #$03
loop:
PHX
LDA $02
BEQ FacingRight
INX
INX
INX
INX
FacingRight:
LDA $00
CLC
ADC Xdisp,x
STA $0300,y
PLX

LDA $01
CLC
ADC Ydisp,x
STA $0301,y

PHX
TXA
CLC
ADC $03
TAX
LDA Tiles,x
STA $0302,y
PLX

LDA $04
ORA $64
STA $0303,y

INY
INY
INY
INY
DEX
BPL loop
PLX
LDY #$02
LDA #$03
JSL $81B7B3
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Dead Raven Graphics Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DeadProps: dcb $4F,$0F
DeadTiles: dcb $8C,$AC

DeadXdisp:
dcb $10,$00

DeadRavenGraphics:
	LDA $157C,x
	STA $02			; Store direction to $02 for use with property routine later.

	PHX			;\ Push sprite index ..
	LDX #$01		;/ And load X with number of tiles to loop through.
Loop:

                    PHX
                    LDA $02
                    BEQ FacingRight2
                    LDA $00
                    SEC
                    SBC DeadXdisp,x
                    BRA LabelTits
                    FacingRight2:
	LDA $00			
	CLC			
	ADC DeadXdisp,x		
LabelTits:	
                    STA $0300,y		

	LDA $01			
	STA $0301,y		

	LDA DeadTiles,x
	STA $0302,y

	PHX
	LDX $02
	LDA DeadProps,x
	ORA $64
	STA $0303,y
	PLX

	INY
	INY
	INY
	INY
		
	PLX
	DEX


	BPL Loop
	
	PLX

	LDY #$02
	LDA #$03

	JSL $81B7B3
	RTS


