;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sumo brother disassembly
; By nekoh
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	RAM_SpriteDir   = $157C
	RAM_NoJumpTimer = $1504
	RAM_StateTimer  = $1540
	RAM_SpriteState = $C2

                    dcb "INIT"


                    LDY #$00                
                    LDA $D1                   
                    SEC                       
                    SBC $E4,X       
                    STA $0F            
	LDA #$20
	STA $15AC,X       
                    LDA $D2                   
                    SBC.W $14E0,X     
                    BPL Return01AD41          
                    INY                             
                    TYA                       
                    STA $157C,X     

;JSR SubHorzPosBnk3
;LDA XSpeedtable,y

LDA #$27
STA $B6,x
        JSL $018022 

Return01AD41:       RTL                       


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                           
                    dcb "MAIN"
                    PHB                       
                    PHK                       
                    PLB                             
                    JSR PorcuPuffer         
                    PLB                       
                    RTL                       ; Return 

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

PorcuPuffAccel:     db $01,$FF
PorcuPuffMaxSpeed:  db $10,$F0

PorcuPuffer:        JSR PocruPufferGfx         
                    LDA $9D     
                    BNE Return038586          
                    LDA $14C8,X             
                    CMP #$08                
                    BNE Return038586          
                    JSR SubOffscreen0Bnk3   
                    JSL $01803A  
                    JSR SubHorzPosBnk3      
                    TYA                       
                    STA $157C,X     
                    LDA $14     
                    AND #$03                
                    BNE CODE_03855E           
                    ;LDA $B6,X    ; \ Branch if at max speed 
                    ;CMP PorcuPuffMaxSpeed,Y ;  | 
                    ;BEQ CODE_03855E           ; / 
                    ;CLC                       ; \ Otherwise, accelerate 
                    ;ADC PorcuPuffAccel,Y    ;  | 
                    ;STA $B6,X    ; / 
CODE_03855E:        ;LDA $B6,X    
                    ;PHA                       
                    ;LDA $17BD               
                    ;ASL                       
                    ;ASL                       
                    ;ASL                       
                    ;CLC                       
                    ;ADC $B6,X    
                    ;STA $B6,X    
                    ;JSL $018022   
                    ;PLA     

JSR SetUpMovement

         JSL $018022 
         

                    JSL $019138         
                    ;LDY #$04
	LDA $1558,x
	BNE splash

	LDA $AA,X
	INC
	INC			;More INC = fast fall
	INC
	TAY                

                    LDA.W $164A,X     ;in water flag        
                    BEQ CODE_038580           
                    LDY #$FC                
	LDA $15AC,X	;timer for jump
	BEQ Jump
	;BRA CODE_038580
	BRA float
Jump:

	LDA #$44		;distance required to try jumping
	STA $00
	JSR Proximity		;
	BEQ float
	;LDA #$A8		
	;STA $AA,X
LDA #$0F
STA $1558,x	

	LDA #$70
	STA $15AC,x
	BRA Skip


float:	LDY #$FC
CODE_038580:        STY $AA,X    
Skip:
                    JSL $01801A   
Return038586:       RTS                       ; Return 

splash:

CMP #$04	;(F - 4) (by default) frames spent dipping in the water before jumping
BCC attack
LDA #$10	;speed of dipping
STA $AA,x
BRA Skip
attack:

LDA #$A8	;*****TWEAK THIS FOR DIFFERENT JUMP HEIGHTS*****
STA $AA,x
BRA Skip





TimeInState:
	dcb $11,$28	;$11 originally
	
XSpeedtable:
	DCB $27,$D9	;31,cf	;&&&&TWEAK THESE FOR DIFFERENT X SPEEDS&&&&
JumpTable:
	DCB $20,$DF	;25,dc

SetUpMovement:


;LDA $14
;AND #$1F
;BNE rtns

LDA.W $164A,X     ;in water flag        	
BEQ rtns


LDA #$98	;distance required before attempting to turn around
STA $00
JSR Proximity
BNE rtns
JSR SubHorzPosBnk3
LDA XSpeedtable,y
STA $B6,x

rtns:
	RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PorcuPuffer graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PocruPufferDispX:   db $F8,$08,$F8,$08,$08,$F8,$08,$F8
PocruPufferDispY:   db $F8,$F8,$08,$08
PocruPufferTiles:   db $86,$C0,$A6,$C2,$86,$C0,$A6,$8A
PocruPufferGfxProp: db $0F,$0F,$0F,$0F,$4F,$4F,$4F,$4F

PocruPufferGfx:     JSL $20CA4F    
                    LDA $14     
                    AND #$04                
                    STA $03                   
                    LDA $157C,X     
                    STA $02                   
                    PHX                       
                    LDX #$03                
CODE_0385B4:        LDA $01                   
                    CLC                       
                    ADC PocruPufferDispY,X  
                    STA $0301,Y         
                    PHX                       
                    LDA $02                   
                    BNE CODE_0385C6           
                    TXA                       
                    ORA #$04                
                    TAX                       
