秘技 内存数据
完全解析
魔法攻防
详细解析
Bug


梦幻模拟战2  (MD)人物内存数据之完全解析

作者:ReverseArk(联系:gd_hell@citiz.net)

◇目录
◆前言
◆数据分析PART I :Character  PART II :Item List  PART III :Money
◆总结陈词

■前言  (Top)

■ 版权信息
文中除少部分内容参考了其它资料外(总共三处,详见文章最后的"注1"),其余内容皆为原创。转载时请注明作者信息。

■内容简介
本文介绍了Langrisser II (MD)中与人物相关的所有内存数据的含义(我方每人120个,敌方每人96个),以及道具表和金钱的内存数据。对于喜欢修改游戏的人来说,本文将是您手边的必备资料;而对于厌恶修改游戏的人来说,我可以告诉您,其实我也不喜欢修改游戏。既然如此,那又为什么要搞出这么一篇长篇大论来?建议您看看文章最后的"总结陈词",再看看文章的内容,相信您会有所感悟的。

■ 注意事项
1. 本人所使用的模拟器为'Megasis 0.06a',ROM为'Langrisser II 日文版',所有因模拟器或ROM与此不同所导致的问题,除'Wgens'外,无暇一一顾及,请见谅。
2. 针对Wgens用户的说明:Wgens的内存地址在一个字(word, 16bit)上与Megasis有高低字节(byte)先后的不同,具体说明如下:

以下是同样的数据,各位一看便知:

在Megasis内存数据表示为: 000060a0h: 03 05 00 0A 01 00 0D 14 00 00 00 00 6D 05 00 0A
在Wgens中内存数据表示为: 000060a0h: 05 03 0A 00 00 01 14 0D 00 00 00 00 05 6D 0A 00

因此Wgens的用户在使用本文中的信息修改游戏时,应注意两种模拟器内存地址高字节在前和低字节在前的不同。

P.S.
个人认为Megasis的内存地址比较"正常"一点。比如坐标位是先X后Y;装备是先武器,后防具,再饰品,连续的三位数据;而魔法也是连续三位数据。而在Wgens中,坐标是先Y后X;装备是先武器,隔了一个其它数据,再是饰品,再接防具;魔法和装备品一样,被颠三倒四+ 横插一道。如果是改惯了Wgens的话当然无所谓,反正我是不大习惯啦。

3. 本文中的内存数据的地址为Megasis的状态记录文件"?.ST0",用UltraEdit打开后获得。请注意即使是同样的数据,在不同的模拟器或修改工具上存放的地址很可能不相同,但是各数据间的位移量是相同的,各位可自行推算。比如Megasis,用FPE时显示的地址要比状态文件中的地址后移8字节(byte),但是数据排列顺序都是一样的(因为都是用Megasis)。各位在修改时请注意这个Offset;如果模拟器不同,也不要忘记之前提到的高低字节顺序的问题。

P.S. 
也许有人不明白为何我要用 state file + UltraEdit 这种手段。因为我用的OS是Windows 2000,不可能运行任何游戏修改工具,包括FPE。因为在Windows 2000下各进程间的内存地址是完全封闭的,其它进程无法进入。比起FPE,这种方法也有好处,那就是万一改出问题来,比如游戏死机,还有得救,只要把状态文件恢复正常,重新读入就行;此外在研究魔法时,这种方法也能带来很多方便。

4. 最后多嘴一句:如果您在阅读本文时,还不曾在不作任何修改,不用任何秘技的情况下把这个游戏至少进行一遍,那么衷心劝您一句——在没有品尝过原汁原味之前,请先不要乱加调料,以免吃的时候变味,弄得不好还要消化不良。

杂七杂八说了一大堆应该不是废话的话,恐怕各位也等得不耐烦了,OK,那么现在开始分析数据。

■数据分析  (Top)

PART I:Character  (Top)

每个角色都有与之相关的数据,我方每个角色的数据为(96 + 24 =)120个,敌方为96个。由于我方的那96个数据与另外的24个数据存放位置不同,以下分成2部分分别说明。

