;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Goal point from SMB1. ;; Made by Romi, modified by Ersanio ;; Version 1.2 ;; ;; Uses first extra bit: YES ;; Setting the extra bit will trigger the secret exit. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; CUSTOMIZABLE SPRITE DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Sound-related defines !GoalMusic = $0C ; Music to play after player is done sliding down the pole. ; Change to 04 if you're using AddmusicK! !GlideSFX = $26 ; Sound effect to play while sliding down the pole. !GlideBank = $1DF9 ; Flagpole flag tiles (SP3/4) Tilemap: db $E0,$E2,$E4,$E2 ; Flagpole flag tile properties (YXPPCCCT) FlagTileProperties: db $2B,$29 ; Format: Normal exit, Secret Exit ; I recommend you not to change the following below (until flag 2) ; 8x8 tilemap of appearing score tiles (left, right) ScoreTile: db $54,$55 ; 5000 db $54,$55 ; 2000 db $47,$45 ; 800 db $46,$45 ; 400 db $44,$45 ; 100 ; YXPPCCCT of appearing score tiles (left, right) ScoreProperty: db $30|$80,$30|$80 ; 5000. 2000 upside-down becomes 5000. I'M A GENIUS db $30,$30 ; 2000 db $30,$30 ; 800 db $30,$30 ; 400 db $30,$30 ; 100 ScoreHorz: db $00,$08 ; Relative xpos of score tiles (left, right) ; Better if you don't touch this and next table ScoreTable: dw $01F4,$00C8,$0050,$0028,$000A ScorePosition: dw $0000,$0010,$0030,$0050,$0078 ; 5000,2000,800,400,100 !TimeToCreateFlag2 = $20 ;\Essential timer values you don't want to mess with !TimeToWalking = $E0 ;/ ;;;;;;;;;;;;;;;;;;;;;;;;; ; Flag 2 ;;;;;;;;;;;;;;;;;;;;;;;;; FlagTilemap: db $C0,$C2,$C4,$C6 ; Appearing castle flag tilemap (SP3/4) !FlagProperties = $0D ; Properties. YXPPCCCT !Flag2HorzPos = $76 ;\Don't touch those Flag2VertPos: db $20,$80 ;/ ;;;;;;;;;;;;;;;;;;;;;;;;; ;; INIT & MAIN ;; ;;;;;;;;;;;;;;;;;;;;;;;;; print "INIT ",pc LDA !E4,x ORA #$08 STA !E4,x RTL print "MAIN ",pc PHB : PHK : PLB LDA !extra_prop_1,x LSR A BCS ScoreSprite BNE ScoreSprite JSR SpriteMain PLB RTL ScoreSprite: LSR A BCS Flag2Sprite JSR ScoreGraphic LDA $9D BNE ScoreReturn LDA !1540,x BEQ ScoreReturn DEC A BNE IncScorePos REP #$20 LDY !C2,x LDA $7FFFFF LDA ScoreTable,y STA $00 LDA $0DB3|!Base2 ASL A ADC $0DB3|!Base2 AND.w #$00FF TAY LDA $0F34|!Base2,y CLC : ADC $00 STA $0F34|!Base2,y SEP #$20 LDA $0F36|!Base2,y ADC #$00 STA $0F36|!Base2,y IncScorePos: LDA !D8,x SEC : SBC #$02 ScoreStoreVPos: STA !D8,x LDA !14D4,x SBC #$00 STA !14D4,x ScoreReturn: PLB RTL Flag2Sprite: JSR Flag2Graphic LDA !1540,x BEQ ScoreReturn LDA !D8,x SEC : SBC #$01 BRA ScoreStoreVPos ;;;;;;;;;;;;;;;;;;;;;;;; ; Sprite Main Routine ;; ;;;;;;;;;;;;;;;;;;;;;;;; SpriteMain: JSL START_SUB JSR SpriteGraphic LDA $1493|!Base2 CMP.b #!TimeToCreateFlag2 BNE NotGenerateFlag2 JSL $02A9DE|!BankB BMI NotGenerateFlag2 LDA #$08 STA !14C8,y PHX LDA !7FAB9E,x TYX STA !7FAB9E,x JSL $07F7D2|!BankB JSL $0187A7|!BankB LDA #$08 STA !7FAB10,x LDA #$02 STA !extra_prop_1,x PLX LDA !E4,x CLC : ADC.b #!Flag2HorzPos STA.w !E4,y LDA !14E0,x ADC #$00 STA !14E0,y PHY LDA !7FAB34,x ;todo TAY LDA !D8,x SEC : SBC Flag2VertPos,y PLY AND #$F0 STA.w !D8,y LDA !14D4,x SBC #$00 STA !14D4,y LDA #$10 STA !1540,y NotGenerateFlag2: LDA !C2,x BNE FallingDown LDA $9D BNE Return LDA !D8,x SEC : SBC #$18 STA $02 LDA !14D4,x SBC #$00 STA $03 REP #$20 LDA $96 SEC : SBC $02 STA $0E SEP #$20 BMI Return LDA !E4,x STA $00 LDA !14E0,x STA $01 REP #$20 LDA $94 SEC : SBC $00 CLC : ADC.w #$0010 CMP.w #$0010 SEP #$20 BCC TouchesGoalPole Return: RTS TouchesGoalPole: REP #$20 LDA $00 SEC : SBC.w #$000E STA $94 SEP #$20 JSR VerticalPosition LDA #$80 STA $1DFB|!Base2 LDA.b #!GlideSFX STA.w !GlideBank|!Base2 INC !C2,x JSL $00FA80|!BankB LDA #$48 STA !1540,x LDA !C2,x FallingDown: DEC A BNE TouchesGround LDA #$0B STA $71 LDA #$28 ;\freeze time when sliding STA $0F30|!Base2 ;/ LDA #$20 STA $13E0|!Base2 STZ $7B STZ $7D LDA #$01 STA $76 STZ $1407|!Base2 STZ $140D|!Base2 LDA $77 AND #$04 BNE DontIncMarioPos REP #$20 INC $96 INC $96 SEP #$20 DontIncMarioPos: LDA !1540,x PHP CMP #$0C BCC DontIncFlagPos LDA !D8,x CLC : ADC #$02 STA !D8,x LDA !14D4,x ADC #$00 STA !14D4,x DontIncFlagPos: PLP BNE Return LDA #$18 STA !1540,x INC !C2,x RTS TouchesGround: DEC A BNE Return LDA !1540,x BNE RidingYoshiPose LDA.b #!TimeToWalking STA $1493|!Base2 LDA.b #!GoalMusic STA $1DFB|!Base2 %BEC(.NotSecret) LDA #$01 STA $141C|!Base2 .NotSecret INC !C2,x STZ $71 RTS RidingYoshiPose: LDA #$20 STA $13E0|!Base2 RTS ;;;;;;;;;;;;;;;;;;;;; ;; SPRITE_GFX ;; ;;;;;;;;;;;;;;;;;;;;; SpriteGraphic: %GetDrawInfo() LDA $00 STA $0300|!Base2,y LDA $01 STA $0301|!Base2,y PHX LDA $14 LSR #3 AND #$03 TAX LDA Tilemap,x STA $0302|!Base2,y PLX LDA !extra_bits,x AND #$04 LSR #2 PHX TAX LDA FlagTileProperties,x STA $0303|!Base2,y PLX LDY #$02 LDA #$00 JSL $01B7B3|!BankB RTS ;;;;;;;;;;;;;;;;;;;;;;;;; ;; V pos and gen Score ;; ;;;;;;;;;;;;;;;;;;;;;;;;; VerticalPosition: REP #$20 LDY #$08 LDA $0E VertPosLoop: CMP ScorePosition,y BCS VertPosLoopEnd DEY DEY BRA VertPosLoop VertPosLoopEnd: STY $03 SEP #$30 JSL $02A9DE|!BankB BMI ScoreGenReturn LDA #$08 STA !14C8,y PHX LDA !7FAB9E,x TYX STA !7FAB9E,x JSL $07F7D2|!BankB JSL $0187A7|!BankB LDA #$88 STA !7FAB10,x LDA #$01 STA !extra_prop_1,x PLX LDA !E4,x CLC : ADC #$08 STA.w !E4,y LDA !14E0,x ADC #$00 STA !14E0,y LDA !D8,x CLC : ADC #$80 STA.w !D8,y LDA !14D4,x ADC #$00 STA !14D4,y LDA #$3E STA !1540,y LDA $03 STA.w !C2|!Base1,y ScoreGenReturn: RTS ;;;;;;;;;;;;;;;;;;;;;;;;; ;; Score Graphic ;; ;;;;;;;;;;;;;;;;;;;;;;;;; ScoreGraphic: %GetDrawInfo() LDA !C2,x STA $03 PHX LDX #$01 ScoreGraphicLoop: PHX LDA $01 STA $0301|!Base2,y LDA $00 CLC : ADC ScoreHorz,x STA $0300|!Base2,y TXA ORA $03 TAX LDA ScoreProperty,x STA $0303|!Base2,y LDA ScoreTile,x STA $0302|!Base2,y PLX INY #4 DEX BPL ScoreGraphicLoop PLX LDY #$00 LDA #$01 GraphicLast: JSL $01B7B3|!BankB RTS ;;;;;;;;;;;;;;;;;;;;;;;;; Flag2Graphic: %GetDrawInfo() LDA $00 STA $0300|!Base2,y LDA $01 STA $0301|!Base2,y PHX LDA $14 LSR #3 AND #$03 TAX LDA FlagTilemap,x STA $0302|!Base2,y PLX LDA.b #!FlagProperties STA $0303|!Base2,y LDA #$00 LDY #$02 BRA GraphicLast START_SUB: STZ $03 PHB LDA #$01 PHA PLB PEA.w $801F JML $01AC33|!BankB