yandagui 发表于 2020-5-5 15:40:24

[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 *****

yes007007 发表于 2020-5-5 16:07:50

感谢分享{:4_132:}

看稀奇 发表于 2020-5-5 18:51:47

这就变成打黑枪了,有意思,谢谢

dabayu 发表于 2020-5-5 19:56:35

多谢分享,修改辛苦了

afti 发表于 2020-5-5 20:25:15

记得双截龙2这样干过,用1P打死2P可以奖命{:4_111:}

shower 发表于 2020-5-5 22:28:00

感谢大神分享!

liuqi459120528 发表于 2020-5-5 22:55:54

厉害了啊,感谢分享

leos 发表于 2020-5-6 14:26:39

这都让你随心所欲的修改 这才是玩游戏啊

g00dgame 发表于 2020-5-7 00:27:09

这个修改有点意思,感谢分享!

xuxiaoxin850127 发表于 2020-6-29 02:20:17

谢谢分享!

nanayaka 发表于 2020-6-29 08:19:11

魂斗罗内战么{:4_116:}

leshui 发表于 2020-8-5 15:26:06

这个有意思
页: [1]
查看完整版本: [FC][魂斗罗][互相伤害][END]