Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Foliage the Para-Plant
- ;; For Morton's Empire
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- !RAM_SprClipXDisp = $7FABAA ; 12 bytes of free RAM used for the X displacement of a custom sprite clipping field
- !RAM_SprClipYDisp = $7FABB6 ; 12 bytes of free RAM used for the Y displacement of a custom sprite clipping field
- !RAM_SprClipWidth = $7FABC2 ; 12 bytes of free RAM used for the width of a custom sprite clipping field
- !RAM_SprClipHeight = $7FABCE ; 12 bytes of free RAM used for the height of a custom sprite clipping field
- ;;; INIT Routine wrapper
- print "INIT ",pc
- LDA #$FF ; |
- STA $15AC,x ;/
- LDA #$02
- STA $1528,x ;/
- STZ $18BB
- STZ $18B4
- STZ $151C,x
- LDA #$00
- STA !RAM_SprClipXDisp,x
- LDA #$00
- STA !RAM_SprClipYDisp,x
- LDA #32
- STA !RAM_SprClipWidth,x
- LDA #48
- STA !RAM_SprClipHeight,x
- RTL
- ;;; Main Routine wrapper
- print "MAIN ",pc
- PHB
- PHK
- PLB
- JSR MainRt
- PLB
- RTL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;Main routine
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- MainRt:
- JSR SubGFX
- LDA $1528,x
- CMP #$04
- BNE .Normal
- LDY $1594,x
- LDA .DeadYSpd,y
- STA $AA,x
- JSL $01802A
- LDA $14D4,x
- BEQ .Return
- LDA $D8,x
- CMP #$21
- BCS .Return
- LDA $15AC,x
- BNE +
- LDA #$35
- STA $15AC,x
- +
- LDA #$01
- STA $1594,x
- LDA #$23
- STA $1DF9
- LDA $15AC,x
- CMP #$04
- BCS .Return
- JSR KillSprites
- LDA #$01
- STA $18B4
- LDA #$02
- STA $1594,x
- LDA #$80
- STA $1DFB
- LDA #$FF
- STA $1493 ; activate "end level" flag
- LDA #$00
- STA $141C ; normal path
- LDA #$0B
- STA $71
- .Return
- RTS
- .DeadYSpd
- db $F0,$00,$40
- .Normal
- LDA $14C8,x ;\ Return if status ain't normal
- CMP #$08 ; |
- BNE .Return ;/
- LDA $9D ;\ If sprites locked, return
- BNE .Return ;/
- JSL $01A7DC
- BCC .NoInteraction
- LDA $7D
- BMI +
- LDA $140D
- ORA $187A
- BNE .SpinJump
- +
- JSL $00F5B7
- BRA .NoInteraction
- .SpinJump
- LDA #$02
- STA $1DF9
- JSL $01AA33
- JSL $01AB99
- .NoInteraction
- LDA $C2,x ; Set pointers
- ASL
- TAX
- JMP (pointers,x)
- pointers:
- dw Init
- dw SetXPos
- dw Fireballs
- dw Bombs
- dw FireAttack
- dw Hit
- YSpeed:
- db $FA,$EC
- FastY:
- db $F0,$DC
- ;===================================================
- ; State 0: Facing Mario
- Init:
- ;===================================================
- LDX $15E9
- LDA $15AC,x
- BEQ .IncreaseState
- STZ $76
- STZ $7B
- STZ $7D
- LDA #$B5
- STA $13E0
- LDY $1594,x
- LDA YSpeed,y
- STA $AA,x
- JSL $01802A
- LDA $15AC,x
- CMP #$7F
- BCS +
- LDA #$01
- STA $1594,x
- +
- BRA .Return
- .IncreaseState
- LDA #$04
- STA $1DF9
- INC $C2,x
- .Return
- RTS
- ;===================================================
- ; State 1: Sets the X positions, choose an attack
- SetXPos:
- ;===================================================
- LDX $15E9
- STZ $1594,x
- LDA $1528,x
- CMP #$02
- BCC .NormalTimers
- LDA #$A5
- STA $15AC,x
- LDA #$2F
- STA $154C,x
- BRA +
- .NormalTimers
- LDA #$D5
- STA $15AC,x
- LDA #$45
- STA $154C,x
- +
- LDA #$02
- JSR Random
- TAY
- LDA .XPos,y
- STA $E4,x
- LDA #$01
- STA $14D4,x
- LDA #$80
- STA $D8,x
- LDA $1528,x
- CMP #$02
- BCC .NotAngry
- LDA #$02
- BRA +
- .NotAngry
- LDA #$01
- + JSR Random
- TAY
- LDA .Attacks,y
- CMP #$04
- BNE .SetAttack
- LDA #$70
- STA $E4,x
- LDA #$D0
- STA $D8,x
- STZ $14D4,x
- LDA #$04
- .SetAttack
- STA $C2,x
- RTS
- .Attacks
- db $02,$03,$04
- .XPos
- db $30,$70,$B0
- ;===================================================
- ; State 2: Actual attacks
- Fireballs:
- Bombs:
- ;===================================================
- LDX $15E9
- LDA $15AC,x
- BEQ .SetState
- LDY $1594,x
- LDA $1528,x
- CMP #$02
- BCC .NormalSpeed
- LDA FastY,y
- BRA +
- .NormalSpeed
- LDA YSpeed,y
- + STA $AA,x
- JSL $01802A
- LDA $15AC,x
- CMP #$7F
- BCS +
- LDA #$01
- STA $1594,x
- +
- LDA $1564,x
- BNE .Immunity
- JSR BobOmb
- .Immunity
- LDA $C2,x
- CMP #$02
- BEQ .SpitFire
- LDA $154C,x
- BNE .Return
- LDY $18BB
- LDA .Sprite,y
- JSR Spawn
- BRA .Return
- .Sprite
- db $14,$40
- .SpitFire
- LDA $154C,x
- BNE .Return
- LDA #$10
- JSR SpitFire
- LDA #$F0
- JSR SpitFire
- BRA .Return
- .SetState
- LDA #$04
- STA $1DF9
- LDA #$01
- STA $C2,x
- .Return
- RTS
- ;=======================================================
- ; Part of State 2 (Only executes when hit twice or more)
- FireAttack:
- ;=======================================================
- LDX $15E9
- LDA $15AC,x
- BEQ .SetState
- LDY $1594,x
- LDA .DownY,y
- STA $AA,x
- JSL $01802A
- LDA $15AC,x
- CMP #$7F
- BCS +
- LDA #$01
- STA $1594,x
- +
- LDA $1564,x
- BNE .Immunity
- JSR BobOmb
- .Immunity
- LDA $154C,x
- BNE .Return
- JSR FireSpawn
- BRA .Return
- .SetState
- LDA #$01
- STA $C2,x
- LDA #$04
- STA $1DF9
- .Return
- RTS
- .DownY
- db $10,$24
- ;===================================================
- ; State 3: Hit
- Hit:
- ;===================================================
- LDX $15E9
- LDA $14D4,x
- BNE +
- LDA $D8,x
- CMP #$C1
- BCC .Done
- + LDY $1594,x
- LDA .YSpeed,y
- STA $AA,x
- JSL $01802A
- LDA $15AC,x
- CMP #$40
- BCS .Return
- LDA #$01
- STA $1594,x
- BRA .Return
- .Done
- LDA #$04
- STA $1DF9
- LDA #$01
- STA $C2,x
- .Return
- RTS
- .YSpeed
- db $00,$E9
- ;==================================================================
- ; Spit Fireball Subroutine
- ;==================================================================
- SpitFire:
- XBA
- LDA $1528,x
- CMP #$02
- BCC .NormalTimer
- LDA #$35
- STA $154C,x
- BRA +
- .NormalTimer
- LDA #$50 ;\ Set a timer
- STA $154C,x ;/
- +
- LDA #$06
- STA $1DFC
- LDY #$07 ; 8 extended sprite indexes to loop through
- .Loop
- LDA $170B,y ; check this slot
- BEQ .Spawn ; if the slot is free, we can use it for a fireball
- DEY ; if not, decrement the index
- BPL .Loop ; and try again
- RTS
- .Spawn
- LDA $1528,x
- CMP #$02
- BCC .NormalFire
- LDA #$04 ; extended sprite number = 0B
- BRA +
- .NormalFire
- LDA #$0B ; extended sprite number = 0B
- + STA $170B,y ; piranha fireball
- LDA $E4,x ; sprite X position
- CLC
- ADC #8
- STA $171F,y
- LDA $14E0,x
- STA $1733,y
- LDA $D8,x
- STA $1715,y ; same Y position as the plant
- LDA $14D4,x
- STA $1729,y
- LDA #$D0 ; extended sprite Y speed = D0
- STA $173D,y
- XBA
- STA $1747,y
- RTS
- ;============;
- ;RNG by 1024
- ;============;
- Random:
- PHX
- PHP
- SEP #$30
- PHA
- JSL $01ACF9
- PLX
- CPX #$FF
- BNE NORMALRT
- LDA $148D
- BRA ENDRANDOM
- NORMALRT:
- INX
- LDA $148D
- STA $4202
- STX $4203
- NOP #4
- LDA $4217
- ENDRANDOM:
- PLP
- PLX
- RTS
- ;============================
- FireSpawn:
- ;============================
- LDA #$C0
- STA $154C,x
- LDA #$06
- STA $1DFC
- LDA $186C,x
- BNE EndSpawn
- JSL $02A9DE
- BMI EndSpawn
- LDA #$01 ; Sprite state ($14C8,x).
- STA $14C8,y
- PHX
- TYX
- LDA #$6A ; This the sprite number to spawn.
- STA $7FAB9E,x
- PLX
- LDA $E4,x
- CLC
- ADC #8
- STA $00E4,y
- LDA $14E0,x
- STA $14E0,y
- LDA $D8,x
- CLC
- ADC #24
- STA $00D8,y
- LDA $14D4,x
- STA $14D4,y
- PHX
- TYX
- JSL $07F7D2
- JSL $0187A7
- LDA #$08
- STA $7FAB10,x
- PLX
- EndSpawn:
- RTS
- ;============================
- KillSprites:
- ;============================
- LDY #$09 ; setup loop
- - LDA $14C8,y ;\ if sprite non-existent,
- BEQ ++ ;/ branch
- LDA.w $9E,y ;
- CMP #$A9 ;\ if sprite is Reznor,
- BEQ ++ ;/ branch
- CMP #$29 ;\ if sprite is Koopa Kid,
- BEQ ++ ;/ branch
- CMP #$A0 ;\ if sprite is Bowser,
- BEQ ++ ;/ branch
- CMP #$C5 ;\ if sprite is Big Boo Boss,
- BEQ ++ ;/ branch
- LDA $7FAB9E,x ;\ if custom sprite is same number as this one (i.e. one of the dummies),
- PHX ; |
- TYX ; |
- CMP $7FAB9E,x ; |
- BEQ + ;/ branch
- LDA #$04 ;\ set sprite status (killed by spinjump)
- STA $14C8,y ;/
- LDA #$1F ;\ set time to show smoke cloud
- STA $1540,y ;/
- + PLX
- ++ DEY ; decrease sprite index
- BPL - ; if still sprites left to check, branch
- RTS ; return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Spawn Sprite
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SprXPos: db $10,$D0
- Spawn:
- XBA
- LDA #$C0
- STA $154C,x
- ;Spawn a normal sprite.
- ;Replace !SpriteNumber with the number of the sprite.
- LDA $186C,x
- BNE .EndSpawn
- JSL $02A9DE
- BMI .EndSpawn
- LDA #$01
- STA $14C8,y
- XBA
- STA $009E,y
- LDA #$01
- JSR Random
- TAX
- LDA SprXPos,x
- STA $00E4,y
- LDA $14E0,x
- STA $14E0,y
- LDA #$00
- STA $00D8,y
- LDA #$01
- STA $14D4,y
- PHX
- TYX
- JSL $07F7D2
- PLX
- LDA $18BB
- BNE +
- INC $18BB
- .EndSpawn
- RTS
- + DEC $18BB
- BRA .EndSpawn
- ;==========================
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Be killed by bob-ombs
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- BobOmb:
- LDY #$09 ; \ Loop over sprites:
- --
- LDA $1534,y ; \ Bomb-omb is exploding!
- BNE .HandleExplode ; /
- -
- DEY ; |
- BPL -- ; /
- .ReturnBob
- RTS ; Return
- .HandleExplode
- LDA $00E4,Y ; \
- SEC ; | This is all mikey's code...
- SBC #$1A ; |
- STA $00 ; |
- LDA $14E0,Y ; | ...I don't know what it does...
- SBC #$00 ; |
- STA $08 ; |
- LDA #$44 ; | ...lols...
- STA $02 ; |
- LDA $00D8,Y ; |
- STA $01 ; | ...but it seems to detect item proximity...
- LDA $14D4,Y ; |
- STA $09 ; |
- LDA #$10 ; | ...so I'm using it for the bob-omb check.
- STA $03 ; |
- JSL $03B69F ; |
- JSL $03B72B ; /
- BCC - ; If not close to bomb, go back to main loop
- LDA $14C8,y ; \
- CMP #$08 ; | If the bob-omb is dead, don't count it (this is important!!)
- BNE .ReturnBob ; /
- LDA #$A0 ; \ Grant brief immunity to bombs
- STA $1564,x ; /
- INC $1528,x ; Increase hit counter
- LDA #$6F
- STA $15AC,x
- LDA #$28 ; \ Play hit sound
- STA $1DFC ; /
- STZ $1594,x
- LDA #$05
- STA $C2,x
- RTS
- ;====================================================
- ;================Graphics Routine====================
- ;====================================================
- SubGFX:
- JSR GetDrawInfo
- LDA $14
- LSR #3
- AND #$01
- ASL #3
- STA $03
- PHX
- LDX #$05
- .Loop
- PHX
- TXA
- ORA $03
- TAX
- LDA $00
- CLC
- ADC .XDisp,x
- STA $0300,y
- LDA $01
- CLC
- ADC .YDisp,x
- STA $0301,y
- PHX
- LDX $15E9
- LDA $C2,x
- CMP #$04
- BEQ .FlipTilemap
- LDA $18B4
- BNE .FlipTilemap
- PLX
- LDA .Tilemap,x
- BRA +
- .FlipTilemap
- PLX
- LDA .FlippedTilemap,x
- + STA $0302,y
- PHX
- LDX $15E9
- LDA $C2,x
- CMP #$04
- BEQ .FlipProps
- LDA $18B4
- BNE .FlipProps
- LDA $C2,x
- CMP #$05
- BNE .NormalProps
- PLX
- LDA .HitProps,x
- BRA +
- .FlipProps
- PLX
- LDA .FlippedProps,x
- BRA +
- .NormalProps
- PLX
- LDA .Props,x
- + STA $0303,y
- INY #4
- PLX
- DEX
- BPL .Loop
- PLX
- LDY #$02
- LDA #$05
- JSL $01B7B3
- RTS
- .Tilemap
- db $C0,$E0,$A0,$EE,$88,$8A,$00,$00
- db $C4,$86,$A4,$A6,$8C,$8E,$00,$00
- .FlippedTilemap
- db $88,$8A,$A0,$EE,$C0,$E0,$00,$00
- db $8C,$8E,$A4,$A6,$C4,$86,$00,$00
- .XDisp
- db $00,$10,$00,$10,$00,$10,$00,$00
- db $00,$10,$00,$10,$00,$10,$00,$00
- .YDisp
- db $00,$00,$10,$10,$20,$20,$00,$00
- db $00,$00,$10,$10,$20,$20,$00,$00
- .FlippedProps
- db $AB,$AB,$A9,$A9,$A9,$A9,$00,$00
- db $AB,$AB,$A9,$A9,$A9,$A9,$00,$00
- .Props
- db $29,$29,$29,$29,$2B,$2B,$00,$00
- db $29,$29,$29,$29,$2B,$2B,$00,$00
- .HitProps
- db $25,$25,$25,$25,$2B,$2B,$00,$00
- db $25,$25,$25,$25,$2B,$2B,$00,$00
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; GET_DRAW_INFO
- ; This is a helper for the graphics routine. It sets off screen flags, and sets up
- ; variables. It will return with the following:
- ;
- ; Y = index to sprite OAM ($300)
- ; $00 = sprite x position relative to screen boarder
- ; $01 = sprite y position relative to screen boarder
- ;
- ; It is adapted from the subroutine at $03B760
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPR_T1: db $0C,$1C
- SPR_T2: db $01,$02
- GetDrawInfo:
- STZ $186C,x ; reset sprite offscreen flag, vertical
- STZ $15A0,x ; reset sprite offscreen flag, horizontal
- LDA $E4,x ; \
- CMP $1A ; | set horizontal offscreen if necessary
- LDA $14E0,x ; |
- SBC $1B ; |
- BEQ .ON_SCREEN_X ; |
- INC $15A0,x ; /
- .ON_SCREEN_X
- LDA $14E0,x ; \
- XBA ; |
- LDA $E4,x ; |
- REP #$20 ; |
- SEC ; |
- SBC $1A ; | mark sprite invalid if far enough off screen
- CLC ; |
- ADC.w #$0040 ; |
- CMP.w #$0180 ; |
- SEP #$20 ; |
- ROL A ; |
- AND #$01 ; |
- STA $15C4,x ; /
- BNE .INVALID ;
- LDY #$00 ; \ set up loop:
- LDA $1662,x ; |
- AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
- BEQ .ON_SCREEN_LOOP ; | else, go through loop once
- INY ; /
- .ON_SCREEN_LOOP
- LDA $D8,x ; \
- CLC ; | set vertical offscreen if necessary
- ADC SPR_T1,y ; |
- PHP ; |
- CMP $1C ; | (vert screen boundry)
- ROL $00 ; |
- PLP ; |
- LDA $14D4,x ; |
- ADC #$00 ; |
- LSR $00 ; |
- SBC $1D ; |
- BEQ .ON_SCREEN_Y ; |
- LDA $186C,x ; | (vert offscreen)
- ORA SPR_T2,y ; |
- STA $186C,x ; |
- .ON_SCREEN_Y
- DEY ; |
- BPL .ON_SCREEN_LOOP ; /
- LDY $15EA,x ; get offset to sprite OAM
- LDA $E4,x ; \
- SEC ; |
- SBC $1A ; | $00 = sprite x position relative to screen boarder
- STA $00 ; /
- LDA $D8,x ; \
- SEC ; |
- SBC $1C ; | $01 = sprite y position relative to screen boarder
- STA $01 ; /
- RTS ; return
- .INVALID
- PLA ; \ return from *main gfx routine* subroutine...
- PLA ; | ...(not just this subroutine)
- RTS ; /
Add Comment
Please, Sign In to add comment