Section 1

以下数据来自 Scenario 01,是海恩的数据(在不改变行动顺序的情况下),总计96个。(为什么不用艾尔文的?其实是因为本人对海恩颇有好感,仅此而已。)

描述方法是按照地址一位位解说,必要时会有说明。

各个角色在第1区96个数据的地址会随每一话的出场人数,我方行动顺序等因素而变化(请参考60a4的说明)。但一定是从6040开始,即6040为人物0,60a0为人物1,6100为人物2,以此类推。

0 1 2 3 4 5 6 7  8 9 A B C D E F
000060a0h:
000060b0h:
000060c0h:
000060d0h:
000060e0h:
000060f0h: 
03 05 00 0A   
01 01 0C 14   
01 00 00 00   
6D 05 00 0A  
01 05 00 00   
3C 00 00 03 
01 00 0D 14
00 00 00 00
6D 05 00 0A
01 04 0D 15
05 02 04 02
FF 05 00 0A 
00 0D 18 1F
6D 05 00 0A
01 03 0D 13
0C 0C 17 0D
FF 05 00 0A 
01 07 00 00
6D 05 00 0A
01 02 0E 14
00 00 01 00
FF 05 00 0A
01 06 00 00
00 00 00 11

以下描述中标有"?"的数据,表示用途不明。但是据不可靠观察,这些数据从一开始就一直为00,从来不曾变化过,基本上可以理解为空置。

★ 60a0: 职业;03 表示"魔法师(ウォーロック)";同时也是这个数据决定了经验值槽的长度

★ 60a1: 人物代码,05表示海恩(ヘイン),专题内有人物代码详细列表供对照

★ 60a2: 指挥官(海恩、ヘイン)的 行动状态+异常状态,具体如下:
00: 行动未结束
01: 行动结束
08: S - Sleep (睡眠状态、スリープ)
10: M - Mute (沉默状态、ミュート)
80: 败北

说明1:以上数据可进行位(bit)组合,换句话说就是相加。比如10 + 8 + 1 = 19,表示行动已结束,并且同时处于Sleep及Mute的状态。

说明2:
这些状态仅仅是个别作战单位自身的状态,而非整支部队的状态。因此每个指挥官或佣兵都要有这样一个数据。

★ 60a3: 指挥官的HP;0A表示10点,即满血

★ 60a4: 当前战场出战部队的ID
说明1: 这个数据是当前战场出战部队的ID号。出击前有个命令:"行动顺序变更",可以改变我方的部队ID号,同时也影响内存数据中角色排列的先后。以第1话为例,不作任何改变的话,艾尔文是00,海恩是01,在内存中艾尔文排在海恩的前面;如果改变两人的行动顺序,那么变成海恩为00,艾尔文为01,在内存中海恩排在前面。

说明2: 此数值自00始,至13终,也就是说每话出战的敌我部队最多20支。

说明3: 这与"人物代码"有所不同,人物代码是贯穿整个游戏的,而这个数据仅在此关有效。

★ 60a5: ?

★ 60a6: 指挥官所在位置 X
★ 60a7: 指挥官所在位置 Y
说明: 相对于地图左上角(1,1)

★ 60a8: 辅助魔法状态(部队异常状态)
01: A - Attack (攻击提升、アタック)
02: P - Protection (防御提升、ブロテクション)
04: R - Resist (魔防提升レジスト)
08: Z - Zone (束缚、ゾーン)

说明1: 这些都是整支部队的状态而非个人的状态,因此不需要每个作战单位分别保存。
说明2: 这些数据同样可以进行位(bit)组合,就不赘述了。
说明3: Charm (チャーム)状态由于涉及到一些其它因素,并不保存在这里,而是在60fc。

★ 60a9: 装备 - 武器
★ 60aa: 装备 - 防具
★ 60ab: 装备 - 饰品

说明1: 在这个例子中,海恩的装备是:暗黑之杖ダークロッド(0D),幻象法袍ミラージュローブ(18),王冠クラウン(1F)

