» 您尚未 登录   注册 | 社区银行 | 社区婚姻 | 社区成就 | 帮助 | 社区 | 无图版


火花天龙剑 -> 火炎之纹章 -> 火花学园 -> 再次请教关于转换人物头像的问题。希望知晓的朋友不吝赐教。
 XML   RSS 2.0   WAP 

本页主题: 再次请教关于转换人物头像的问题。希望知晓的朋友不吝赐教。 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
fireodin

该用户目前不在线
级别: 火花会员
编号: 11312
精华: 0
发帖: 866
威望: 0 点
配偶: 单身
火 花 币: 33936 HHB
注册时间:2003-08-23
最后登陆:2018-11-05
查看作者资料 发送短消息 引用回复这个帖子
再次请教关于转换人物头像的问题。希望知晓的朋友不吝赐教。

按照以前几位好心的朋友提供的讲解,目前我已经能自由地将776的人物头像换成系谱的,或将系谱的头像换成776的。

只是苦于无法转换法拉版,狮子王版系谱的头像。这几个补丁好象是万年雷打不动的臭胶布一样,贴上去后无论我怎样改,还是那些头像。

希望以前赐教过的朋友,继续赐教一翻。

[楼 主] | Posted:2008-05-07 00:34| 顶端
Werther

头衔:依然火星时代!依然火星时代!
该用户目前不在线
级别: 火花会员
编号: 8033
精华: 0
发帖: 479
威望: 0 点
配偶: 单身
火 花 币: 2 HHB
注册时间:2003-06-05
最后登陆:2024-09-24
查看作者资料 发送短消息 引用回复这个帖子


估计这两个版本只是改头像地址,未动头像数据。[Reply by WAP]
[1 楼] | Posted:2008-05-07 01:50| 顶端
fireodin

该用户目前不在线
级别: 火花会员
编号: 11312
精华: 0
发帖: 866
威望: 0 点
配偶: 单身
火 花 币: 33936 HHB
注册时间:2003-08-23
最后登陆:2018-11-05
查看作者资料 发送短消息 引用回复这个帖子


感谢剑诗雨同志几翻赐教,上面一席话,又点醒了我。

经过目前试验。法拉版系谱,改动尤丽雅头像,实际上会改动子世代的雷文头像。而改动子世代托拉斑托的头像,才会更改尤丽雅头像。改动菲的头像,会把阿里昂的头像换了。改塞提的头像,其实是把拉娜的改了。

看来要把法拉版改成自己喜欢的理想状态,非先做一翻试验不可。

而且有一部分人物头像数据长度不一样,替换上去会死机。

再次感谢剑诗雨。


[ 此贴被fireodin在2008-05-07 13:28重新编辑 ]

[2 楼] | Posted:2008-05-07 11:40| 顶端
fireodin

该用户目前不在线
级别: 火花会员
编号: 11312
精华: 0
发帖: 866
威望: 0 点
配偶: 单身
火 花 币: 33936 HHB
注册时间:2003-08-23
最后登陆:2018-11-05
查看作者资料 发送短消息 引用回复这个帖子


有的头像换动好麻烦的说,可能是我太笨了吧。

比如尤里乌斯和尤里娅头像的数据都是1388个,而托拉班托的头像数据则是1435个。换的时候,我事先手动把托拉班托的最后47个数据改了。然后再从头开始贴上尤里乌斯头像的1388个数据。这样才成功把头像换过来。

[3 楼] | Posted:2008-05-07 15:16| 顶端
Werther

头衔:依然火星时代!依然火星时代!
该用户目前不在线
级别: 火花会员
编号: 8033
精华: 0
发帖: 479
威望: 0 点
配偶: 单身
火 花 币: 2 HHB
注册时间:2003-06-05
最后登陆:2024-09-24
查看作者资料 发送短消息 引用回复这个帖子


一个一个的实验出规律,对于某些事情来说是可以的。但是用到这里我认为是极蠢的方法。
可以说你有点幸运,因为我现在还在放自己的五一假期,明天回归工作的地方才结束。就抽疯一下给你讲解下

