老是写一次忘一次,每次都去找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);