说明2: 要查物品代码实际上很容易:使用"真-隐藏商店"的秘技,然后进入商店,此时的物品顺序就是顺着物品代码顺序排列的,从匕首ナイフ- 01 一直到护身符アミュレット- 25,总37件。

说明3: 仅仅修改这里并不能"真正"把道具装备上去,虽然这些装备的确有了效果。需要在道具表上再动一番手脚,才能真正算是装备上(这个后面会提到)。有人可能宁可使用"假装备",因此这样可以不占用有限的道具库存,确实如此。不过,我还是喜欢"实打实"的装备。

★ 60ac: 佣兵1;6D - 卫兵ガードマン, 64 - 步兵ソルジャー, 8D - 水元素エレメンタル(召唤兽), FF - NULL(空)

说明1
: 我的另一篇文章"Langrisser II (MD) 魔法攻防机制 彻底解析"的附录部分在列出了所有职业和佣兵的魔法防御的同时,也列出了对应的代码,可供参考。专题内也有佣兵代码详细列表供对照。

说明2: 如果修改为敌方兵种(如7B - 皇家骑兵ロイヤルホース),那个单元格就会花屏—— 除非把自己变成"敌Unit"。而敌方指挥官带我方兵种的话,也会花屏。花屏其实并不影响操作,移动或攻击都没问题,只是"面子"上过不去而已。

★ 60ad: 表示佣兵1的指挥官,同时也就是人物代码,05即海恩ヘイン

★ 60ae: 佣兵1的行动状态+ 异常状态;请参考 60a2,含义完全相同

★ 60af: 佣兵1的HP,0A表示10点,即满血

★ 60b0: 此地图上的部队ID号,与60a4相同

★ 60b1: 此部队中的Unit ID。由于连同召唤兽在内总共可有7支部队,这个数值的可能范围也相应为 01-07

★ 60b2: 佣兵1所在位置 X
★ 60b3: 佣兵1所在位置 Y

说明
: 相对于地图左上角(1,1)

说明: 之后可看到 6D 05 00 0A 01 01 0C 14 或者 FF 05 00 0A 01 05 00 00 这样的模式反复出现,都可以参考以上8个数据的描述,应该不需更多的解释了。具体地址如下:
佣兵1: 60ac - 60b3
佣兵2: 60b8 - 60bf
佣兵3: 60c4 - 60cb
佣兵4: 60d0 - 60c7
佣兵5: 60dc - 60e3
佣兵6: 60e8 - 60ef
佣兵7(召唤兽): 60f4 - 60fb

★ 60b4: ?
★ 60b5: ?

★ 60b6: 指令——00 - 移动, 01 - 攻击, 02 - 防御, 03 - 手动

★ 60b7: ?

60c0: 敌我Unit表示: 01 - Friend, 03 - NPC, 04 - Enemy 1, 08 - Enemy 2
说明1: 游戏中确实存在两个势力的敌军,证据有三 (at least)
1. 相信各位应该都知道22话所发生的事。就此数值而言,22话的进程实质上如下: 巴恩哈特出现前,所有敌军部队皆为08;巴恩哈特出现后,魔族势力部队保持08不变,帝国势力部队全部变成04。因此才能出现"黑吃黑"的场面。(要抢经验值,赶快啊 )
2. 在?4话,除巴恩哈特为08外,所有敌军皆为04,因此才出现了巴恩哈特与依格贝尔特交战的场面。要是运气好,有多个敌人围攻巴恩哈特,并且把他干掉,那就立刻过关了。虽然?4的胜利条件写明了是敌全灭,但实际上却是击倒巴恩哈特,而且无论我方敌方,谁击倒他都一样,立刻过关。
3. 在第1话,把利昂(04)改成08,他就会去找利亚德(04)的麻烦...

这些证据应该已经足够说明问题了吧?

★ 60c1: ?
★ 60c2: ?
★ 60c3: ?
★ 60cc: ?
★ 60cd: ?

