!Range = $10 ;Range (duh) !Sprite = $00 ;Green Shelless koopa print "INIT ",pc RTL print "MAIN ",pc PHB PHK PLB JSR Code PLB RTL Code: JSR GFX LDA $14C8,x ;\Dead? CMP #$08 ;| BNE Return ;| LDA $9D ;|Frozen? BNE Return ;/K! Don't do anything. LDA #!Range ;\Check Promixity (aka how player close to sprite) STA $00 ;|dOESN'T WORKS FOR SOME REASON (dam Caps Lock) JSR Proximity ;| BNE Close ;/ RTS Close: LDA #$10 ;\Sound effect STA $1DF9 ;/ JSR DrawSmoke ;>0_o smoke LDA #!Sprite ;\Turn Into another sprite STA $9E,x ;| LDA #$01 ;| STA $14C8,x ;/ JSL $07F7D2 ;Reset sprite tables. Return: RTS !Tile = $C0 ;>Message Box GFX: JSR GetDrawInfo ;>Set various flags for drawing, blah, blah, blah LDA $00 STA $0300,y LDA $01 STA $0301,y LDA #!Tile ;\Tile To Draw STA $0302,y ;/ PHX ;\Palette and "Use Second GFX page" can be changed directly in .cfg (or with CFG editor, doesn't matter) LDX $15E9 ;| LDA $15F6,x ;| PLX ;| ORA $64 ;| STA $0303,y ;/ INY #04 ;>4 tiles LDY #$02 LDA #$00 JSL $01B7B3 RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; GetDrawInfo - Optimized version ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetDrawInfo: LDA $14E0,x XBA LDA $E4,x REP #$20 SEC SBC $1A STA $00 CLC ADC.w #$0040 CMP.w #$0180 SEP #$20 LDA $01 BEQ + LDA #$01 + STA $15A0,x TDC ROL A STA $15C4,x BNE .Invalid LDA $14D4,x XBA LDA $1662,x AND #$20 BEQ .CheckOnce .CheckTwice LDA $D8,x REP #$21 ADC.w #$001C SEC SBC $1C SEP #$20 LDA $14D4,x XBA BEQ .CheckOnce LDA #$02 .CheckOnce STA $186C,x LDA $D8,x REP #$21 ADC.w #$000C SEC SBC $1C SEP #$21 SBC #$0C STA $01 XBA BEQ .OnScreenY INC $186C,x .OnScreenY LDY $15EA,x RTS .Invalid PLA PLA RTS DirFix: db $FF,$00 Proximity: LDA $E4,x ;\ SEC ; | SBC $94 ; | PHA ; | JSR SubHorzPos ; | Check sprite range .. PLA ; | EOR DirFix,y ; | CMP $00 ; | If Range > !Temp return. BCC + ; | If in RANGE.. branch. RTS ;/ + LDA #$01 RTS DrawSmoke: LDY #$03 - LDA $17C0,y BEQ + DEY BPL - RTS + LDA #$01 STA $17C0,y LDA #$1C STA $17CC,y LDA $D8,x STA $17C4,y LDA $E4,x STA $17C8,y RTS SubHorzPos: LDY #$00 ; LDA $14E0,x ; \ XBA ; | LDA $E4,x ; | REP #$20 ; | get subtract sprite's x position by mario's SEC ; | SBC $94 ; | BPL + ; | INY ; increment y if positive + STA $0C ; | SEP #$20 ; / RTS ;