[FC][魂斗罗][互相伤害][END]
先祝福大家五一快乐, 虽然来晚了哈, 废话就不多说了1.选择键切换子弹(为了更快杀死对方)
2.杀死对方自己加命
;[魂斗罗][互相伤害]
;20200505
.ORG $8960
P1_STATUE = $90 ;状态
P1_INVINCIBLE_A = $AE ;透明无敌
P1_INVINCIBLE_B = $B0 ;闪烁无敌
P1_REST = $32 ;P1剩余生命
LIVE_VALUE = $01 ;活着数值
P1_ACTION = $D6 ;趴下
P1_FACE = $D8 ;P1面向
LAY_VALUE = $17 ;趴下数值
JUMP_VALUE = $08 ;趴下数值
DIVING_VALUE = $18 ;潜水数值
P1_X = $0334 ;P1 X坐标
P2_X = $0335 ;P2 X坐标
P1_Y = $031A ;P1 Y坐标
P2_Y = $031B ;P2 Y坐标
Bullet_X = $03C8 ;子弹X坐标
Bullet_Y = $03B8 ;子弹Y坐标
Bullet_Owner = $0448 ;子弹所属者
Hit_Offet_X = $01C0 ;命中误差X
Hit_Offet_Y = $01C1 ;命中误差Y
State_Offet_X = $01C2 ;动作误差X
State_Offet_Y = $01C3 ;动作误差X
Offet_X_Check = $01C4 ;坐标差X
Offet_Y_Check = $01C5 ;坐标差Y
Reg_X_Temp = $01C6 ;寄存器X暂存
Reg_Y_Temp = $01C7 ;寄存器Y暂存
OFFET_X_STAND = $06 ;坐标差X值
OFFET_Y_STAND = $10 ;坐标差Y值
OFFET_X_LAY = $10 ;趴下坐标差X值
OFFET_Y_LAY = $07 ;趴下坐标差Y值
OFFET_X_JUMP = $08 ;跳跃坐标差X值
OFFET_Y_JUMP = $08 ;跳跃坐标差Y值
STATE_X_DIVING = $02 ;潜水动作误差X值
STATE_Y_LAY = $04 ;趴下动作误差X值
;武器切换
Btn_Once = $F5 ;单次按键
;========================================
ChangeWeapon:
LDA Btn_Once,X
CMP #$20
BNE ChangeWeaponEnd
LDA $AA,X
ORA #$10
STA $AA,X
CMP #$14
BNE WeaponSet
LDA #$0F
STA $AA,X
WeaponSet:
INC $AA,X
ChangeWeaponEnd:
LDA $AA,X
AND #$0F
RTS
.ORG $89A0
;互相伤害
;========================================
Hurt_Player:
STX Reg_X_Temp
STY Reg_Y_Temp
JSR CheckInvalidState
BCS HurtPlayerEnd
LDA Bullet_Owner,X
EOR #@0000001
TAY
JSR GetHitOffset
JSR GetOffet_X
JSR GetOffet_Y
JSR Check_Hit
BCC HurtPlayerEnd
JSR Kill_Player
HurtPlayerEnd:
LDX Reg_X_Temp
LDY Reg_Y_Temp
LDA $0438,X
RTS
;检查无效状态
;========================================
CheckInvalidState:
LDA Bullet_Owner,X
EOR #@0000001
TAY
LDA P1_STATUE,Y
CMP #LIVE_VALUE
BNE SetInvalidState
LDA P1_ACTION,Y
CMP #DIVING_VALUE
BNE CheckStateEnd
SetInvalidState:
SEC
RTS
CheckStateEnd:
CLC
RTS
;设置命中误差
;========================================
GetHitOffset:
LDA #OFFET_X_STAND
STA Offet_X_Check
LDA #OFFET_Y_STAND
STA Offet_Y_Check
LDA #$00
STA State_Offet_X
STA State_Offet_Y
GetHitOffset_Diving:
LDA P1_ACTION,Y
AND #DIVING_VALUE
CMP #DIVING_VALUE
BNE GetHitOffset_Lay
LDA #STATE_X_DIVING
STA State_Offet_X
LDA P1_FACE,Y
AND #$40
BEQ GetHitOffset_Lay
LDA #$00
SEC
SBC State_Offet_X
STA State_Offet_X
GetHitOffset_Lay:
LDA P1_ACTION,Y
CMP #LAY_VALUE
BNE GetHitOffset_Jump
LDA #OFFET_X_LAY
STA Offet_X_Check
LDA #OFFET_Y_LAY
STA Offet_Y_Check
LDA #STATE_Y_LAY
STA State_Offet_Y
RTS
GetHitOffset_Jump:
LDA P1_ACTION,Y
AND #@11110110
BNE GetHitOffsetEnd
LDA P1_ACTION,X
AND #JUMP_VALUE
BEQ GetHitOffsetEnd
LDA #OFFET_X_JUMP
STA Offet_X_Check
LDA #OFFET_Y_JUMP
STA Offet_Y_Check
RTS
GetHitOffsetEnd:
RTS
;获取子弹与角色X坐标差
;========================================
GetOffet_X:
LDA Bullet_X,X
SEC
SBC State_Offet_X
CMP P1_X,Y
BCC GetOffet_X_Set
LDA Bullet_X,X
SEC
SBC State_Offet_X
SEC
SBC P1_X,Y
STA Hit_Offet_X
RTS
GetOffet_X_Set:
LDA P1_X,Y
CLC
ADC State_Offet_X
SEC
SBC Bullet_X,X
STA Hit_Offet_X
RTS
;获取子弹与角色Y坐标差
;========================================
GetOffet_Y:
LDA Bullet_Y,X
SEC
SBC State_Offet_Y
CMP P1_Y,Y
BCC GetOffet_Y_Set
LDA Bullet_Y,X
SEC
SBC State_Offet_Y
SEC
SBC P1_Y,Y
STA Hit_Offet_Y
RTS
GetOffet_Y_Set:
LDA P1_Y,Y
CLC
ADC State_Offet_Y
SEC
SBC Bullet_Y,X
STA Hit_Offet_Y
RTS
;检查命中
;========================================
Check_Hit:
LDA Hit_Offet_X
CMP Offet_X_Check
BCS Check_Hit_End
LDA Hit_Offet_Y
CMP Offet_Y_Check
BCS Check_Hit_End
SEC
RTS
Check_Hit_End:
CLC
RTS
;杀死对方
;========================================
Kill_Player:
LDA Bullet_Owner,X
EOR #@0000001
TAX
LDA P1_STATUE,X
CMP #LIVE_VALUE
BNE Kill_Player_End
LDA P1_INVINCIBLE_A,X
ORA P1_INVINCIBLE_B,X
BNE Kill_Player_End ;无敌状态不处理
JSR $D474 ;角色死亡
LDX Reg_X_Temp
LDA Bullet_Owner,X
TAX
INC P1_REST,X
LDX Reg_X_Temp
JSR $E2FE ;子弹消除
Kill_Player_End:
RTS
**** Hidden Message ***** 感谢分享{:4_132:} 这就变成打黑枪了,有意思,谢谢 多谢分享,修改辛苦了
记得双截龙2这样干过,用1P打死2P可以奖命{:4_111:} 感谢大神分享! 厉害了啊,感谢分享 这都让你随心所欲的修改 这才是玩游戏啊 这个修改有点意思,感谢分享! 谢谢分享! 魂斗罗内战么{:4_116:} 这个有意思
页:
[1]