★ 60ce: Level: 01h - 0Ah -> Lv 1 - Lv 10
★ 60cf: EXP 最大可有FF(255),这也是我方到达最终职业Lv10后仍能继续积累EXP的原因。

★ 60d8: MP (分子)
★ 60d9: MP上限 (分母)(我比较习惯这样叫)
★ 60da: AT (去除装备影响)
★ 60db: DF (去除装备影响)

说明:在这里可以修改AT、DF及MP值,并且是立即生效。但是各位将很快发现一个令人头痛问题,那就是当过关后,虽然对AT和DF的修改仍然有效,但是MP却恢复成了修改前的数值。这是为什么?

首先,在这个游戏中,所有影响AT和DF的装备都是"0次函数",也就是说,只是简单的加多少或减多少,因此只需要记住去除装备影响的AT和DF,不管是等级上升还是换其它装备造成最终的AT和DF发生变化,都绝不会弄错。

但是MP不同,至少有一件道具,也是唯一一件会影响MP的道具——水晶球(オーブ),它对MP的影响却是"一次函数",New_MP = Org_MP× 2。而各位也应该注意到了,在MP旁边,我并没有写"去除装备影响",也就是说,如果装备上了オーブ,这里将记录下MP翻番后的数值。

为什么这个MP值不像AT、DF那样是"去除装备影响"呢?因为如果这里只记录MP原始值,并且角色装备了オーブ上战场的话,一旦在战场上升了级,使MP增加,比如说,加了2点,那么在战场上应该是加2还是加4?当然应该是加2,否则对其他没有装备オーブ的角色就是不公平。既然只能是加2,那就没办法通过简单的原始值乘以2来获得这个新数值。因此,唯一的结论是,战场上的MP值(即这里所存储的数值)与真正的MP值毫无关系,是一个完全独立的数值。所以这里一定不能是"去除装备影响"。

但是这又有了新问题,如果在战场上升了级,使MP增加,并且必须加在这个翻番后的数值上,那么,等到把这个オーブ卸下来的时候,MP该怎么算?总不能简单一除2了事吧,那不就亏了吗?

所以解决方案很简单,就是始终在另一个地方记下"原始MP值",要是等级上升造成MP增加,这个数值就跟着变,每次卸下オーブ时,或者每次过关时,就把MP恢复成这个原始值。这个数值在离这里相对较远的地方(Ref: a531)。不过通过以上的说明,要查找它应该很容易吧?

★ 60e4: Move (去除装备影响)
★ 60e5: 指挥范围 (去除装备影响)
★ 60e6: AT修正 (去除装备影响)
★ 60e7: DF修正 (去除装备影响)

★ 60f0: 魔法防御
说明1: 确认这个数值的作用可谓一大突破。Thanks to my intuition and inspiration!
说明2: 魔法防御 != 魔法耐性。两者并不等同。具体内容请见我的另一篇文章"Langrisser II (MD) 魔法攻防机制 彻底解析"。

★ 60f1: 魔法 16 - 23
★ 60f2: 魔法 8 - 15
★ 60f3: 魔法 1 - 7

说明: 60f3的最低位,即最右边一位(bit),表示是否会魔法 (0 = 不会, 1 = 会),如果此位为1,则必须保证这三个字节(byte)的其余23位中至少有一位为1,否则立刻死机。

这三个字节的其余23位,分别表示22种普通魔法+ 召唤魔法 (0 = 不会, 1 = 会)。所以如果要学会所有魔法的话,很简单,全部改成FF,即 FF FF FF。

★ 60fc: Charm (魅惑魔法、チャーム)
说明: 这个数据有点复杂,先举个例子吧。因为是拿敌人作例子,下面提到的60c0,60fc等地址,都表示这个敌人的、相对应海恩在60c0,60fc处的地址。

假设现在对敌方角色使用Charm,则在60c0处,原本为04(Enemy),现变为03(NPC),而这个地方 -- 60fc -- 则变成04,表示在中了Charm之前60c0处为04,一旦清醒,就把这里的04恢复到60c0处,重新变成Enemy。

换句话说,60fc就是60c0的"暂存池",是中了Charm的时候临时存放60c0数值的地方;在角色恢复清醒后,就把60fc的数值送回60c0。因此不管60c0处原先数值是什么,我方也好,敌人也好,NPC也好,只要修改了这里(60fc)的数值,就成为Charm状态,并且经过一定时间,恢复清醒后,则成为这里修改后数值的势力 -- 如果60fc被改为01,则清醒后成为我方,若改为03则清醒后成为NPC,以此类推。

★ 60fd: 召唤兽MP。召唤兽是无法补充MP的,不需要"分子"、"分母"之类,这一个数值就足够了。

★ 60fe: ?

★ 60ff: 指挥官肖像。要是您希望角色的表情"丰富"些,尽管在这里搅混水好了。

Section 2:

以下数据来自强化后的海恩ヘイン,总计24个。之所以不用第一话的数据,是因为一开始这里很多数据都是00,看上去不太直观。另外要说明的是,敌方是没有这24个数据的。

0000a530h: 26 63 0A FF 48 3F 5F FF FF FF 7F FF 00 11 0D 18
0000a540h: 1F 02 03 15 00 0A 08 00

各个角色在第2区的24个数据的地址是按照我方人物代码排列的,顺序和位置都不会变动,现将首地址列出:
01 - エルウイン:a4d0
02 - リアナ :a4e8
03 - ラーナ :a500
04 - シェリー :a518
05 - ヘイン :a530
06 - スコット :a548
07 - キース :a560
08 - アーロン :a578
09 - レスター :a590
0A - ジェシカ :a5a8

"ar" = auto-refreshed
注意:之后会看到这个标记的出现,表示这个数据在战场上是不会有任何改变的(即使是等级上升或者转职而造成状态改变,这里也不会随之改变)。但是,当过关的时候,这个数据将会自动被改写为新值。换言之,这个数据没有任何修改价值,系统会自动帮我们更新的。(多半是为了过关时Save而设计)

★ a530:职业 (ar)

★ a531:MP原始值。过关时,或者在卸下水晶球オーブ时,角色的MP值将会被这个数值取代 (ref 60d8,60d9)
说明:正是由于敌方没有这个数据,因此无法得知?4章的埃克贝尔特(エグベルト)的MP值究竟有多少,他的MP值早就被那个オーブ塞爆了。

★ a532: Level (ar)
★ a533: EXP (ar)
★ a534: AT (ar)
★ a535: DF (ar)
★ a536: 魔法防御 (ar)
★ a537-a539: Magic (ar)

★ a53a-a53b: 可雇佣的佣兵,总计16位(bit),分别代表不同的佣兵 (0 = 不能雇, 1 = 可以雇)
从最低位到最高位,即从右向左,分别是:

a53a 

a53b

XXXX  XXXX XXXX  XXXX
15

8

7

0

0 - 枪兵 パイク
1 - 重装枪兵 ファランクス
2 - 步兵 ソルジャー
3 - 斗士 グラディエーター
4 - 重装步兵 アーマソルジャー
5 - 骑兵 ホースマン
6 - 重装骑兵 ヘビーホースマン
7 - 龙骑兵 ドラグーン
8 - 精灵射手 エルフ
9 - 弩车 バリスタ
10- 僧侣 モンク
11- 卫兵 ガードマン
12- 人鱼战士 マーマン
13- 狮鹫 グリフォン
14- 天使 エンジェル
15- 市民 シビリアン

请注意最高位所表示的市民シビリアン是个非法数值,是不可以雇的(如果您不想死机的话),所以要修改成能够雇佣全部15种佣兵的话,应改为 7F FF。

值得一提的是,如果不作任何修改,利斯塔(レスター)是唯一能够得到全部兵种的角色。

★ a53c: ?

★ a53d: 指挥官肖像 (maybe ar)

★ a53e-a540: 装备 (ar)
★ a541: 指令 (ar)

★ a542-a543: 击破数
说明: 与一般电脑游戏不同,这里a542是高位,a543是低位,因此 03 15 = 315h = 789

★ a544: 败北回数
说明: 职业,击破数和败北回数会对人物的结局产生影响。

★ a545: AT修正积分
★ a546: AT修正奖励
说明:每关初始,每个角色都有6分,每损失一个佣兵扣1分(如果不带佣兵,并活着过关,可以拿满6分)。过关后,这个分数就累计到"a545:AT修正积分"上,每次加满16分则从0重新计起,同时"a546:AT修正奖励"增加1,这个角色的AT修正也就增加了1点。

这也就是为什么角色的AT修正会"莫名其妙"增加的原因。但是这个奖励是有上限的,为8点。一旦a546的数值到达8,就不再会增加了。

★ a547: ?


PART II: Item List    (Top)

0000c7f0h: 00 00 00 00 00 00 0E 01 18 01 1F 01 0D FF FF FF
|                     .……
0000c840h: FF FF FF FF FF FF ...

有效数据从c7f6开始,到c845为止,总80个数据,每2个一组,共40组,代表道具库可容纳40件道具。

一组数据中,前一个为道具代码,后一个为人物代码,表示这件道具装备在这个人物身上。如果道具代码为FF,则为空;如果人物代码为FF,则表示没有人装备这件道具。

以这个例子来说,目前共有4件道具。主人公艾尔文(01)装备了 魔剑アルハザード(0E),幻象法袍ミラージュローブ(18),王冠クラウン(1F)还有1件暗黑之杖ダークロッド(0D),目前无人装备。


PART III: Money  (Top)

0000bd70h: 00 00 01 F0 00 00 ...

★ bd72-bd73: Money
其中bd72是高位,bd73是低位。如 01 F0 = 1F0h = 496,而反映到游戏中时,还会被加上个'0',即4960。因此我们看到的金钱数实际上是把这个数值放大10倍所得。两个字节(byte)的最大值为FFFFh = 65535,也就是说在游戏中金钱的最大值为655350。

■ 总结陈词  (Top)

我研究了很多数据,写了这一大堆报告,虽然号称是为了"修改",但实际上仅仅是为了满足好奇心,想知道那些数据到底是作什么用的(这就是"初初级"Crack );同时也是因为对于这款经典作品的喜爱之情,要知道,我从来没有对第二个游戏做过这样的分析。如果说要"修改"的话,真正值得修改的数据其实没几个。

就我个人而言,利用这些资料,做过这些事情:
1. 由于在魔法研究上的突破,使我得以完成一份彻底的魔法研究报告: "Langrisser II (MD) 魔法攻防机制 彻底解析"。

2. 让主人公装备上魔剑,相信这也是很多人的梦想。

3. 让自己喜欢的角色有全魔法和全兵种。

4. 创造一支"合理"的部队。当我们不停地拿魔导石反复训练的时候,角色的各个数值总是存在很多"不合理"(比如攻防过高或攻防失衡)。我就以敌人的数据为基准,造就了一支在AT、DF、MP、道具、佣兵、魔法、职业上都"合理"的部队。当然,这个"合理"是根据我的标准,相信在这一点上,每个人都有自己的标准。

5. 增加一些其它的乐趣。比如说在第1话把莉娅娜变成自己控制,让她召唤一个"兄贵"来做保镖,KK那位可怜的仁兄巴鲁多,场面颇为有趣。

6. The most important: the feeling of accomplishment

---------
 注1
以下资料的来源说明:
60a2: 数据"80"的含义参考了"梦幻模拟战II专题" http://cg1000.yeah.net/
60a4: 部分参考了"梦幻模拟战II专题" http://cg1000.yeah.net/
a545: 参考了alvin兄的提示,正是因为这个提示,我才能进一步深究,彻底弄清这个数据的用途。

在此对其他资料提供者一并表示感谢。

■  EOF