找回密码
 注册
搜索
查看: 3686|回复: 3

[L2] MD梦幻模拟战2 机制解析

[复制链接]
发表于 2016-9-26 23:47 | 显示全部楼层 |阅读模式
 楼主| 发表于 2016-9-26 23:47 | 显示全部楼层
MD版的L2内建有许多机制来限制或者实现某些功能,比如AT、MP之类的数值有上限,某些道具不会掉落,圣剑只有某些人能用等等。
本文所要说的也是其中一个,关于指挥官和佣兵的地图形象的限制。
起因是有人问我为什么把敌军替换成友军会出现地图形象错乱,然后就找时间调试了一下,把这个问题的原因和解决方法做了出来。
首先是通过调试发现的游戏机制:
1、指挥官的地图形象上限为18个,这个是由显存限制的,对应的显存地址0x300-0x347。其中我方及NPC方为10个,敌方为8个,这个是由游戏程序设定的,职业跟形象的对应关系在内存地址0xa7fe-0xa84d,每4字节为一个指挥官的对应,共20个,所以关卡中同时登场的部队上限为20个。
2、佣兵的地图形象上限为26个,这个也是由显存限制的,对应的显存地址0x348-0x3af。佣兵的形象也分阵营,判断标准是看指挥官的阵营,而不是看佣兵本身是什么阵营的兵种。其中我方及NPC方为16个,敌方为10个,这个也是由游戏程序设定的,佣兵跟形象的对应关系在内存0xa84e-0xa8b5,每4字节为一个兵种的对应,共26个。其中我方及NPC方的形象被程序设定为0x62-0x71,共16个。而敌方的佣兵形象则根据实际登场的兵种写入内存0xa88e-0xa8b5。
3、第七个佣兵即召唤物的地图形象上限为4个,这个也是由显存限制的,对应的显存地址为0x3f0-0x3ff,召唤物跟形象的对应关系在内存0xa8b6-0xa8c5,每4字节为一个兵种的对应,共4个。
4、ROM里只有我方及NPC方的兵种的黑白静止形象,只有阵营为我方(0x01)时才会显示黑白静止形象,否则是显示彩色静止形象。其中佣兵的黑白静止形象被程序设定为0x62-0x71,共16个。指挥官的黑白静止形象则按实际登场写入。
5、战前配置士兵时,形象被程序设定为0x62-0x71。
6、战后战果结算时,没测试过,不过大概也是与第5点类似。

可以看到内存地址划分为我方一块,敌方一块,如果其中一块超出了限制就会出现问题。所以这种把内存地址划分为敌我两方的设定导致了几个问题:
1、指挥官形象中,如果其中一方的形象数量超出了上限,即使总数量没有超过18也会出现形象错乱
2、佣兵形象中,游戏程序默认把0x62-0x71共16个兵种设定为我方及NPC方的佣兵形象,所以我方及NPC方的阵营使用敌方的兵种会花屏,而敌方的上限只有10个,超过这个数量也会花屏
3、如果我方阵营的佣兵没有黑白静止形象,那么行动结束后形象会错乱。

所以这里就给出了一些修改方法:
  1. //1.去掉指挥官形象阵营限制,让全部阵营的指挥官都使用同一块内存。
  2. 112D6:movea.w #$6500,A0 (307C6500)    ->    112D6:nop nop (4e714e71)

  3. //2.去掉佣兵形象阵营限制,让全部阵营的佣兵都使用同一块内存,并且保留程序设定的0x62-0x71。
  4. 11432:bne $114c8 (66000094)    ->    11432:nop nop (4e714e71)
  5. 11454:lea $ffa88e.l,A4 (49F9FFFFA88E)    ->    lea $ffa84e.l,A4 (49F9FFFFA84E)
  6. 11684:moveq #$f,D0 (700F)    ->    moveq #$19,D0 (7019)
  7. 116C2:lea $ffa88e.l,A0 (41F9FFFFA88E)    ->    lea $ffa84e.l,A0 (41F9FFFFA84E)
  8. 116C8:moveq #$9,D0 (7009)    ->    moveq #$19,D0 (7019)

  9. //3.修复没有行动结束形象的兵种。
  10. //版本A:有黑白形象的用黑白形象,没有的用彩色形象
  11. a588:addi.w #$68,D6 (06460068) -> jump $150200 (4ef900150200)
  12. a58c:bra $a5b6

  13. 150200:moveq #$0,D1 (7200)
  14. 150202:move.b ($0,A3),D1 (122b0000)
  15. 150206:cmpi.b #$62,D1 (0c010062)
  16. 15020A:blt $15021E (6d000012)
  17. 15020E:cmpi.b #$71,D1 (0c010071)
  18. 150212:bgt $15021E (6e00000A)
  19. 150216:addi.w #$68,D6 (06460068)
  20. 15021A:jump $00a5b6 (4ef90000a5b6)
  21. 15021E:jump $00a534 (4ef90000a534)

  22. //版本B:佣兵全用彩色形象
  23. a56c:bne $a534 -> bra $a534


  24. //版本C:指挥官和佣兵全用彩色形象
  25. a56c:bne $a534 -> bra $a534
  26. a510:bne $a534 -> bra $a534
复制代码
效果图:



修改成品,修改自狼组汉化原版:http://pan.baidu.com/s/1dDc6qDb
 楼主| 发表于 2016-9-26 23:48 | 显示全部楼层

MD梦幻模拟战2 机制解析2-魔法

上次介绍了MDL2中的形象限制,这次要研究的是MDL2中的魔法效果,这里着重介绍魔法威力。
MDL2的魔法系统比较简单,魔法威力只与等级LV和魔防MR有关。
1、首先是攻击类魔法
攻击类魔法带有自身的魔法威力,由程序设定的,由于代码段比较长,就不贴出来了,直接把魔法威力的计算方式贴出来:
魔法箭 LV/2*2
爆炎 LV/2+20
落雷 LV/2+5 水中+1
火球 LV/2+3
陨石 LV/2+10
暴风雪 (LV/2+2)*2
龙卷风 (LV/2+2)*2 飞行+1
地震 (LV/2+5)*2 飞行=0
其中要注意的是,除法的计算结果要省略小数点后面,比如7/2=3,因为程序本来使用的是右位移,为了表示方便我写成了除法。
然后再来看接下来的算法,看图:



简单解释一下:
0xa711是保存防守方魔防MR的地方,这里的意思是:
魔法伤害=((100-防守方MR)*魔法自身威力)/100 +道具附加魔法伤害
就这么一个简单的式子。

2、回复魔法,直接省略了,效果大家都清楚

3、状态魔法
状态魔法有催眠、沉默、束缚、魅惑,成功率都是由攻击方LV、防守方LV、防守方MR共同决定。
具体如下:
催眠 种类=0e无效 状态=催眠无效
沉默 召唤兽无效 状态=沉默无效
束缚 状态=束缚无效
魅惑 种类=0e无效
它们的成功率计算方式都是一样的:
成功率=100-(防守方MR-(攻击方lv-防守方lv)*4)

程序里设计是这样的,但是测试的时候却发现,状态魔法无论如何都是成功的,测试使用的是狼组汉化原版。
然后调试之后发现,这好像是一个BUG,貌似游戏程序员把状态位搞错了。
如果这是一个BUG,那么可以这样修复:
修改ROM:
B0C4:67 -> 6B
效果图:


发表于 2016-9-27 00:00 | 显示全部楼层
状态魔法可以MISS才是原设计
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|虎纹猫家园

GMT+8, 2024-11-21 19:30 , Processed in 0.695749 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表