ReverseArk
级别: 注册会员
编号: 11592
精华: 2
发帖: 41
威望: 0 点
配偶: 单身
火 花 币: 34733 HHB
注册时间:2003-09-06
最后登陆:2017-10-14
|
[原创] Langrisser II (MD) 人物内存数据之完全解析
Langrisser II (MD) 人物内存数据之完全解析
作者: ReverseArk contact: gd_hell@citiz.net
** 版权信息 **
文中除少部分内容参考了其它资料外(总共三处,详见文章最后的"注1"),其余内容皆为原创。
转载时请注明作者信息。
** 内容简介 **
本文介绍了Langrisser II (MD)中与人物相关的所有内存数据的含义(我方每人120个,敌方每人96个),以及道具表和金钱的内存数据。对于喜欢修改游戏的人来说,本文将是您手边的必备资料;而对于厌恶修改游戏的人来说,我可以告诉您,其实我也不喜欢修改游戏。既然如此,那又为什么要搞出这么一篇长篇大论来?建议您看看文章最后的"总结陈词",再看看文章的内容,相信您会有所感悟的。
** 注意事项 **
1. 本人所使用的模拟器为'Megasis 0.06a',ROM为'Langrisser II 日文版',所有因模拟器或ROM与此不同所导致的问题,除'Wgens'外,无暇一一顾及,请见谅。
2. 针对Wgens用户的说明:Wgens的内存地址在一个字(word, 16bit)上与Megasis有高低字节(byte)先后的不同,具体说明如下:
以下是Megasis的内存数据表示: 03 05 00 0A 01 00 0D 14 00 00 00 00 6D 05 00 0A 同样的数据,在Wgens中表示为: 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,那么现在开始分析数据。
** 数据分析 ** ---------- MENU: PART I : Character PART II : Item List PART III : Money ----------
PART I: Character
每个角色都有与之相关的数据,我方每个角色的数据为(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: 03 05 00 0A 01 00 0D 14 00 0D 18 1F 6D 05 00 0A 000060b0h: 01 01 0C 14 00 00 00 00 6D 05 00 0A 01 02 0E 14 000060c0h: 01 00 00 00 6D 05 00 0A 01 03 0D 13 00 00 01 00 000060d0h: 6D 05 00 0A 01 04 0D 15 0C 0C 17 0D FF 05 00 0A 000060e0h: 01 05 00 00 05 02 04 02 FF 05 00 0A 01 06 00 00 000060f0h: 3C 00 00 03 FF 05 00 0A 01 07 00 00 00 00 00 11
以下描述中标有"?"的数据,表示用途不明。但是据不可靠观察,这些数据从一开始就一直为00,从来不曾变化过,基本上可以理解为空置。
* 60a0: 职业;03 表示"ウォーロック";同时也是这个数据决定了经验值槽的长度
* 60a1: 人物代码,05表示ヘイン 以下为部分人物的代码: 01 - エルウイン 02 - リアナ 03 - ラーナ 04 - シェリー 05 - ヘイン 06 - スコット 07 - キース 08 - アーロン 09 - レスター 0A - ジェシカ 0D - レオン 0E - ベルンハルト 0F - バルガス 14 - エグベルト 15 - イメルダ 其它人物代码各位可自行尝试。
* 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个数据的。
0 1 2 3 4 5 6 7 8 9 A B C D E F 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
0 1 2 3 4 5 6 7 8 9 A B C D E F 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
0000bd70h: 00 00 01 F0 00 00 ...
* bd72-bd73: Money 其中bd72是高位,bd73是低位。如 01 F0 = 1F0h = 496,而反映到游戏中时,还会被加上个'0',即4960。因此我们看到的金钱数实际上是把这个数值放大10倍所得。两个字节(byte)的最大值为FFFFh = 65535,也就是说在游戏中金钱的最大值为655350。
** 总结陈词 **
我研究了很多数据,写了这一大堆报告,虽然号称是为了"修改",但实际上仅仅是为了满足好奇心,想知道那些数据到底是作什么用的(这就是"初初级"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 **
|
|
[楼 主]
|
Posted:2003-09-10 00:21| |
顶端
| |