yandagui 发表于 2023-5-25 15:25:34

[FC][魂斗罗][J][追踪弹][V1.1]

[魂斗罗][追踪弹]

时间:2023.04.30
作者:FlameCyclone
内容:
1. 所有子弹追踪敌人
2. 选择键切换武器
3. 优化选关按键组合, 从标题开始游戏后按住选择键不放进入选关界面

flamecyclone.ys168.com
http://2006.emu618.org:6180/data/attachment/album/202305/25/152414umfzmmx0xwnydfff.gif
Bullet_State          = $0438 ;子弹状态 0:不存在 1:存在 2:销毁
Bullet_Type         = $0388 ;子弹类型 0: 无 1:普通 2:M 3:F 4:S 5:L
Bullet_Icon         = $0368 ;子弹Icon 普通:1E M:1F F:22 S:1F-21 L:24(横向)23(纵向)25(右下)

;Bullet_Icon         = $0368 ;子弹Icon 普通:1E M:1F F:22 S:1F-21 L:23(纵向)24(横向)25(右下)
Bullet_Direction      = $0378 ;L子弹方向 40左下 C0左上 80右上

Track_Enemy_Index   = $6000
Enemy_Index_Begin   = $6010
Enemy_Index_End       = $6011

Loop_Index_I          = $6012
Loop_Index_J          = $6013
nEnemyIndex         = $6014
Data_buffer         = $6015

Bullet_Y_Pos          = $03B8 ;子弹垂直坐标
Bullet_X_Pos          = $03C8 ;子弹水平坐标
Bullet_Y_Speed      = $03F8 ;子弹垂直速度
Bullet_X_Speed      = $0408 ;子弹水平速度
Bullet_Z_Pos          = $0418 ;子弹Z坐标
Bullet_Owner          = $0448 ;子弹所有者 0: 1P 2: 2P

Enemy_State         = $04B8 ;敌人状态$04B8 5:弹起爆炸 0:不存在 6:下落 7:原地爆炸
Enemy_Blood         = $0598 ;敌人血量
Enemy_Type_Addr       = $0528 ;敌人类型
Enemy_Blood_Addr      = $0578 ;敌人血量
Enemy_Y_Pos         = $0324 ;敌人垂直坐标
Enemy_X_Pos         = $033E ;敌人水平坐标
Enemy_Y_Speed         = $04E8 ;敌人垂直速度
Bullet_Alive_State    = $04B8 ;敌人状态 5:弹起爆炸 0:不存在 6:下落 7:原地爆炸

Enemy_Index         = $83;
Time_Count            = $1A
Track_Bullet_Speed    = $07;分配子弹追踪敌人频率
Track_Enemy_Speed   = $03;子弹变向追踪敌人频率


.ORG $6100
Process_Begin:
JSR Enemy_Check
JSR Track_Enemy_Check
Process_End:
JMP $E54F

Enemy_Check:
LDA Time_Count
AND #Track_Bullet_Speed
CMP #Track_Bullet_Speed
BNE Enemy_Check_End
LDX #$0F
Enemy_Check_Begin:
LDA Enemy_State,X
BEQ Enemy_Check_Continue
STX Enemy_Index
JSR Find_Begin_Enemy
JSR Find_End_Enemy
JSR Bullet_Track

LDX Enemy_Index
Enemy_Check_Continue:
DEX
BPL Enemy_Check_Begin
Enemy_Check_End:
RTS

Track_Enemy_Check:
LDA Time_Count
AND #Track_Enemy_Speed
CMP #Track_Enemy_Speed
BNE Track_Enemy_Check_End
LDX #$0F
Track_Enemy_Check_Begin:
LDA Enemy_State,X
BEQ Track_Enemy_Check_Continue
STX Enemy_Index

LDA $40
LSR
BCC Track_Enemy_Check_Begin_L1

JSR Track_Enemy_Ex ;2, 4
LDA #$00
BEQ Track_Enemy_Check_Begin_L2

Track_Enemy_Check_Begin_L1:

JSR Track_Enemy

Track_Enemy_Check_Begin_L2:

LDX Enemy_Index
Track_Enemy_Check_Continue:
DEX
BPL Track_Enemy_Check_Begin
Track_Enemy_Check_End:
RTS


;查找第一个敌人
Find_Begin_Enemy:
LDX #$00
Find_Begin_Enemy_Check:
LDA Enemy_State,X
BEQ Find_Begin_Enemy_Check_Continue
LDA Enemy_Blood,X
BMI Find_Begin_Enemy_Check_Continue
BNE Find_Begin_Enemy_End

Find_Begin_Enemy_Check_Continue:
INX
CPX #$10
BCC Find_Begin_Enemy_Check
Find_Begin_Enemy_End:
STX Enemy_Index_Begin
RTS

;查找最后一个敌人
Find_End_Enemy:
LDX #$0F
Find_End_Enemy_Check:
LDA Enemy_State,X
BEQ Find_End_Enemy_Check_Continue
LDA Enemy_Blood,X
BMI Find_End_Enemy_Check_Continue
BNE Find_End_Enemy_End

Find_End_Enemy_Check_Continue:
DEX
BPL Find_End_Enemy_Check
Find_End_Enemy_End:
STX Enemy_Index_End
RTS

;子弹追踪
Bullet_Track:
LDA Enemy_Index_Begin
STA nEnemyIndex      ; int nEnemyIndex = nEnemyIndexBegin;
LDX #$00   
Bullet_Track_Check:   ;for (int i = 0; i < _countof(nBullet); i++)
LDA Bullet_State,X
BEQ Bullet_Track_Check_End;if (0 == nBullet) continue;
STX Loop_Index_I

JSR Bullet_Track_Enemy
JSR Bullet_Tract_Direction

;如果已经是追踪最后一个敌人, 则下次从第一个敌人开始追踪
;if (nEnemyIndex > nEnemyIndexEnd) nEnemyIndex = nEnemyIndexBegin;
LDA nEnemyIndex
CMP Enemy_Index_End
BEQ Bullet_Track_Check_Continue
BCC Bullet_Track_Check_Continue
LDA Enemy_Index_Begin
STA nEnemyIndex

Bullet_Track_Check_Continue:
LDX Loop_Index_I
Bullet_Track_Check_End:
INX
CPX #$10
BCC Bullet_Track_Check
Bullet_Track_End:
RTS

;给敌人分配子弹
Bullet_Track_Enemy:
LDX nEnemyIndex; for (int j = nEnemyIndex; j <= nEnemyIndexEnd; j++)
Bullet_Track_Enemy_Check:
STX Loop_Index_J

;if (0 != nEnemy && -1 == nTrack)
LDA Enemy_State,X
BEQ Bullet_Track_Enemy_Check_Continue
LDA Enemy_Blood,X
BMI Bullet_Track_Enemy_Check_Continue

LDX Loop_Index_I
LDA Track_Enemy_Index,X
CMP #$FF
BEQ Bullet_Track_Enemy_Init

Bullet_Track_Enemy_Init:
LDA Loop_Index_J
STA Track_Enemy_Index,X   ;nTrack = j;

STA nEnemyIndex
INC nEnemyIndex             ;nEnemyIndex = j + 1;
RTS                         ;break;

Bullet_Track_Enemy_Check_Continue:
LDX Loop_Index_J
INX ;j++
CPX Enemy_Index_End
BEQ Bullet_Track_Enemy_Check
BCC Bullet_Track_Enemy_Check
Bullet_Track_Enemy_End:
RTS

Track_Enemy:
LDX #$0F
Track_Enemy_Begin:
LDA Bullet_Icon,X
BEQ Track_Enemy_Continue
LDA Bullet_State,X
CMP #$01
BNE Track_Enemy_Continue

JSR Track_Enemy_Process

Track_Enemy_Continue:
DEX
BPL Track_Enemy_Begin
RTS

;普通关卡
Track_Enemy_Process:
LDA Track_Enemy_Index,X
CMP Enemy_Index
BNE Track_Enemy_End
LDY Enemy_Index
JSR Track_Enemy_Y
LDY Enemy_Index
JSR Track_Enemy_X
Track_Enemy_End:
RTS

Track_Enemy_Y:
SEC
LDA Bullet_Y_Pos,X
SBC Enemy_Y_Pos,Y
BEQ Track_Enemy_Y_Equal
BCS Track_Enemy_Y_Greater

Track_Enemy_Y_Less:    ;子弹Y < 敌人Y
CMP #$FC
BCC L1_1
CMP #$FE
BCC L1_2
LDA #$00
STA Bullet_Y_Speed,X
RTS
L1_1:
LDA Bullet_Type,X
AND #$0F
TAY
LDA Bullet_Speed_Data,Y
STA Bullet_Y_Speed,X
RTS

L1_2:
STA Data_buffer
LDA #$00
STA Data_buffer
LSR
STA Bullet_Y_Speed,X
RTS

Track_Enemy_Y_Greater: ;子弹Y > 敌人Y
CMP #$04
BCS L2_1
CMP #$04
BCS L2_2
LDA #$00
STA Bullet_Y_Speed,X
RTS

L2_1:
LDA Bullet_Type,X
AND #$0F
TAY
LDA #$00
SBC Bullet_Speed_Data,Y
STA Bullet_Y_Speed,X
RTS

L2_2:
LSR
STA Data_buffer
LDA #$00
SBC Data_buffer
STA Bullet_Y_Speed,X
RTS

Track_Enemy_Y_Equal:   ;子弹Y == 敌人Y
LDA #$00
STA Bullet_Y_Speed,X
RTS

Track_Enemy_X:
SEC
LDA Bullet_X_Pos,X
SBC Enemy_X_Pos,Y
BEQ Track_Enemy_X_Equal;子弹X == 敌人X
BCS Track_Enemy_X_Greater       ;子弹在敌人下方

Track_Enemy_X_Less:   ;子弹X < 敌人X
CMP #$FC
BCC L3_1
CMP #$FE
BCC L3_2
LDA #$00
STA Bullet_X_Speed,X
RTS
L3_1:
LDA Bullet_Type,X
AND #$0F
TAY
LDA Bullet_Speed_Data,Y
STA Bullet_X_Speed,X
RTS
L3_2:
STA Data_buffer
LDA #$00
STA Data_buffer
LSR
STA Bullet_X_Speed,X
RTS

Track_Enemy_X_Greater: ;子弹X > 敌人X
CMP #$04
BCS L4_1
CMP #$02
BCS L4_2
LDA #$00
STA Bullet_X_Speed,X
RTS

L4_1:
LDA Bullet_Type,X
AND #$0F
TAY
LDA #$00
SBC Bullet_Speed_Data,Y
STA Bullet_X_Speed,X
RTS
L4_2:
LSR
STA Data_buffer
LDA #$00
SBC Data_buffer
STA Bullet_X_Speed,X
RTS

Track_Enemy_X_Equal:;子弹X == 敌人X
LDA #$00
STA Bullet_X_Speed,X
RTS

Bullet_Speed_Data:
.DB $00,$03,$03,$02,$03,$03

;2, 4关
Track_Enemy_Ex:
LDX #$0F
Track_Enemy_Ex_Begin:

LDA Bullet_State,X
CMP #$01
BNE Track_Enemy_Ex_Continue

LDA Track_Enemy_Index,X
CMP Enemy_Index
BNE Track_Enemy_Ex_Continue;匹配追踪目标

LDY Enemy_Index
JSR Track_Enemy_Ex_X

Track_Enemy_Ex_Continue:
DEX
BPL Track_Enemy_Ex_Begin
Track_Enemy_Ex_End:
RTS

Track_Enemy_Ex_X:
;LDA Bullet_Z_Pos,X
;CMP #$04
;BCC Track_Enemy_Ex_X_End
SEC
LDA Bullet_X_Pos,X
SBC Enemy_X_Pos,Y
BCS Track_Enemy_Ex_X_Greater

Track_Enemy_Ex_X_Less:   ;子弹X < 敌人X
CMP #$FD
BCS Track_Enemy_Ex_X_Less_End
LDA $6020,X
CMP #$2A
BEQ Track_Enemy_Ex_X_Less_L1
LDA Bullet_Z_Pos,X
LSR
TAY
LDA Bullet_Speed_Data_Ex_R,Y
STA Bullet_X_Speed,X
RTS
Track_Enemy_Ex_X_Less_L1:

LDA Bullet_Z_Pos,X
LSR
LSR
TAY
LDA Bullet_Speed_Data_Ex,Y
STA Bullet_X_Speed,X
RTS

Track_Enemy_Ex_X_Less_End:
RTS

Track_Enemy_Ex_X_Greater: ;子弹X > 敌人X
CMP #$03
BCC Track_Enemy_Ex_X_End
LDA $6020,X
CMP #$2A
BEQ Track_Enemy_Ex_X_Greater_L1
LDA Bullet_Z_Pos,X
LSR
TAY
LDA #$00
SEC
SBC Bullet_Speed_Data_Ex_R,Y
STA Bullet_X_Speed,X
RTS

Track_Enemy_Ex_X_Greater_L1
LDA Bullet_Z_Pos,X
LSR
LSR
TAY
LDA #$00
SEC
SBC Bullet_Speed_Data_Ex,Y
STA Bullet_X_Speed,X
RTS

Track_Enemy_Ex_X_End:
RTS

;Bullet_Icon         = $0368 ;子弹Icon 普通:1E M:1F F:22 S:1F-21 L:23(纵向)24(横向)25(右下)
;Bullet_Direction      = $0378 ;L子弹方向 40左下 C0左上 80右上
Bullet_Tract_Direction:
LDA Bullet_Icon,X
CMP #$23
BCC Bullet_Tract_Direction_End

; X != 0
LDA Bullet_X_Speed,X
BEQ Bullet_Direction_V

LDA Bullet_Y_Speed,X
BEQ Bullet_Direction_H

LDA Bullet_X_Speed,X
BPL Bullet_Tract_Direction_Right
Bullet_Tract_Direction_Left:
LDA Bullet_Y_Speed,X
BMI Bullet_Direction_Left_Top
BPL Bullet_Direction_Left_Down
Bullet_Tract_Direction_Right:
LDA Bullet_Y_Speed,X
BMI Bullet_Direction_Right_Top
BPL Bullet_Direction_Right_Down
Bullet_Tract_Direction_End:
RTS

Bullet_Direction_Left_Top:
LDA #$25
STA Bullet_Icon,X
LDA #$C0
STA Bullet_Direction,X
RTS

Bullet_Direction_Left_Down:
LDA #$25
STA Bullet_Icon,X
LDA #$40
STA Bullet_Direction,X
RTS

Bullet_Direction_Right_Top:
LDA #$25
STA Bullet_Icon,X
LDA #$80
STA Bullet_Direction,X
RTS

Bullet_Direction_Right_Down:
LDA #$25
STA Bullet_Icon,X
LDA #$00
STA Bullet_Direction,X
RTS

Bullet_Direction_H:
LDA #$24
STA Bullet_Icon,X
LDA #$00
STA Bullet_Direction,X
RTS

Bullet_Direction_V:
LDA #$23
STA Bullet_Icon,X
LDA #$00
STA Bullet_Direction,X
RTS

Bullet_Speed_Data_Ex:
.DB $01,$01,$02,$02,$02,$03,$03,$04,$04,$04

Bullet_Speed_Data_Ex_R:
.DB $02,$02,$03,$03,$04,$05,$06,$07,$08,$08

**** Hidden Message *****

shower 发表于 2023-5-25 17:10:46

感谢旋风大神!一直不断深挖钻研,将Hack做到极致!{:good:}

fc爱好者 发表于 2023-5-25 18:54:35

顶一个,旋风大神{:good:}

afti 发表于 2023-5-25 19:13:23

连激光都可以追踪了,感谢分享!

she370192822 发表于 2023-5-26 00:23:26

谢谢大神 感谢分享

xdlwesker 发表于 2023-5-26 00:43:51

谢谢大神 感谢分享

华阳夫人 发表于 2023-5-26 01:21:27

感谢修改分享了

qq244740700 发表于 2023-5-26 13:34:06

旋风老大的作品必下收藏

g00dgame 发表于 2023-5-26 21:59:26

有成品下载吗?

热血 发表于 2023-5-27 13:38:28

永远支持

JUM2 发表于 2023-5-27 22:11:59

大大的作品必下收藏,感謝!

qtxxdcn 发表于 2023-6-11 05:28:07

哇,还可以怎么玩

zzf11cn 发表于 2023-6-11 16:57:35

感谢分享

12120404 发表于 2023-6-11 17:23:25

感谢分享

leshui 发表于 2023-6-25 13:56:53

感谢您的贡献

8964. 发表于 2023-6-28 01:04:09

感覺還有v1.2版 哈哈

qindiows 发表于 2023-6-28 15:51:54

这个厉害。下载玩玩。

xiaoqiang1xxc 发表于 2023-7-23 17:54:56

谢谢谢谢谢谢

xiaoqiang1xxc 发表于 2023-7-23 17:57:06

谢谢谢谢谢谢

lee85002 发表于 2023-7-23 21:48:16

好傢伙!!
謝謝分享!!
页: [1] 2 3
查看完整版本: [FC][魂斗罗][J][追踪弹][V1.1]