我自己对SNES的游戏HACK的方法。
我们对这些SNES的修改过的ROM的HACK通常采用的方法(对原始ROM也通用),也是最根本最有用的方法(个人认为而已哈哈~)。就是通过阅读运行的游戏程序来解析。以角色的头像修改为例子吧:
需要准备的工具,能DUMP出SNES游戏的显存的ZSNES模拟器;带DEBUGGER功能的ZSNES模拟器。
任何一个版本的TLP,当然还有个16进制的编辑器。
TLP,16进制的编辑器网上可以很容易下来。
能DUMP出SNES游戏显存、带DEBUGGER功能的ZSNES模拟器;都可以在ZSNES小组的官方站上下载到。
能DUMP出SNES游戏显存:ZSNES v1.10 (DOS port)
http://www.zophar.net/zsnes/archives.html

带DEBUGGER功能的ZSNES:1.4,1.5版本的都可以,但只要DOS版本的。
http://www.zsnes.com/index.php?page=files

使用方法,模拟器附带的说明有,英文的,应该会一点的吧!!!

下面举个应用的例子吧:
手头没有FALA版本ROM,就拿原ROM测试吧!

1]使用ZSNES v1.10,DOS下的命令:ZSNES -D -DD FE4.SMC
就进入DEBUGGER模式,在游戏运行到如图(刚德鲁夫)说话时,

退出整个游戏,
然后用TLP打开ZSNES v1.10 (DOS port)根目录下的vram.dat,我们在地址$7800的地方看到刚德鲁夫的
头像TILE。


2]这一步我们来DUMP游戏程序,简单说下系谱显示角色头像的步骤:游戏程序先从ROM里读取需要显示的
头像地址,然后进入这个地址,对存放在ROM这个地址的头像数据进行解压处理,先解压到某个内存地址,再通

过DMA传输到VRAM显存,就有了第一步里在地址$7800查看到的刚德鲁夫的头像TILE。后续程序把显存这部分显

示数据写显就在屏幕上显示了。
正题:
在大地图上刚德鲁夫即将要说话,还没有头像出来就开始DUMP游戏程序。如何

DUMP,请查看模拟器附带的说明。

第一步得到的头像地址$7800,搜索DUMP的程序:搜索A:3c00(为什么不是7800?而是7800的一半?snes游戏的

DMA地址设置就是取目标地址的一半,原因我也不懂~~如同1+1为什么=2不等于3?=_=b)
0a5af STA $034c,X [80034c] A:0880 X:0000 Y:fffe S:1f9b DB:80 D:0000 P:a1 e
80a5b2 REP #$20         A:0880 X:0000 Y:fffe S:1f9b DB:80 D:0000 P:a1 e
80a5b4 LDA $02   [000002] A:0880 X:0000 Y:fffe S:1f9b DB:80 D:0000 P:81 e
80a5b6 STA $034d,X [80034d] A:3c00 X:0000 Y:fffe S:1f9b DB:80 D:0000 P:01 e
80a5b9 LDA #$00         A:3c00 X:0000 Y:fffe S:1f9b DB:80 D:0000 P:01 e
80a5bc STA $034f,X [80034f] A:0000 X:0000 Y:fffe S:1f9b DB:80 D:0000 P:03 e
...............
往下就是DMA了。
.................以下开始DMA传输刚德鲁夫头像数据到显存的程序
80a37a JMP ($a37d,X)[80a3ce] A:0004 X:0004 Y:0000 S:1fde DB:80 D:0000 P:00 e
80a3ce SEP #$20           A:0004 X:0004 Y:0000 S:1fde DB:80 D:0000 P:00 e
80a3d0 LDA $0347,Y [800347] A:0004 X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a3d3 STA $4312   [804312] A:0088 X:0004 Y:0000 S:1fde DB:80 D:0000 P:a0 e
80a3d6 LDA $0348,Y [800348] A:0088 X:0004 Y:0000 S:1fde DB:80 D:0000 P:a0 e
80a3d9 STA $4313   [804313] A:00d3 X:0004 Y:0000 S:1fde DB:80 D:0000 P:a0 e
80a3dc LDA $0349,Y [800349] A:00d3 X:0004 Y:0000 S:1fde DB:80 D:0000 P:a0 e
80a3df STA $4314   [804314] A:007e X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a3e2 LDA $034a,Y [80034a] A:007e X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a3e5 STA $4315   [804315] A:0000 X:0004 Y:0000 S:1fde DB:80 D:0000 P:22 e
80a3e8 LDA $034b,Y [80034b] A:0000 X:0004 Y:0000 S:1fde DB:80 D:0000 P:22 e
80a3eb STA $4316   [804316] A:0008 X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a3ee LDA $034c,Y [80034c] A:0008 X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a3f1 STA $2115   [802115] A:0080 X:0004 Y:0000 S:1fde DB:80 D:0000 P:a0 e
80a3f4 LDA $034d,Y [80034d] A:0080 X:0004 Y:0000 S:1fde DB:80 D:0000 P:a0 e
80a3f7 STA $2116   [802116] A:0000 X:0004 Y:0000 S:1fde DB:80 D:0000 P:22 e
80a3fa LDA $034e,Y [80034e] A:0000 X:0004 Y:0000 S:1fde DB:80 D:0000 P:22 e
80a3fd STA $2117   [802117] A:003c X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a400 LDA #$8d01         A:003c X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a402 STA $4310   [804310] A:0001 X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a405 LDA #$8d18         A:0001 X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
80a407 STA $4311   [804311] A:0018 X:0004 Y:0000 S:1fde DB:80 D:0000 P:20 e
///////////
这有什么用?如果你了解一点DMA知识就很容易理解,从那里来的解压了的头像数据?从寄存器

