很多fc游戏都有现成的金手指代码,缺点是每次玩游戏都要开一次。
而网上很多无敌版无限命版都是在游戏原版语言的基础上修改的。以是整理一个教程,我们就可以在中文版fc游戏上修改rom文件,做中文版无限命版。
网上也很少有fc游戏的修改资料,毕竟fc游戏的时代已经过去了。在此稍做记载,以备存档。
以游戏fc坦克大战为例,本文实现命数不减,和取消指挥部判定(就是老鹰被炸了依旧能继承通关)。
游戏原版(未修改):
链接: https://pan.baidu.com/s/1307_Qm3W5ieurDty6aYjjg 提取码: v9i3
fc模拟器(自带6502调试工具,是个通用模拟器,可以网上搜索到下载)
链接: https://pan.baidu.com/s/1_x8_UXy3-1U2cCCP8j-xYQ 提取码: ycfm
开工:
首先通过百度或者自己查找,找到以下功能地点
0051 生命数
0068 指挥部
1.命数不减
打开fceux,载入游戏,正式开始游戏后故意死命,死一次就搜索一次变小了的数值,最后找到一个数值和游戏实际相匹配的地点。
生命数的地点的0051,添加到调试器中并设置“写”断点,因为我们要找到是哪条指令让它的值变小了。
故意死掉一命,然后游戏自动暂停,断点位置跳出。
注意到带箭头的那行,也就是第2行:
DE0D:D6 51 DEC $51,X @ $0051 = #$03
DEC是自减1,以是把DE0D地点开始的2个字节给nop掉即可。在6502汇编中,空操作的代码是EA
打开十六进制编辑器
转到地点DE0D处:
我们可以查看nes内存,表现的更加详细一些。
最后还是要转到rom中对应的位置(在nes内存中,鼠标点一下要修改的地点,然后点鼠标右键,弹出这个菜单),2个字节改成EA EA(下面图片中的右下角红色字节),然后保存rom文件即可。
此时,我们用模拟器重新载入这个修改后的rom文件(nes扩展名),故意死一次,就可以看到命数不减了。
2.无视指挥部
在游戏中,如果指挥部被炸了,游戏就直接输掉了。以是把指挥部炸掉后的后续处理给改掉。
首先找到对应的地点,是0068。这个地点非常欠好找,因为我们一般标志状态就一个0和1,而这个是正常状态128,指挥部被炸的刹时,它会变成十进制39,然后每一帧数值减1,不停到0为止。以是很难搜索出来。
同样地,对0068下断点,然后攻击指挥部,断点指令被触发。
STA $0068 = #$80,然后点“运行”,会发现DEC指令多次被触发,如下:
1D:E2DC:C6 68 DEC $0068 = #$27
1D:E2DE:A5 68 LDA $0068 = #$27
这两行指令被反复执行,0068处的值从0x27开始,一帧一减去1,最后为0。
因此利用上述方法,找到E2DC开始4个字节转到ROM中的地点,均EA掉,保存即可。
最终修改结果见视频:
https://www.bilibili.com/video/av540502231
修改后的成品:
链接: https://pan.baidu.com/s/15ozkoAu2wS1tFTY0Inlicg 提取码: 4khw
3.lua脚本
fceux模拟器可以在执行游戏的时候同步嵌入lua脚本,实现一些附带功能。比如直接修改内存,或者在游戏界面表现某些不能直接看到的数值提示信息。
比如我们用lua脚本实现无视指挥部的话,可以保证0068处的值不停是128即可。
[Lua] 纯文本查看 复制代码while true dosms=memory.readbyte(0x51) --生命数zhb=memory.readbyte(0x68) --指挥部gqs=memory.readbyte(0x85) --关卡数gui.text(200,10,string.format("shengming:%s",sms)) --初始为2,实则3命gui.text(200,20,string.format("laoying:%s",zhb)) --老鹰的状态值gui.text(206,30,string.format("guanqia:%s",qgs)) --当前关卡数memory.readbyte(0x68,0x80) --把指挥部状态值重置为正常值endemu.frameadvance() --帧进,每一帧刷新一遍end
附加:一个fc游戏 西游记 的lua脚本
[Lua] 纯文本查看 复制代码while true dodaojishi=memory.readbyte(0x106) --场景扣血倒计时shoutao=memory.readbyte(0x10f) --手套次数feixie=memory.readbyte(0x112) --飞鞋次数jinqian=memory.readbyte(0x109)+memory.readbyte(0x10A)*256gui.text(200,10,string.format("daojishi:%s",daojishi)) --32秒。满值128,最低0gui.text(200,20,string.format("shoutao:%s",shoutao)) --秒杀buggui.text(206,30,string.format("feixie:%s",feixie)) --飞鞋次数gui.text(200,40,string.format("jinqian:%s",jinqian)) --金钱是2字节hp1=memory.readbyte(0x36b)hp2=memory.readbyte(0x37b)if hp1==0 thengui.text(226,50,string.format("HP:%s",hp2))elsegui.text(226,50,string.format("HP:%s",hp1))endemu.frameadvance()end
在这个游戏中,初始武器不升级再配合手套道具可以秒杀全部敌人,包括boss,但是攻击次数用完后就不能秒了。以是速通的唯一难点是不知道剩余可用的攻击次数。使用这个lua脚本就可以在游戏界面中表现出来关键信息。
视频地点见:
https://www.bilibili.com/video/av925624622
总结:只要方法有了,修改任何游戏就比较随意了。
比如魂斗罗开场3命,我们可以先查到0032处是游戏初始的读取位置,默认为02。注意均为16进制值,那么我们只要改成1D,那么开场就是30命了。
同样,开场自带的武器也可以修改。还有对武器写断点,找到死命后武器被重置的指令EA掉,就可以实现死命不掉武器的修改了。
魂斗罗的武器地点是00AA,拿到新武器后,写“写入”断点,然后故意死掉,死的刹时游戏暂停,可以看到DA09处的STA指令(存入值)
我们只要转入到对应的rom位置,把对应的指令(此处指令是2字节)给EA掉即可。(截图是我改过以后才截的图)
魂斗罗中文版武器死后不掉的成品:
链接: https://pan.baidu.com/s/1WwSzX-EUq-kfMJwchKYdAA 提取码: w9q4
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |