衔着鱼D猫 发表于 2016-9-26 23:19

MDL2 增加脚本编码

本文由 痕 原创

出处1:http://langrisser.xyz/mdl2-add-script-program
出处2:http://langrisser.xyz/mdl2-add-script-program2
出处3:http://langrisser.xyz/mdl2-add-script-program3
出处4:http://langrisser.xyz/mdl2-add-script-program4

作者主页:http://langrisser.xyz/

衔着鱼D猫 发表于 2016-9-26 23:23

用过剧本编辑器的都知道,游戏里提供的脚本编码只有0x00-0x3C,我们来增加一个0x3D。
我也不是高手,我也不懂68k的汇编,不过没关系,游戏里本身就提供了0x00-0x3C的程序,可以用来参考,再查查指令集就可以了。
比如说,0x25是人物施展火球魔法,弄个0x3D人物施展陨石魔法,这样两个程序比较相近,稍微修改一下就可以了。
用到的工具:调试模拟器(这里是Regen 0.97D),十六进制编辑器(这里是Winhex),计算器(按alt+3切换到程序员版),记事本(记录东西和写程序用),68k cpu的指令集,还有一个有逻辑的头脑
这里有个中文速查:http://zero3c.blog.163.com/blog/static/2782150820073142323549/

看一下编码读取的过程,大概就是:读取编码->读取编码对应的程序->执行程序->返回。
修改成:读取编码->执行我们的程序->读取编码对应的程序->执行程序->返回。
用调试器跟跟编码的读取:

http://ww4.sinaimg.cn/mw690/3f3a1b7djw1f87eb6mphsj20di02fwf0.jpg

解释一下这几句:
1.读取编码
2.把编码跟0xFF比较
3.如果是0xFF,跳转到0x1596a,如果不是则执行下面的
4和5.实际上这是把编码乘以4
6.跳转到 2 + PC(当前程序执行处) + 编码*4

这里我们把第一句修改成跳转到我们的程序,增加的程序我随便找了个像是空白的地方:0x150000,nop表示空指令,cpu不执行任何操作

http://ww1.sinaimg.cn/mw690/3f3a1b7djw1f87ee58yn6j20hh0afad8.jpg15856:0c0000ff cmpi.b #-$1, D0 -> jmp $150000
1585a:6700010e beq $1596a -> nop
1585e:d040 add.w D0,D0
15860:d040 add.w D0,D0
15862:4efb0002 jmp ($2,PC,DO.w)

//这样跳转就完成了,然后去0x150000写我们的程序:
150000:cmpi.b #-$1,D0 //把编码与0xFF比较
150004:bne $15000e //如果不是0xFF,跳转到0x15000e,否则执行下面的程序
150008:jmp $1596a //跳转到0x1596a
15000e:cmpi.b #$3D,D0 //把编码与0x3D比较
150012:bge $15001c //如果大于等于0x3D,跳转到0x15001c.否则执行下面的程序
150016:jmp $1585e //跳转到0x1585e
15001c:addi.b #-$3d,D0 //编码减去0x3D
150020:add.w D0,D0 //
150022:add.w D0,D0 //这两行把减去的结果乘以4
150024:jmp ($2,PC,D0.w) //跳转到 2 + PC(当前程序执行处) + 编码*4
15002a:bra $150100 //0x3D编码执行的程序
15002e:bra $......
......为了方便起见,把0x15002a开始的地方留了许多空位,以便日后再增加编码,
然后再来写0x3D编码实际执行的程序
模仿0x25的程序,所以先直接把0x25的程序直接复制过来

http://ww1.sinaimg.cn/mw690/3f3a1b7djw1f87eb7c9gvj20di00u0sw.jpg

0x16886-0x16a1c之间的代码就是0x25的程序

打开十六进制编辑器,直接复制

http://ww1.sinaimg.cn/mw690/3f3a1b7djw1f87eb7n9kxj20fj0dtn3l.jpg

复制过来之后还要作一些修改:
1.修改为jmp操作保留的地址
这里需要修改的地方:

http://ww4.sinaimg.cn/mw690/3f3a1b7djw1f87eb889p8j20dv00iwek.jpg

http://ww3.sinaimg.cn/mw690/3f3a1b7djw1f87eb8o248j20d900gjrg.jpg

http://ww3.sinaimg.cn/mw690/3f3a1b7djw1f87eb8jxepj20dh00it8o.jpg

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87eb8thclj20dh00imx8.jpg

http://ww3.sinaimg.cn/mw690/3f3a1b7djw1f87eb927y3j20dk00jwek.jpg

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87eb9ez3zj20d700i3ym.jpg

http://ww3.sinaimg.cn/mw690/3f3a1b7djw1f87eb9qik2j20d700gdfw.jpg

挑第一个说一说:

http://ww3.sinaimg.cn/mw690/3f3a1b7djw1f87eb9xys9j20dh030q3z.jpg

因为jmp操作不会保留返回的地址,所以要人为的把jmp下一条指令的地址保存,以便程序返回.修改之后:

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87ebaawq2j20d4031wfj.jpg

衔着鱼D猫 发表于 2016-9-26 23:26

2.修改一些相对地址的跳转
相对地址的跳转一般有beq,bne,bra,bge等
这里用到的相对地址跳转有:

http://ww4.sinaimg.cn/mw690/3f3a1b7djw1f87ebaj3hvj20dh00g3yj.jpg

http://ww4.sinaimg.cn/mw690/3f3a1b7djw1f87ebav39uj20dg00faa3.jpg

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87ebbb7qkj20dc00fwei.jpg

其中第二个不用管,因为那是跳转到程序里的,我们只要修改跳转到程序外的
因为0x150000到0x1595a太远了,无法用相对地址跳转,只能用长地址跳转jmp,所以我们在0x1500fa增加一句:

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87ebbexmhj20db00lmx1.jpg

然后把上面跳转的0x1595a的改成跳转到0x1500fa就可以了

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87ebbkcy0j20cy00mt8s.jpg

http://ww1.sinaimg.cn/mw690/3f3a1b7djw1f87ebc3c6cj20df00lwej.jpg

3.把火球魔法改成陨石魔法
火球魔法的代码是0x03,找到这一行

http://ww4.sinaimg.cn/mw690/3f3a1b7djw1f87ebc5w4kj20db00i74d.jpg

把0x03改成0x04陨石魔法的代码,修改后

http://ww1.sinaimg.cn/mw690/3f3a1b7djw1f87ebcgmmyj20di00gt8r.jpg

因为本身是0x25的程序,所以就不用我们自己作返回操作了.
到这里,我们的程序就完成了,接下来测试:
第11关,艾格贝尔特放火球的地方:0x1976d0,把0x25改成0x3D.
最后进入游戏里.

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87ebcv87sj20i80ewdq8.jpg

姑且算是教程的教程结束,如果有能力的话,可以增加自己编写的程序,跳出游戏本身的限制,像der里编码从0x00-0x56。

修改后的demo:http://pan.baidu.com/s/1sjDg9D7
只简单地测试了一下,不知道有没有问题.

衔着鱼D猫 发表于 2016-9-26 23:28

MDL2 增加脚本编码2

之前的教程增加了一个简单的放陨石的脚本编码,但是实用性不大,那么这次我们来添加一个简单的自己写的程序。
目标:
0x3E:增加人物属性
用法:3E 3A 05 人物的3A属性增加05点

DER里有一些隐藏点可以增加属性,我们来增加一个类似的编码0x3E.
之前的教程已经把读取编码判断编码的程序写好了,再增加一个0x3E只需要在0x150028增加跳转:

http://ww1.sinaimg.cn/mw690/3f3a1b7djw1f87elkivi3j20hg091tah.jpg......
150024:bra $150100
150028:bra $150296   ->添加跳转到0x3E处理程序
......
然后在0x150296写处理程序:
150296:move.w #$4, $ffaa2c.l
15029e:movea.l $ffaa16.l,A1
1502a4:cmpa.l #$0,A1
1502aa:beq $1500fa
1502ae:moveq#$0,D0
1502b0:move.b (A0)+,D0
1502b2:moveq#$0,D2
1502b4:move.b (A0)+,D2
1502b6:move.b (A1,D0.w),D1
1502ba:add.b D1,D2
1502bc:move.b D2,(A1,D0.w)
1502c0:bra $1500fa大概就是读取人物属性,加上点数,然后再写入,看得懂就看吧。
这里只是简单的加减,没有对结果进行判断,比如255 + 1会等于0。

写好之后写入ROM,然后就可以测试了。
还是第11关,走到魔法阵上的处理,由获得魔导石改成3E 3A 05,即AT + 5
进入游戏测试:
原始:

http://ww2.sinaimg.cn/mw690/3f3a1b7djw1f87ebd8lrqj20i80ew47t.jpg

走到魔法阵上,AT+5:

http://ww3.sinaimg.cn/mw690/3f3a1b7djw1f87ebdlesej20i80ew112.jpg

DEMO2下载:
http://pan.baidu.com/s/1ntFWCwL

衔着鱼D猫 发表于 2016-9-26 23:30

MDL2 增加脚本编码3

在DER梦幻模拟战的女神问答中,有一些选项会让人物能够雇佣一些佣兵或者让人物能够使用一些魔法,这次添加的就是这个,有能力的话,说不定可以为MDL2加上女神问答。

使用方法:
3F:人物可以雇佣士兵
3F 07:当前人物可以雇用士兵龙骑兵
借用游戏冲击波的数据
00 – 枪兵 パイク
01 – 重装枪兵 ファランクス
02 – 步兵 ソルジャー
03 – 斗士 グラディエーター
04 – 重装步兵 アーマソルジャー
05 – 骑兵 ホースマン
06 – 重装骑兵 ヘビーホースマン
07 – 龙骑兵 ドラグーン
08 – 精灵射手 エルフ
09 – 弩车 バリスタ
0A- 僧侣 モンク
0B- 卫兵 ガードマン
0C- 人鱼战士 マーマン
0D- 狮鹫 グリフォン
0E- 天使 エンジェ

40:人物可以使用魔法
40 07:当前人物可以使用魔法龙卷风
40 00:当前人物可以使用魔法
40 17:当前人物可以使用召唤

Download DEMO3:http://pan.baidu.com/s/1mgssuoS

衔着鱼D猫 发表于 2016-9-26 23:31

MDL2 增加脚本编码4

受四条所托,增加了几个可以对内存数据修改的编码。

41:内存数据数值设置
41 60 3C 10:设置内存地址603C的数值为10
42:内存数据数值增加/减少
42 60 3F 03:内存地址603F的数值增加03
42 A4 CC FE:内存地址A4CC的数值减少02
43:内存数据数值bit位设置/清除,00-07设置,08-0F清除
43 A4 CC 01:设置内存地址A4CC的数值bit位01
43 A4 CD 08:清除内存地址A4CD的数值bit位00

添加的汇编程序://ASM For 0x41
150394:move.w #$4,$ffaa2c.l
15039c:lea $ff0000.l,A1
1503a2:moveq #$0,D0
1503a4:move.b (A0)+,D0
1503a6:moveq #$0,D1
1503a8:move.b (A0)+,D1
1503aa:lsl.w #$8,D0
1503ac:or.w D0,D1
1503ae:moveq #$0,D2
1503b0:move.b(A0)+,D2
1503b2:move.b D2,($0,A1,D1.w)
1503b6:bra $1500fa

//ASM For 0x42
1503ba:move.w #$4,$ffaa2c.l
1503c2:lea $ff0000.l,A1
1503c8:moveq #$0,D0
1503ca:move.b (A0)+,D0
1503cc:moveq #$0,D1
1503ce:move.b (A0)+,D1
1503d0:lsl.w #$8,D0
1503d2:or.w D0,D1
1503d4:moveq #$0,D2
1503d6:move.b(A0)+,D2
1503d8:move.b ($0,A1,D1.w),D0
1503dc:addi D0,D2
1503de:move.b D2,($0,A1,D1.w)
1503e2:bra $1500fa

//ASM For 0x43
1503e6:move.w #$4,$ffaa2c.l
1503ee:lea $ff0000.l,A1
1503f4:moveq #$0,D0
1503f6:move.b (A0)+,D0
1503f8:moveq #$0,D1
1503fa:move.b (A0)+,D1
1503fc:lsl.w #$8,D0
1503fe:or.w D0,D1
150400:moveq #$0,D2
150402:move.b (A0)+,D2
150404:cmpi.b #$8,D2
150408:blt $150418
15040c:cmpi.b #$10,D2
150410:blt $150420
150414:bra $1500fa
150418:bset D2,(A1,D1.w)
15041c:bra $1500fa
150420:subq #$8,D2
150422:bclr D2,(A1,D1.w)
150426:bra $1500faDownload DEMO4:http://pan.baidu.com/s/1c00a4ms
页: [1]
查看完整版本: MDL2 增加脚本编码