$4312~$4313~$4314可以得到了这个内存地址$7ed388,就是从$7ed388开始DMA的。
搜索这个地址$7ed388
我们得到如下的程序:
80ac6a LDA $cb     [0000cb] A:8000 X:d388 Y:c4f6 S:1f8b DB:7e D:0000 P:80 e
80ac6c CLC             A:001e X:d388 Y:c4f6 S:1f8b DB:7e D:0000 P:00 e
80ac6d ADC #$03           A:001e X:d388 Y:c4f6 S:1f8b DB:7e D:0000 P:00 e
80ac70 LSR A             A:0021 X:d388 Y:c4f6 S:1f8b DB:7e D:0000 P:00 e
80ac71 TAY             A:0010 X:d388 Y:c4f6 S:1f8b DB:7e D:0000 P:01 e
80ac72 PLA             A:0010 X:d388 Y:0010 S:1f8b DB:7e D:0000 P:01 e
80ac73 STA $0000,X [7ed388] A:0000 X:d388 Y:0010 S:1f8d DB:7e D:0000 P:03 e
80ac76 INX             A:0000 X:d388 Y:0010 S:1f8d DB:7e D:0000 P:03 e
80ac77 INX             A:0000 X:d389 Y:0010 S:1f8d DB:7e D:0000 P:81 e
80ac78 DEY             A:0000 X:d38a Y:0010 S:1f8d DB:7e D:0000 P:81 e
80ac79 BNE $ac73   [80ac73] A:0000 X:d38a Y:000f S:1f8d DB:7e D:0000 P:01 e
80ac73 STA $0000,X   [7ed38a] A:0000 X:d38a Y:000f S:1f8d DB:7e D:0000 P:01 e
..................以上是开始解压ROM里的头像数据。那头像数据在ROM里那里?
既然开始解压了,再往上读几句程序就会发现的LDA [$c8],Y这一句,这句是根据Y值的不同对数据连续解压。
80ac58 BEQ $ac5d   [80ac5d] A:8000 X:d388 Y:c4f5 S:1f8f DB:7e D:0000 P:22 e
80ac5d LDA [$c8],Y   [cc44f5] A:8000 X:d388 Y:c4f5 S:1f8f DB:7e D:0000 P:22 e
80ac5f INY             A:8000 X:d388 Y:c4f5 S:1f8f DB:7e D:0000 P:22 e
80ac60 BNE $ac65   [80ac65] A:8000 X:d388 Y:c4f6 S:1f8f DB:7e D:0000 P:a0 e
..........
继续往上搜索第一个LDA [$c8],Y~~再往上一点~就到这里~
8ab379 LDA $8ab4f9,X [8ab5bc] A:00c3 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab37d STA $65     [000065] A:44f3 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab37f LDA $8ab4fa,X [8ab5bd] A:44f3 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab383 STA $66     [000066] A:cd44 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
8ab385 LDA #$00           A:cd44 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
8ab388 STA $6b     [00006b] A:7e00 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab38a LDA #$88           A:7e00 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab38d CLC             A:8b88 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
8ab38e ADC #$00           A:8b88 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
8ab391 STA $6a     [00006a] A:d388 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
8ab393 PHX             A:d388 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
8ab394 JSL $95a3fb         A:d388 X:00c3 Y:0001 S:1f97 DB:8a D:0000 P:80 e
95a3fb LDA $65     [000065] A:d388 X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:80 e
95a3fd STA $c8     [0000c8] A:44f3 X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:00 e
95a3ff LDA $6a     [00006a] A:44f3 X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:00 e
95a401 STA $cb     [0000cb] A:d388 X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:80 e
95a403 SEP #$20           A:d388 X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:80 e
95a405 LDA $67     [000067] A:d388 X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:a0 e
95a407 STA $ca     [0000ca] A:d3cd X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:a0 e
95a409 LDA $6c     [00006c] A:d3cd X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:a0 e
95a40b STA $cd     [0000cd] A:d37e X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:20 e
95a40d REP #$20           A:d37e X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:20 e
95a40f JSL $80aa02         A:d37e X:00c3 Y:0001 S:1f94 DB:8a D:0000 P:00 e
80aa02 PHP             A:d37e X:00c3 Y:0001 S:1f91 DB:8a D:0000 P:00 e
80aa03 PHB             A:d37e X:00c3 Y:0001 S:1f90 DB:8a D:0000 P:00 e
80aa04 REP #$30           A:d37e X:00c3 Y:0001 S:1f8f DB:8a D:0000 P:00 e
80aa06 LDY $c8     [0000c8] A:d37e X:00c3 Y:0001 S:1f8f DB:8a D:0000 P:00 e
80aa08 BMI $aa1b   [80aa1b] A:d37e X:00c3 Y:44f3 S:1f8f DB:8a D:0000 P:00 e
80aa0a TYA             A:d37e X:00c3 Y:44f3 S:1f8f DB:8a D:0000 P:00 e
80aa0b CLC             A:44f3 X:00c3 Y:44f3 S:1f8f DB:8a D:0000 P:00 e
80aa0c ADC #$00           A:44f3 X:00c3 Y:44f3 S:1f8f DB:8a D:0000 P:00 e
80aa0f TAY             A:c4f3 X:00c3 Y:44f3 S:1f8f DB:8a D:0000 P:80 e
80aa10 LDA #$00           A:c4f3 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:80 e
80aa13 STA $c8     [0000c8] A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:80 e
80aa15 SEP #$20           A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:80 e
80aa17 DEC $ca     [0000ca] A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:a0 e
80aa19 BRA $aa1f   [80aa1f] A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:a0 e
80aa1f STZ $d2     [0000d2] A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:a0 e
80aa21 STZ $d1     [0000d1] A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:a0 e
80aa23 LDA $cd     [0000cd] A:8000 X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:a0 e
80aa25 PHA             A:807e X:00c3 Y:c4f3 S:1f8f DB:8a D:0000 P:20 e
80aa26 PLB             A:807e X:00c3 Y:c4f3 S:1f8e DB:8a D:0000 P:20 e
80aa27 LDX $cb     [0000cb] A:807e X:00c3 Y:c4f3 S:1f8f DB:7e D:0000 P:20 e
80aa29 JMP $80abca         A:807e X:d388 Y:c4f3 S:1f8f DB:7e D:0000 P:a0 e
80abca LDA [$c8],Y   [cc44f3] A:807e X:d388 Y:c4f3 S:1f8f DB:7e D:0000 P:a0 e
.............................
以上是对头像所在地址进行解压前的设置来的~JMP $80abca是进入解压子程序。
$65、 $66 这两个内存地址是存放刚德鲁夫头像数据所在的地址:$cd44f3