CODE_0385C6:        LDA $00                   
                    CLC                       
                    ADC PocruPufferDispX,X  
                    STA $0300,Y         
                    LDA PocruPufferGfxProp,X 
                    ORA $64                   
                    STA $0303,Y          
                    PLA                       
                    PHA                       
                    ORA $03                   
                    TAX                       
                    LDA PocruPufferTiles,X  
                    STA $0302,Y          
                    PLX                       
                    INY                       
                    INY                       
                    INY                       
                    INY                       
                    DEX                       
                    BPL CODE_0385B4           
                    PLX                       
                    LDY #$02                
                    LDA #$03                
                    JSL $01B7B3      
                    RTS                       ; Return 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sub Horizontal Position Bank 3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SubHorzPosBnk3:     LDY #$00                
                    LDA $94         
                    SEC                       
                    SBC $E4,X       
                    STA $0F                   
                    LDA $95       
                    SBC $14E0,X     
                    BPL Return03B828          
                    INY                       
Return03B828:       RTS                       ; Return 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sprite Graphics Routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DATA_03B83B:                      db $40,$B0
DATA_03B83D:                      db $01,$FF
DATA_03B83F:                      db $30,$C0,$A0,$80,$A0,$40,$60,$B0
DATA_03B847:                      db $01,$FF,$01,$FF,$01,$00,$01,$FF

SubOffscreen0Bnk3:  STZ $03                     ; / 
                    JSR IsSprOffScreenBnk3      ; \ if sprite is not off screen, return 
                    BEQ RETURNONE               ; / 
                    LDA $5B                     ; \  vertical level 
                    AND #$01                    ;  | 
                    BNE VerticalLevelBnk3       ; / 
                    LDA $D8,X                   ; \ 
                    CLC                         ;  | 
                    ADC #$50                    ;  | if the sprite has gone off the bottom of the level... 
                    LDA $14D4,X                 ;  | 
                    ADC #$00                    ;  | 
                    CMP #$02                    ;  | 
                    BPL OffScrEraseSprBnk3      ; /    ...erase the sprite 
                    LDA $167A,X                 ; \ if "process offscreen" flag is set, return 
                    AND #$04                    ;  | 
                    BNE RETURNONE               ; / 
                    LDA $13      
                    AND #$01                
                    ORA $03                   
                    STA $01                   
                    TAY                       
                    LDA $1A    
                    CLC                       
                    ADC DATA_03B83F,Y       
                    ROL $00                   
                    CMP $E4,X       
                    PHP                       
                    LDA $1B    
                    LSR $00                   
                    ADC DATA_03B847,Y       
                    PLP                       
                    SBC $14E0,X     
                    STA $00                   
                    LSR $01                   
                    BCC CODE_03B8A8           
                    EOR #$80                
                    STA $00        
           
CODE_03B8A8:        LDA $00                   
                    BPL RETURNONE   
       
OffScrEraseSprBnk3: LDA $14C8,X                 ; \ If sprite status < 8, permanently erase sprite 
                    CMP #$08                    ;  | 
                    BCC OffScrKillSprBnk3       ; / 
                    LDY $161A,X                 ; \ Branch if should permanently erase sprite 
                    CPY #$FF                    ;  | 
                    BEQ OffScrKillSprBnk3       ; / 
                    LDA #$00                    ; \ Allow sprite to be reloaded by level loading routine 
                    STA $1938,Y                 ; / 
OffScrKillSprBnk3:  STZ $14C8,X 
            
RETURNONE:          RTS                         ; Return 

VerticalLevelBnk3:  LDA $167A,X                 ; \ If "process offscreen" flag is set, return 
                    AND #$04                    ;  | 
                    BNE RETURNONE               ; / 
                    LDA $13                     ; \ Return every other frame 
                    LSR                         ;  | 
                    BCS RETURNONE               ; / 
                    AND #$01                
                    STA $01                   
                    TAY                       
                    LDA $1C    
                    CLC                       
                    ADC DATA_03B83B,Y       
                    ROL $00                   
                    CMP $D8,X       
                    PHP                       
                    LDA $1D  
                    LSR $00                   
                    ADC DATA_03B83D,Y       
                    PLP                       
                    SBC $14D4,X     
                    STA $00                   
                    LDY $01                   
                    BEQ CODE_03B8F5           
                    EOR #$80                
                    STA $00  
                 
CODE_03B8F5:        LDA $00                   
                    BPL RETURNONE          
                    BMI OffScrEraseSprBnk3 
   
IsSprOffScreenBnk3: LDA $15A0,X                 ; \ If sprite is on screen, A = 0  
                    ORA $186C,X                 ;  | 
                    RTS                         ; / Return 


;=========================================;
;Proximity (horizontal)		          ;
;"A" will have 1 if the sprite is in range;
;Otherwise it's 0			  ;
;=========================================;

;Store the range to check from in 00, then jump to this routine.
;E.g.
;LDA #$12
;STA $00
;JSR Proximity


DirFix: dcb $FF,$00
Proximity:
	LDA $E4,x		;\
	SEC			; |
	SBC $94			; |
	PHA			; |
	JSR SubHorzPosBnk3	; | Check sprite range ..
	PLA			; |
	EOR DirFix,y		; |
	CMP $00			; | ; If Range > !Temp return. 
	BCS poopfarts			; |
	LDA #$01		; | A = #$01.
	RTS			; |
poopfarts:
	LDA #$00		; | A = #$00 if not in range.
	RTS			;/
