Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Zuma´s Frog
- ; By NaroGugul
- ; Sprite based on the frog from the Zuma game series.
- ; Spits balls to the players direction.
- ; Can be used as just a hazard or as a boss.
- ; Some options (ball frequency, type, speed, number of hits for the boss...) can be set in the defines.
- ; By default uses custom gfx to be inserted in SP3. Remap it to fit your needs.
- ;=======================================================================================================================
- ;=== DEFINES ===========================================================================================================
- ;=======================================================================================================================
- !ExtendedSpriteNumber = $06 ; Extended Sprite number of ZumaFrogEXT.asm in the list.txt
- !CanBeKilled = 2 ; 0 = It cannot be killed;
- ; 1 = Can be killed by thrown stuff;
- ; 2 = its a Boss.. same as 1, but will end the level when killed;
- ; 3 = its a Boss, but will trigger the secret exit.
- !NumberOfHits = 3 ; Number of hits for it to be killed.
- !WhatItSpawns = 3 ; 0 - Only the custom balls (Can be stumped and used like shells);
- ; 1 - Alternate between custom balls and custom extended sprite;
- ; 2 - Alternate between custom balls and custom extended sprite randomly;
- ; 3 - Only custom extended sprite (Cannot be stomped. Hurts Mario on touch).
- !BallSpeed = 30 ; Speed of the Ball.
- !InitialShotFrequency = 40 ; Number of frames between each shot.
- !FrequencyDecrement = 5 ; How much faster it will shoot between each phase.
- !Phase = $1510
- !NextBallColor = $1504
- !FacingDirection = $157C
- !ShotFrequencyRam = $151C
- !Timer = $1540
- !CurrentFrequency = $1534
- !WhichBall = $1594
- ;=======================================================================================================================
- ;=== INIT/MAIN =========================================================================================================
- ;=======================================================================================================================
- print "INIT ",pc
- PHB : PHK : PLB
- LDA $7FAB10,x
- AND #$04 ; extra bit set
- BNE +++
- STZ !WhichBall,x
- LDA #!WhatItSpawns : CMP #$03 : BNE + : LDA #$01 : STA !WhichBall,x
- +
- LDA #$06 : STA !NextBallColor,x
- LDA #!InitialShotFrequency : STA !Timer,x : STA !CurrentFrequency,x
- LDA #!NumberOfHits : STA !Phase,x : DEC !Phase,x
- if !CanBeKilled >= 2
- LDA $167A,x : ORA #$04 : STA $167A,x
- endif
- PLB
- RTL
- +++
- STZ $1656,x
- STZ $1662,x
- LDA #$01 : STA !Phase,x
- PLB
- RTL
- print "MAIN ",pc
- PHB : PHK : PLB
- LDA $7FAB10,x
- AND #$04 ; extra bit set
- BNE +
- JSR MAINCODE
- PLB
- RTL
- +
- JSR BALLCODE
- PLB
- RTL
- MAINCODE:
- JSR GRAPHICS
- LDA #$00
- %SubOffScreen()
- JSR FACINGDIRECTION
- LDA !Timer,x : BNE +
- JSR SPAWNBALL
- +
- JSR MARIOINTERACTION
- if !CanBeKilled != 0
- JSR THROWNSPRITESKILL
- endif
- RTS
- BALLCODE:
- JSR GRAPHICSBALL
- LDA #$00
- %SubOffScreen()
- LDA !Phase,x : BEQ +
- JSR BALLBEHAVIOR
- +
- RTS
- ;=======================================================================================================================
- ;=== BEHAVIOR ==========================================================================================================
- ;=======================================================================================================================
- FACINGDIRECTION:
- LDA $E4,x : STA $0E
- LDA $14E0,x : STA $0F
- LDA $D8,x : STA $0C
- LDA $14D4,x : STA $0D
- REP #$20
- LDA $0E : CLC : ADC #$0008 : SEC : SBC $94 : STA $00
- LDA $0C : CLC : ADC #$0010 : SEC : SBC $98 : STA $02
- SEP #$20
- LDA #$7F
- %Aiming()
- LDA $02 : BPL Down
- Up:
- CMP #$90 : BCC UpUp
- CMP #$C8 : BCS LLorRR
- BRA ULorUR
- Down:
- CMP #$70 : BCS DownDown
- CMP #$38 : BCC LLorRR
- BRA DLorDR
- UpUp:
- LDA #$00 : STA !FacingDirection,x : BRA EndDirection
- DownDown:
- LDA #$04 : STA !FacingDirection,x : BRA EndDirection
- LLorRR:
- LDA $00 : BMI LeftLeft
- RightRight:
- LDA #$02 : STA !FacingDirection,x : BRA EndDirection
- LeftLeft:
- LDA #$06 : STA !FacingDirection,x : BRA EndDirection
- ULorUR:
- LDA $00 : BMI UpLeft
- UpRight:
- LDA #$01 : STA !FacingDirection,x : BRA EndDirection
- UpLeft:
- LDA #$07 : STA !FacingDirection,x : BRA EndDirection
- DLorDR:
- LDA $00 : BMI DownLeft
- DownRight:
- LDA #$03 : STA !FacingDirection,x : BRA EndDirection
- DownLeft:
- LDA #$05 : STA !FacingDirection,x : BRA EndDirection
- EndDirection:
- RTS
- MARIOINTERACTION:
- JSL $01A7DC
- BCC +
- LDA #$05 : STA $154C,x
- %SubVertPos()
- LDA $0F
- CMP #$EB
- BCS ++
- LDA $7D
- BMI ++
- JSL $01AA33 ; set Mario speed
- JSL $01AB99 ; display contact graphic
- BRA +
- ++
- JSL $00F606
- +
- RTS
- BallsArray: db $04,$06,$08,$0A
- BallOffsetX: db $08,$10,$10,$10,$08,$00,$00,$00
- BallOffsetY: db $00,$00,$08,$10,$10,$10,$08,$00
- SPAWNBALL:
- LDA $E4,x : STA $0E
- LDA $14E0,x : STA $0F
- LDA $D8,x : STA $0C
- LDA $14D4,x : STA $0D
- REP #$20
- LDA $0E : CLC : ADC #$0010 : SEC : SBC $94 : STA $00
- LDA $0C : CLC : ADC #$0010 : SEC : SBC $98 : STA $02
- SEP #$20
- LDA #!BallSpeed
- %Aiming()
- LDA $02 : STA $03
- LDA $00 : STA $02
- STZ $00
- STZ $01
- LDA !FacingDirection,x : TAX
- LDA BallOffsetX,x : STA $00
- LDA BallOffsetY,x : STA $01
- LDX $15E9
- LDA !WhichBall,x : BEQ CustomSprite
- ExtendedSprite:
- LDA #!ExtendedSpriteNumber+!ExtendedOffset
- %SpawnExtended()
- BRA DidItSpawn
- CustomSprite:
- LDA $7FAB9E,x
- SEC
- %SpawnSprite()
- DidItSpawn:
- BCS +
- LDA !WhichBall,x : BEQ CustomSpriteSet
- ExtendedSpriteSet:
- LDX $15E9 : LDA !NextBallColor,x : STA $1765,y
- LDA #$07 : STA $176F,y
- BRA FinishSpawn
- CustomSpriteSet:
- TYX
- LDA #$8C : STA $7FAB10,x
- LDX $15E9 : LDA !NextBallColor,x : STA !NextBallColor,y
- FinishSpawn:
- LDA #$09 ; \ Play the "bullet bill shoot" sound effect.
- STA $1DFC ; /
- JSL $01ACF9 : LDA $148D : AND #$03
- TAX : LDA BallsArray,x
- LDX $15E9 : STA !NextBallColor,x
- LDA !CurrentFrequency,x : STA !Timer,x
- LDA #!WhatItSpawns : BNE ++ : STZ !WhichBall,x : BRA +
- ++ CMP #$01 : BNE ++ : LDA !WhichBall,x : EOR #$01 : STA !WhichBall,x : BRA +
- ++ CMP #$02 : BNE ++ : JSL $01ACF9 : LDA $148D : AND #$01 : STA !WhichBall,x : BRA +
- ++ LDA #$01 : STA !WhichBall,x
- +
- RTS
- if !CanBeKilled != 0
- THROWNSPRITESKILL:
- ; Most of this routine was borrowed from the Big Boo Boss by Davros ;)
- SPRITE_INTERACT: LDY #!SprSize-1 ;
- LOOP: LDA !14C8,y ; \ if the sprite status is..
- CMP #$09 ; | ...shell-like
- BEQ PRE_PROCESS_SPRITE ; /
- CMP #$0A ; \ ...throwned shell-like
- BEQ PROCESS_SPRITE ; /
- NEXT_SPRITE: DEY ;
- BPL LOOP ; ...otherwise, loop
- RTS ; return
- PRE_PROCESS_SPRITE:
- LDA $AA,y : BEQ NEXT_SPRITE
- PROCESS_SPRITE: PHX ; push x
- TYX ; transfer x to y
- JSL $03B6E5|!BankB ; get sprite clipping B routine
- PLX ; pull x
- JSL $03B69F|!BankB ; get sprite clipping A routine
- JSL $03B72B|!BankB ; check for contact routine
- BCC NEXT_SPRITE ;
- KILL_BALLS:
- LDA $7FAB9E,x : STA $0F
- PHX ;Push the X register
- LDX #$00 ;innitiate the counter
- loop:
- LDA $7FAB9E,x ;Load the sprite numbers of all the sprites on screen (one at a time)
- CMP $0F ;\If it's not the one you specified, don't kill it
- BNE notkill ;/
- LDA $7FAB10,x
- AND #$04 ; extra bit set
- BEQ +
- LDA #$04 ;\ Make the sprite dissapear in a puff of smoke
- STA $14C8,x ;/
- LDA #$08
- STA $1DF9
- LDA #$1F
- STA $1540,x
- +
- notkill:
- INX ;Move on to the next slot
- CPX #$0C ;\If they haven't all been checked, go back to the beginning
- BCC loop ;/
- PLX ;Pull the X register from the stack
- CONTINUE:
- PHX ; push x
- TYX ; transfer x to y
- LDA #$04 : STA !14C8,x ; destroy the sprite
- LDA #$08 : STA $1DF9
- LDA #$1F : STA $1540,x
- PLX ; pull x
- LDA !Phase,x : BNE +
- LDA #$04 : STA $14C8,x
- LDA #$08 : STA $1DF9
- LDA #$1F : STA $1540,x
- if !CanBeKilled >= 2
- if !CanBeKilled == 3
- INC $1DEA
- endif
- DEC $13C6|!Base2 ; prevent Mario from walking at the level end
- LDA #$FF ; \ set goal
- STA $1493|!Base2 ; /
- LDA #$0B ; \ set ending music
- STA $1DFB|!Base2 ; /
- RTS
- endif
- RTS
- +
- LDA $1534,x : STA $0F
- LDA !CurrentFrequency,x : SEC : SBC #!FrequencyDecrement : STA !CurrentFrequency,x : STA !Timer,x
- DEC !Phase,x
- LDA #$10 : STA $1DF9 ; Play the "magikoopa shoot magic" sound effect.
- LDX $15E9
- RTS
- endif
- ;=======================================================================================================================
- ;=== BALL ==============================================================================================================
- ;=======================================================================================================================
- BALLBEHAVIOR:
- JSL $01801A ; Updates the sprite Y position
- JSL $018022 ; Updates the sprite X position
- LDA $1490 : BNE Return
- LDA !Phase,x : BEQ Return
- JSL $01A7DC
- BCC Return
- LDA #$05 : STA $154C,x
- %SubVertPos()
- LDA $0F
- CMP #$EB
- BCS ++
- LDA $7D
- BMI ++
- LDA $140D : BEQ +++
- JSL $01AA33 ; set Mario speed
- JSL $01AB99 ; display contact graphic
- LDA #$04 : STA !14C8,x ; destroy the sprite
- LDA #$08 : STA $1DF9
- LDA #$1F : STA $1540,x
- BRA Return
- +++
- JSL $01AA33 ; set Mario speed
- JSL $01AB99 ; display contact graphic
- STZ !Phase,x
- STZ $AA,x : STZ $B6,x
- LDA #$04 : STA $9E,x
- LDA #$09 : STA $14C8,x
- LDA #$10 : STA $1656,x
- LDA #$00 : STA $1662,x
- LDA #$0A : STA $166E,x
- LDA #$21 : STA $167A,x
- LDA #$00 : STA $1686,x
- LDA #$0A : STA $190F,x
- LDA #$02 : STA $1DF9
- BRA Return
- ++
- JSL $00F606
- Return:
- RTS
- ;=======================================================================================================================
- ;=== GRAPHICS ==========================================================================================================
- ;=======================================================================================================================
- Tiles: db $24,$20,$08,$00,$04,$02,$06,$22 ; Up Left Tile ; U,UR,R,DR,D,DL,L,UL
- db $24,$22,$06,$02,$04,$00,$08,$20 ; Up Right Tile ;
- db $04,$00,$08,$20,$24,$22,$06,$02 ; Down Left Tile ;
- db $04,$02,$06,$22,$24,$20,$08,$00 ; Down Right Tile ;
- TilesFlipX: db $00,$00,$40,$00,$00,$40,$00,$40
- db $40,$00,$40,$00,$40,$40,$00,$40
- db $00,$00,$40,$00,$00,$40,$00,$40
- db $40,$00,$40,$00,$40,$40,$00,$40
- TilesFlipY: db $80,$80,$00,$00,$00,$00,$00,$80
- db $80,$80,$00,$00,$00,$00,$00,$80
- db $80,$80,$80,$00,$00,$00,$80,$80
- db $80,$80,$80,$00,$00,$00,$80,$80
- TilesOffsetX: db $00,$00,$00,$00,$00,$00,$00,$00
- db $10,$10,$10,$10,$10,$10,$10,$10
- db $00,$00,$00,$00,$00,$00,$00,$00
- db $10,$10,$10,$10,$10,$10,$10,$10
- TilesOffsetY: db $00,$00,$00,$00,$00,$00,$00,$00
- db $00,$00,$00,$00,$00,$00,$00,$00
- db $10,$10,$10,$10,$10,$10,$10,$10
- db $10,$10,$10,$10,$10,$10,$10,$10
- !NextBallTile = $26
- NextBallOffsetX: db $0C,$06,$05,$06,$0C,$12,$13,$12
- NextBallOffsetY: db $13,$12,$0C,$06,$05,$06,$0C,$12
- GRAPHICS:
- LDA !Phase,x : STA $09
- LDA $15F6,x : STA $0F
- %GetDrawInfo()
- ;MAIN TILES
- TYA
- STA $0A
- LSR #2
- STA $0B
- STZ $0E
- LDX #$04
- Loop:
- PHX
- LDY $0A
- LDX $15E9 : LDA !FacingDirection,x : CLC : ADC $0E : TAX
- LDA $00 : CLC : ADC TilesOffsetX,x
- STA $0300,y ; X position
- LDA $01 : CLC : ADC TilesOffsetY,x
- STA $0301,y ; Y position
- LDA Tiles,x
- STA $0302,y ; Tile number
- LDA $09 : BNE +
- LDA #$09 : BRA ++
- + LDA $0F
- ++
- ORA $64 : ORA TilesFlipX,x : ORA TilesFlipY,x
- STA $0303,y ; Properties
- LDA $0E : CLC : ADC #$08 : STA $0E
- INY #4 : STY $0A
- LDY $0B
- LDA #$02
- STA $0460,y
- INC $0B
- PLX
- DEX
- CPX #$00 : BNE Loop
- ;NEXT BALL TILE
- LDY $0A
- LDX $15E9 : LDA !FacingDirection,x : TAX
- LDA $00 : CLC : ADC NextBallOffsetX,x
- STA $0300,y
- LDA $01 : CLC : ADC NextBallOffsetY,x
- STA $0301,y
- LDA #!NextBallTile
- STA $0302,y
- LDX $15E9
- LDA !NextBallColor,x : ORA #$01
- STA $0303,y
- LDY $0B
- LDA #$00
- STA $0460,y
- LDA #$04 ; Tile to draw - 1
- LDX $15E9
- LDY #$FF
- JSL $01B7B3
- RTS
- !BallTile = $27
- GRAPHICSBALL:
- LDX $15E9
- %GetDrawInfo()
- LDA #$F0
- STA $0309,y ; hide garbage tiles
- LDA $00
- STA $0300,y ; X position
- LDA $01
- STA $0301,y ; Y position
- LDA #!BallTile
- STA $0302,y ; Tile number
- LDA #$01 : ORA $64 : ORA !NextBallColor,x
- STA $0303,y ; Properties
- LDA #$00 ; Tile to draw - 1
- LDY #$02 ; 16x16 sprite
- JSL $01B7B3
- RTS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement