[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 *****
感谢旋风大神!一直不断深挖钻研,将Hack做到极致!{:good:} 顶一个,旋风大神{:good:} 连激光都可以追踪了,感谢分享! 谢谢大神 感谢分享 谢谢大神 感谢分享 感谢修改分享了 旋风老大的作品必下收藏 有成品下载吗? 永远支持
大大的作品必下收藏,感謝! 哇,还可以怎么玩 感谢分享 感谢分享 感谢您的贡献 感覺還有v1.2版 哈哈 这个厉害。下载玩玩。 谢谢谢谢谢谢 谢谢谢谢谢谢 好傢伙!!
謝謝分享!!