;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ホーミングキラー ; 作者:◆33953YoShI ; マリオを追尾します。 ; 三番煎じ ; ; $C2,x : 進行方向 ; $00 $01 $02 $03 $04 $05 $06 $07 ; 右,右下,下,左下,左,左上,上,右上 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Uses first extra bit: YES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; プロトタイプの制作開始時期: 2008/11/22 ; (確認可能な最古のcfgファイルの最終更新日時) ; 公開時点での更新日時: 2010/07/24 ; PIXI用の変換: 2023/01/13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; !Skip_Frame = $08 ;低ければ低いほど追尾精度が上がる ;$08未満は非推奨 ;$00で追尾しなくなる !Init_Skip_Frame = $18 ;射出直後の追尾精度 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print "INIT ",pc LDA #!Init_Skip_Frame STA !1534,x PHY %SubHorzPos() TYA BEQ Init_R LDA #$04 STA !C2,x Init_R: PLY LDA #$10 STA !1558,x RTL print "MAIN ",pc PHB PHK PLB JSR Main_Code PLB RTL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X_Max: db $20,$20,$00,$E0,$E0,$E0,$00,$20 Y_Max: db $00,$20,$20,$20,$00,$E0,$E0,$E0 Accel_X: db $01,$01,$00,$FF,$FF,$FF,$00,$01 Accel_Y: db $00,$01,$01,$01,$00,$FF,$FF,$FF Brake: db $FC,$04 Return: RTS Main_Code: LDA $9D BNE Gfx_Label LDA !14C8,x CMP #$08 BNE Gfx_Label TDC %SubOffScreen() DEC !1534,x BNE Update_Pos JSR Update_Dir LDA #!Skip_Frame STA !1534,x Update_Pos: LDY !C2,x LDA !B6,x STA $00 STA $03 JSR Speed_Update LDA $03 STA !B6,x LDA !C2,x ORA #$08 TAY LDA !AA,x STA $00 STA $03 JSR Speed_Update LDA $03 STA !AA,x JSL $01801A|!bank JSL $018022|!bank JSL $01A7DC|!bank Gfx_Label: JSR Gfx_Update STA $03 LDA $64 PHA LDA !1558,x BEQ Gfx_Label1 LDA #$10 STA $64 Gfx_Label1: JSR SubGfx PLA STA $64 RTS Killer_Dir: db $01,$03,$07,$05 ;右下,左下,右上,左上 db $05,$07,$03,$01 ;マリオが無敵だった場合使用する Update_Dir: %SubHorzPos() STY $00 %SubVertPos() TYA ASL A ORA $00 LDY $1490|!addr BEQ NoStar ORA #$04 NoStar: TAY LDA Killer_Dir,y CMP !C2,x BEQ Return2 EOR #$07 INC A CLC ADC !C2,x AND #$07 STA $00 EOR #$07 INC A CMP $00 LDA !C2,x BCS Label0 Label2: INC A BRA Label1 Label0: DEC A Label1: AND #$07 STA !C2,x Return2: RTS Gfx_Update: LDA !B6,x ;\ ORA !AA,x ; | X速度,Y速度両方の速度が$00だった場合 BEQ Dir_Return ;/ グラフィック変更処理を行わない LDA !AA,x PHP BPL If_Plus0 EOR #$FF INC A If_Plus0: STA $00 STA $02 LDA !B6,x PHP BPL If_Plus1 EOR #$FF INC A If_Plus1: STA $01 STA $03 BEQ X_Zero ;\ LDA $00 ; | ゼロ除算防止 BEQ Y_Zero ;/ if !SA1 LDA #$01 STA $2250 LDA $01 STA $2252 STZ $2251 LDA $00 STA $2253 STZ $2254 XBA ASL $2306 LDA $2307 ADC #$00 STA $02 LDA $00 STA $2252 STZ $2251 LDA $01 STA $2253 STZ $2254 XBA ASL $2306 LDA $2307 ADC #$00 STA $03 else LDA $01 STA $4205 STZ $4204 LDA $00 STA $4206 NOP XBA ASL $4214 LDA $4215 ADC #$00 STA $02 LDA $00 STA $4205 STZ $4204 LDA $01 STA $4206 NOP XBA ASL $4214 LDA $4215 ADC #$00 STA $03 endif LDA $02 BEQ X_Zero LDA $03 BEQ Y_Zero LDA #$00 PLP BPL If_Plus2 ORA #$01 If_Plus2: PLP BPL If_Plus3 ORA #$02 If_Plus3: TAY LDA Killer_Dir,y Dir_Return: RTS X_Zero: LDA #$02 PLP PLP BPL If_Plus4 ORA #$04 If_Plus4: RTS Y_Zero: LDA #$00 PLP BPL If_Plus5 ORA #$04 If_Plus5: PLP RTS Speed_Update: LDA Accel_X,y STA $02 LDA X_Max,y STA $01 BEQ Label_Zero BPL Label_Inc LDA $00 EOR #$FF INC A STA $00 LDA $01 EOR #$FF INC A STA $01 Label_Inc: LDA $00 CMP $01 BCS Speed_Max LDA $03 CLC ADC $02 STA $03 RTS Speed_Max: LDA X_Max,y STA $03 RTS Label_Zero: LDY #$00 LDA $00 BEQ Return10 BPL If_Plus10 INY If_Plus10: CLC ADC Brake,y ;AND #$FC STA $03 Return10: RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TileMap: db $A6,$A8,$A4,$A8,$A6,$A6,$A4,$A6 TileProp: db $40,$41,$81,$01,$00,$41,$01,$01 Pals: db $02,$08 SubGfx: %GetDrawInfo() PHY LDA $14 LSR A AND #$01 TAY LDA Pals,y STA $04 Gfx_Label0: PLY LDA $00 STA $0300|!addr,y LDA $01 STA $0301|!addr,y PHX LDX $03 LDA TileMap,x STA $0302|!addr,y LDA TileProp,x PLX ORA $04 ORA $64 STA $0303|!addr,y LDY #$02 LDA #$00 JSL $01B7B3|!bank RTS