;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Brown Moving Platform, by imamelia
;;
;; This platform will move back and forth in a specified range,
;; either vertically or horizontally.
;;
;; Uses first extra bit: YES
;;
;; If the first extra bit is set, the platform will move vertically.
;; If not, the platform will move horizontally.
;;
;; Based on the following sprite:
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;  Brown Platform that falls, by Mirumo
;;  A brown platform from SMB3 that falls when stepped.
;;
;;  Extra Bit: YES
;;  Clear: it will not move.
;;  Set	:  it will always move to the left.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

incsrc subroutinedefs_trasm.asm

                    EXTRA_PROP_1 = $7FAB28
;Xspeed		    db $00,$00,$F8,$F8

X_Speeds: dcb $0C,$F4
Y_Speeds: dcb $0C,$F4

TimerValue = $7F
TurnTimer = $C2

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

                    dcb "INIT"
                    PHY
                    JSL SubHorizPos
                    TYA
                    STA $157C,x
                    PLY
                    LDA $1588,x             ; if on the ground, reset the turn counter
                    ORA #$04
                    STA $1588,x             ; if on the ground, reset the turn counter
	LDA #TimerValue
	STA TurnTimer,x		; set turn timer
	STZ $157C,x		; set horizontal direction to right
	STZ $151C,x		; and vertical direction to down
                    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 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RETURN              RTS
SPRITE_CODE_START   JSR SPRITE_GRAPHICS     ; graphics routine
                    LDA $14C8,x             ; \ 
                    CMP #$08                ;  | if status != 8, return
                    BNE RETURN              ; /
                    LDA $9D                 ; \ if sprites locked, return
                    BNE RETURN              ; /

                    JSL SubOffscreenX0   ; handle off screen situation

	LDA $7FAB10,x	;
	AND #$04	; if the extra bit is set...
	BNE Vertical	; move vertically

	Horizontal:
	LDY $157C,x	;
	LDA X_Speeds,y	; set X speed based on direction
	STA $B6,x

	JSR UpdateXPosition	; update X position
	JSR Interaction	; interaction routine
	RTS

	Vertical:
	LDY $151C,x	;
	LDA Y_Speeds,y	; set Y speed based on direction
	STA $AA,x

	JSR UpdateYPosition	; update Y position
	JSR Interaction	; interaction routine
	RTS

UpdateXPosition:

JSR WavyMotion
JSL $818022             ; Update X position without gravity

STA $1528,x             ; prevent Mario from sliding horizontally

DEC TurnTimer,x	; decrement turn timer
LDA TurnTimer,x	; if the turn timer is 00...
BNE DontFlip	; flip the sprite's direction
JSR FlipDirection	;
DontFlip:
RTS

UpdateYPosition:

JSR WavyMotion2
JSL $81801A             ; Update Y position without gravity

DEC TurnTimer,x	; decrement turn timer
LDA TurnTimer,x	; if the turn timer is 00...
BNE DontFlip	; flip the sprite's direction
JSR FlipDirection	;
DontFlip:
RTS

Interaction:

JSL $81B44F	; invisible solid block routine
RTS

FlipDirection:

LDA $157C,x
EOR #$01		; flip horizontal direction
STA $157C,x

LDA $151C,x
EOR #$01		; flip vertical direction
STA $151C,x

LDA #TimerValue
STA TurnTimer,x	; reset turn timer

RTS

;==================================================================
;Wavy Motion Subroutine.	
;==================================================================

WavyMotion:
	PHY ; Push Y in case something messes it up.
	LDA $14 ; Get the sprite frame counter ..
	LSR A ; 7F
	LSR A ; 3F ; Tip: LSR #3.
	LSR A ; 1F
	AND #$07 ; Loop through these bytes during H-Blank. (WHAT?)
	TAY ; Into Y.
	LDA WavySpd,y ; Load Y speeds ..
	STA $AA,x
	JSL $81801A ; Update, with no gravity.
	PLY ; Pull Y.
	RTS

WavyMotion2:
	PHY ; Push Y in case something messes it up.
	LDA $14 ; Get the sprite frame counter ..
	LSR A ; 7F
	LSR A ; 3F ; Tip: LSR #3.
	LSR A ; 1F
	AND #$07 ; Loop through these bytes during H-Blank. (WHAT?)
	TAY ; Into Y.
	LDA WavySpd2,y ; Load Y speeds ..
	STA $B6,x
	JSL $818022 ; Update, with no gravity.
	STA $1528,x
	PLY ; Pull Y.
	RTS

WavySpd: db $00,$F8,$F2,$F8,$00,$08,$0E,$08
WavySpd2: db $00,$F8,$F2,$F8,$00,$08,$0E,$08

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


FallingPlatDispX                 dcb $00,$10,$20,$30
FallingPlatDispY		 dcb $00,$00,$F8,$F8

FallingPlatTiles                 dcb $88,$8A,$8C,$8E

SPRITE_GRAPHICS	    JSL GetDrawInfo
STY $3F
		    PHX                       
	            LDX #$03                
CODE_038498  	    LDA $00                   
		    CLC                       
		    ADC FallingPlatDispX,x  
		    STA $0300,Y         
		    LDA $01                   
		    CLC
		    ADC FallingPlatDispY,x
		    STA $0301,Y         
		    LDA FallingPlatTiles,x  
		    STA $0302,Y          
		    LDA #$37             ;Sprite PAL/GFX Page                
		    ORA $64                   
		    STA $0303,Y          
		    INY                       
		    INY                       
		    INY                       
		    INY                       
	            DEX                       
	            BPL CODE_038498           
		    PLX                       
		    LDY.B #$02                
		    LDA.B #$03                
		    JSL $81B7B3     
		    RTS                       ; Return 

