使用MAME的Lua引擎替代cheat的XML文件

老是写一次忘一次,每次都去找C++代码才能回忆起来,现在直接在这里记录备忘了。

Cheat的XML如下:

<mamecheat version="1">

  <cheat desc="Always winning hand">
    <script state="run">
      <action>maincpu.pw@100680=3030</action>
      <action>maincpu.pd@100682=31313100|(maincpu.pd@100682 BAND ~FFFFFF00)</action>
      <action>maincpu.pd@100685=34343400|(maincpu.pd@100685 BAND ~FFFFFF00)</action>
      <action>maincpu.pd@100688=35353500|(maincpu.pd@100688 BAND ~FFFFFF00)</action>
      <action>maincpu.pw@10068B=3636</action>
      <action>maincpu.pb@100610=36</action>
    </script>
  </cheat>

  <cheat desc="Get winning hand Now!">
    <script state="on">
      <action>maincpu.pw@100680=3030</action>
      <action>maincpu.pd@100682=31313100|(maincpu.pd@100682 BAND ~FFFFFF00)</action>
      <action>maincpu.pd@100685=34343400|(maincpu.pd@100685 BAND ~FFFFFF00)</action>
      <action>maincpu.pd@100688=35353500|(maincpu.pd@100688 BAND ~FFFFFF00)</action>
      <action>maincpu.pw@10068B=3636</action>
      <action>maincpu.pb@100610=36</action>
    </script>
  </cheat>

</mamecheat>

那Lua的脚本应该类似如下的样子:

cpu = manager:machine().devices[":maincpu"];
mem = cpu.spaces["program"];
mem:write_i8(0x100680,0x30);
mem:write_i8(0x100681,0x30);
mem:write_i8(0x100682,0x31);
mem:write_i8(0x100683,0x31);
mem:write_i8(0x100684,0x31);
mem:write_i8(0x100685,0x34);
mem:write_i8(0x100686,0x34);
mem:write_i8(0x100687,0x34);
mem:write_i8(0x100688,0x35);
mem:write_i8(0x100689,0x35);
mem:write_i8(0x10068a,0x35);
mem:write_i8(0x10068b,0x36);
mem:write_i8(0x10068c,0x36);
mem:write_i8(0x100610,0x36);

这个就是简单粗暴大三元。

一般式如下,如果是连续的内存空间,可以增大一次写入的字节数量省事,具体可以查看源代码中的write_ix族函数。

cpu = manager:machine().devices[":maincpu"];
mem = cpu.spaces["program"];
mem:write_i8(0x,0x);

下面是用Ruby生成的九莲宝灯:

#encoding:utf-8

ba = 0x100680
pa = 0x00
puts <<EOF
cpu = manager:machine().devices[":maincpu"];
mem = cpu.spaces["program"];
EOF
13.times do |t|
	puts "mem:write_i8(#{'0x%06x' % ba},#{'0x%02x' % pa});"
	ba += 1
	next if ba < 0x100680 + 3
	next if ba > 0x100680 + 10
	pa += 1
end
puts "mem:write_i8(#{'0x%06x' % 0x100610},0x00);"

输出为:

cpu = manager:machine().devices[":maincpu"];
mem = cpu.spaces["program"];
mem:write_i8(0x100680,0x00);
mem:write_i8(0x100681,0x00);
mem:write_i8(0x100682,0x00);
mem:write_i8(0x100683,0x01);
mem:write_i8(0x100684,0x02);
mem:write_i8(0x100685,0x03);
mem:write_i8(0x100686,0x04);
mem:write_i8(0x100687,0x05);
mem:write_i8(0x100688,0x06);
mem:write_i8(0x100689,0x07);
mem:write_i8(0x10068a,0x08);
mem:write_i8(0x10068b,0x08);
mem:write_i8(0x10068c,0x08);
mem:write_i8(0x100610,0x00);

新版本已经改成下面的访问方式了,其余的雷同:

cpu = manager.machine.devices[":maincpu"];
mem = cpu.spaces["program"];
mem:write_i8(0x00,0x00);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值