需要注意的是$cd44f3这个地址是SNES地址,即SNES游戏里执行的地址,需要转换成ROM地址,
转换算法:SNES地址 - $c00000 + $200 = ROM地址(FE4有Header:$200)
那么:$cd44f3 - $c00000 + $200 = $d46f3
在ROM里$d46f3~d4997:E0 1E 00 0F 03 07 07 0D 0A 19 16......FF(FF结束解压)这段便是刚德鲁夫头像数据

。做个简单测试,把这些数据修改一点就会发现刚德鲁夫的头像显示出现花碌碌的现象。

3]我们也可以再进一步,$d46f3这个地址是存在ROM里的那里的?$d46f3的SNES地址是$cd44f3,ROM里存放这个

地址也是以SNES地址方式存放的,ROM的存放应该就是f3 44 cd了。
在上步中的这段里:
8ab379 LDA $8ab4f9,X [8ab5bc] A:00c3 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab37d STA $65     [000065] A:44f3 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab37f LDA $8ab4fa,X [8ab5bd] A:44f3 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:00 e
8ab383 STA $66     [000066] A:cd44 X:00c3 Y:0001 S:1f99 DB:8a D:0000 P:80 e
//////////
LDA $8ab4f9,X [8ab5bc]
LDA $8ab4fa,X [8ab5bd]
就是这个地址$8ab5bc,转换成ROM地址:$8ab5bc-$800000+$200=$ab7bc
?为什么这次是减$800000?不是- $c00000?,$800000与$c00000是等同的。$900000与$d00000是等同的。再

详细的资料可以在以下这个站找来看~~~不要说英文头疼~~想要学点东西,不吸点老外的东西是不行的
有非常丰富的SNES软硬件资料,说个大话,如果你熟知了这些资料~改FE4容易如切菜~~当初我花了近一个月的空

余时间来看这些资料~65816~6502都有比较全面的资料~
http://www.romhacking.net/docs/

继续:
在ROM地址 $ab7bc :F3 44 CD这个便是刚德鲁夫的头像设置地址。改这个F3 44 CD数据,即可改了其显示
的头像~
法拉版便是用这个修改方法~~
以上是HACK系谱头像的方法,我一般用的也是这种方法,如果那位仁兄有更好更简单点的方法,不妨告之~~
4]回归~~~LS如果无视了我以上的也无所谓~~~
我们结合已经有的数据来修改头像~~
ROM地址$AB6F9~?结束地址偶没太多时间判断到哪里结束!!
$AB6F9:B5 65 CA(即$CA65B5->ROM地址为$A67B5~$A6D55:F5 00 01 01 01 61 03.....00 FF)是辛格尔德的头像

数据。

ROM地址$AB6F9开始,每三个字节为一个角色的头像地址。B5 65 CA是辛格尔德;56 6B CA是诺伊修.........
结合Z君的
http://bbs.fireemblem.net/read.php?tid=152255&fpage=2
还有S君的
http://bbs.fireemblem.net/read.php?tid=157967&fpage=1
的资料~~
在$AB6F9地址开始的一片区域搜索其头像地址~~~修改起来也容易~~法拉版就可以做出来了~~如果再想改对话~

涉及的知识也不是一句两句能说清楚的~~~以后有足够的空闲再说吧~~
[s:2]
有误请指出~~~


长江后浪推前浪,前浪死在沙滩上。
[4 楼] | Posted:2008-05-07 15:45| 顶端
fireodin

该用户目前不在线
级别: 火花会员
编号: 11312
精华: 0
发帖: 866
威望: 0 点
配偶: 单身
火 花 币: 33936 HHB
注册时间:2003-08-23
最后登陆:2018-11-05
查看作者资料 发送短消息 引用回复这个帖子


感谢,感谢,现在像您这么热心的朋友不多了。
[5 楼] | Posted:2008-05-08 20:01| 顶端

火花天龙剑 -> 火花学园




Powered by PHPWind v3.0.1 Code © 2003-05 PHPWind
辽ICP备05016763号
Gzip enabled

You can contact us