爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 49789|回复: 117
收起左侧

[软件] 【0110汉化组荣誉出品】3D宠物鱼汉化修正版,可以存档啦!

[复制链接]
发表于 2005-10-18 15:24:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
中文名称:3D宠物鱼
英文名称:3D Pet Fish
版本:1.0
授权:xx版
分类:养成类游戏
已通测试机型:sx1,理论上适用任何s60机型。
汉化:小毛

软件说明:
经典的3D宠物鱼游戏,修正了不能存档的问题,修正过程见1楼的教程。
重新进行汉化。

第一次运行提示注册,直接选试用就完成注册了。
安装卸装:
无特殊说明。

[ 本帖最后由 小毛 于 2005-10-21 12:02 编辑 ]
pic.jpg

3D宠物鱼_汉化修正版_by_小毛.SIS

262.39 KB, 下载次数: 624

评分

参与人数 1实力分 +3 收起 理由
爱吃肉的猩猩 + 3 技术文章

查看全部评分

 楼主| 发表于 2005-10-18 15:26:49 | 显示全部楼层
PetFish修正教程:

PetFish存在存档问题,原版会将进度存档存入C:\petfish.sav中,但是读取存档却从程序安装目录下读取,比如E:\system\apps\PetFish\petfish.sav。这样就造成了每次读取进度都会失败的问题。

用UE打开PetFish.app,找到PetFish.sav,尝试改为E:\Fish.sav,运行结果是存档的确存入了E:\Fish.sav,但是依然不能正确读取。

于是再次修改,将E:\system\apps\petfish\petfish.sav。这样修改由于原本字节空间不足,所以需要从其他资源的地方借用一部分字节,并且注意将头四个字节的0B修改成21,即资源扩张后的有效长度。
按道理说,如果将这里修改了,存档文件直接写入安装目录,读取的时候就应该可以了,可是试验的结果很令人沮丧...在读取进度的时候程序会报错。

看来简单的用UE修改解决不了这个问题,于是用IDA反编译petfish.app,从代码内核进行分析。

首先找到petfish.sav的资源地址:

.text:10026E70 dword_10026E70  DCD 0xB, 0x650050, 0x660074, 0x730069, 0x2E0068, 0x610073
.text:10026E70                                         ; DATA XREF: sub_10009338:off_10009414o
.text:10026E70                                         ; .text:off_1000A884o

因为是UNICODE,这里没有直接解析成String,你可以对此段Undefine,就可以看到内容。

这个资源被两次调用,先看 DATA XREF: sub_10009338:off_10009414o

text:100093B4                 MOV     R0, #0x174
.text:100093B8                 BL      NewL__6HBufC8i  ; HBufC8::NewL(int)
.text:100093BC                 MOV     R6, R0
.text:100093C0                 ADD     R0, SP, #0x328+var_120
.text:100093C4                 MOV     R1, #0x80
.text:100093C8                 BL      __10TBufBase16i
.text:100093CC                 MOV     R4, SP         
.text:100093D0                 MOV     R0, R4
.text:100093D4                 LDR     R1, =dword_10026E70    ;这里是PetFish.sav调用
.text:100093D8                 BL      sub_1000E25C
.text:100093DC                 ADD     R0, SP, #0x328+var_120
.text:100093E0                 MOV     R1, R4         
.text:100093E4                 BL      Copy__6TDes16RC7TDesC16
.text:100093E8                 MOV     R0, R6
.text:100093EC                 ADD     R1, SP, #0x328+var_120
.text:100093F0                 BL      sub_1000DD8C
.text:100093F4                 CMP     R0, #0
.text:100093F8                 BEQ     loc_10009418
.text:100093FC                 MOV     R0, R6
.text:10009400                 BL      Ptr__C6TDesC8   ; TDesC8::Ptr(void)
.text:10009404                 MOV     R1, R0
.text:10009408                 MOV     R0, R5
.text:1000940C                 BL      sub_10009234
.text:10009410                 B       loc_10009420

这段代码的大致含义是将PetFish.sav与sub_1000E25C调用得到的内容进行拼接。然后调用 sub_1000DD8C及其后的代码。
我们先看看sub_1000E25C是什么:
STMFD   SP!, {R4-R7,LR}
.text:1000E260                 SUB     SP, SP, #0x420
.text:1000E264                 SUB     SP, SP, #8
.text:1000E268                 MOV     R7, R0
.text:1000E26C                 MOV     R6, R1
.text:1000E270                 ADD     R5, SP, #0x43C+var_234
.text:1000E274                 MOV     R0, R5
.text:1000E278                 BL      __6TParse
.text:1000E27C                 MOV     R4, SP
.text:1000E280                 MOV     R0, R4
.text:1000E284                 BL      sub_1000E1F4
.text:1000E288                 MOV     R0, R5
.text:1000E28C                 MOV     R1, R4
.text:1000E290                 MOV     R2, R6
.text:1000E294                 MOV     R3, #0
.text:1000E298                 BL      Set__6TParseRC7TDesC16PC7TDesC16T2 ; TParse::Set(TDesC16 const &,TDesC16 const *,TDesC16 const *)
.text:1000E29C                 MOV     R0, R5
.text:1000E2A0                 BL      FullName__C10TParseBase ; TParseBase::FullName(void)
.text:1000E2A4                 MOV     R1, R0
.text:1000E2A8                 MOV     R0, R7
.text:1000E2AC                 MOV     R2, #0x100
.text:1000E2B0                 BL      __10TBufBase16RC7TDesC16i
.text:1000E2B4                 MOV     R0, R7
.text:1000E2B8                 ADD     SP, SP, #0x28
.text:1000E2BC                 ADD     SP, SP, #0x400
.text:1000E2C0                 LDMFD   SP!, {R4-R7,LR}
.text:1000E2C4                 BX      LR

很显然,这段代码是用来得到程序运行的当前路径。
那么拼接的结果就是 当前路径+petfish.sav。

再看 sub_1000DD8C

.text:1000DD8C                 STMFD   SP!, {R4-R8,LR}
.text:1000DD90                 SUB     SP, SP, #0x2C
.text:1000DD94                 MOV     R8, R0
.text:1000DD98                 MOV     R6, R1
.text:1000DD9C                 ADD     R4, SP, #0x44+var_28
.text:1000DDA0                 MOV     R7, #0
.text:1000DDA4                 STR     R7, [SP,#0x44+var_28]
.text:1000DDA8                 ADD     R5, SP, #0x44+var_30
.text:1000DDAC                 STR     R7, [SP,#0x44+var_30]
.text:1000DDB0                 STR     R7, [R5,#4]
.text:1000DDB4                 MOV     R0, R4
.text:1000DDB8                 MOV     R1, #4
.text:1000DDBC                 BL      Connect__3RFsi  ; RFs::Connect(int)
.text:1000DDC0                 BL      LeaveIfError__4Useri ; User::LeaveIfError(int)
.text:1000DDC4                 LDR     R3, =loc_10026604
.text:1000DDC8                 STR     R3, [SP,#0x44+var_38]
.text:1000DDCC                 STR     R4, [SP,#0x44+var_34]
.text:1000DDD0                 ADD     R3, SP, #0x44+var_38
.text:1000DDD4                 LDMIA   R3, {R0,R1}
.text:1000DDD8                 BL      PushL__12CleanupStackG12TCleanupItem ; CleanupStack::PushL(TCleanupItem)
.text:1000DDDC                 MOV     R0, R5
.text:1000DDE0                 MOV     R1, R4
.text:1000DDE4                 MOV     R2, R6
.text:1000DDE8                 MOV     R3, R7
.text:1000DDEC                 BL      Open__5RFileR3RFsRC7TDesC16Ui ; RFile::Open(RFs &,TDesC16 const &,uint)
.text:1000DDF0                 CMP     R0, R7
.text:1000DDF4                 BEQ     loc_1000DE04
.text:1000DDF8                 BL      PopAndDestroy__12CleanupStack ; CleanupStack::PopAndDestroy(void)
.text:1000DDFC                 B       loc_1000DE78

没错了,这段代码是在读取文件内容。
也就是说,这段代码是处理读进度的功能。

回过头来,在看看对PetFish.sav的另一个调用

.text:1000A7D0                 CMP     R5, #0
.text:1000A7D4                 BEQ     loc_1000A810
.text:1000A7D8                 ADD     R4, SP, #0x1DC+var_1D4
.text:1000A7DC                 MOV     R0, R4
.text:1000A7E0                 MOV     R1, R5
.text:1000A7E4                 BL      Des__6HBufC8    ; HBufC8::Des(void)
.text:1000A7E8                 MOV     R0, R4
.text:1000A7EC                 ADD     R1, SP, #0x1DC+var_188
.text:1000A7F0                 MOV     R2, #0x174
.text:1000A7F4                 BL      Copy__5TDes8PCUci ; TDes8::Copy(uchar const *,int)
.text:1000A7F8                 MOV     R0, R5
.text:1000A7FC                 LDR     R1, =dword_10026E70;这里是PetFish.sav调用
.text:1000A800                 BL      sub_1000DCA0
.text:1000A804                 MOV     R7, R0
.text:1000A808                 MOV     R0, R5
.text:1000A80C                 BL      __builtin_delete
.text:1000A810

这段代码调用了PetFish.sav直接又调用了sub_1000DCA0,我们看看sub_1000DCA0是什么:

text:1000DCA0                 STMFD   SP!, {R4-R7,LR}
.text:1000DCA4                 SUB     SP, SP, #0x60
.text:1000DCA8                 MOV     R7, R0
.text:1000DCAC                 MOV     R5, R1
.text:1000DCB0                 ADD     R4, SP, #0x74+var_54
.text:1000DCB4                 MOV     R3, #0
.text:1000DCB8                 STR     R3, [SP,#0x74+var_54]
.text:1000DCBC                 ADD     R6, SP, #0x74+var_5C
.text:1000DCC0                 STR     R3, [SP,#0x74+var_5C]
.text:1000DCC4                 STR     R3, [R6,#4]
.text:1000DCC8                 MOV     R0, R4
.text:1000DCCC                 MOV     R1, #4
.text:1000DCD0                 BL      Connect__3RFsi  ; RFs::Connect(int)
.text:1000DCD4                 BL      LeaveIfError__4Useri ; User::LeaveIfError(int)
.text:1000DCD8                 LDR     R3, =loc_10026604
.text:1000DCDC                 STR     R3, [SP,#0x74+var_64]
.text:1000DCE0                 STR     R4, [SP,#0x74+var_60]
.text:1000DCE4                 ADD     R3, SP, #0x74+var_64
.text:1000DCE8                 LDMIA   R3, {R0,R1}
.text:1000DCEC                 BL      PushL__12CleanupStackG12TCleanupItem ; CleanupStack::PushL(TCleanupItem)
.text:1000DCF0                 MOV     R0, R6
.text:1000DCF4                 MOV     R1, R4
.text:1000DCF8                 MOV     R2, R5
.text:1000DCFC                 MOV     R3, #0x200
.text:1000DD00                 BL      Replace__5RFileR3RFsRC7TDesC16Ui ; RFile::Replace(RFs &,TDesC16 const &,uint)
.text:1000DD04                 SUBS    R5, R0, #0
.text:1000DD08                 BNE     loc_1000DD78
.text:1000DD0C                 LDR     R3, =loc_10026608
.text:1000DD10                 STR     R3, [SP,#0x74+var_6C]
.text:1000DD14                 STR     R6, [SP,#0x74+var_68]
.text:1000DD18                 ADD     R3, SP, #0x74+var_6C
.text:1000DD1C                 LDMIA   R3, {R0,R1}
.text:1000DD20                 BL      PushL__12CleanupStackG12TCleanupItem ; CleanupStack::PushL(TCleanupItem)
.text:1000DD24                 ADD     R4, SP, #0x74+var_50
.text:1000DD28                 MOV     R0, R4
.text:1000DD2C                 MOV     R1, R6
.text:1000DD30                 MOV     R2, R5
.text:1000DD34                 BL      __16RFileWriteStreamR5RFilei
.text:1000DD38                 LDR     R3, =loc_10026600
.text:1000DD3C                 STMEA   SP, {R3,R4}
.text:1000DD40                 MOV     R3, SP
.text:1000DD44                 LDMIA   R3, {R0,R1}
.text:1000DD48                 BL      PushL__12CleanupStackG12TCleanupItem ; CleanupStack::PushL(TCleanupItem)
.text:1000DD4C                 MOV     R0, R4
.text:1000DD50                 MOV     R1, R7
.text:1000DD54                 BL      WriteL__12RWriteStreamRC6TDesC8 ; RWriteStream::WriteL(TDesC8 const &)
.text:1000DD58                 BL      PopAndDestroy__12CleanupStack ; CleanupStack::PopAndDestroy(void)
.text:1000DD5C                 BL      PopAndDestroy__12CleanupStack ; CleanupStack::PopAndDestroy(void)
.text:1000DD60                 BL      PopAndDestroy__12CleanupStack ; CleanupStack::PopAndDestroy(void)
.text:1000DD64                 MOV     R0, #1
.text:1000DD68                 B       loc_1000DD80

很长,不过很好看懂...这里显然是在写文件,那么就应该是存储进度的地方。

好了,我们回想一下,读写操作有什么不同呢?唯一的差别就是读进度的时候进行了 当前路径+ petfish.sav 的操作。

可以动手修改了,我们可以吧 当前路径+ petfish.sav 去掉,让他和写的时候进行同样的操作。

将一下标记为已注释的部分用NOP指令替换掉,就可以完成修正工作了。
修正之后记录存放在c:\petfish.sav,如果觉得不爽可以自己用UE改成e:\fish.sav

text:100093B4                 MOV     R0, #0x174
.text:100093B8                 BL      NewL__6HBufC8i  ; HBufC8::NewL(int)
.text:100093BC                 MOV     R6, R0
.text:100093C0                 ADD     R0, SP, #0x328+var_120 ; 已注释
.text:100093C4                 MOV     R1, #0x80
.text:100093C8                 BL      __10TBufBase16i ; 已注释
.text:100093CC                 MOV     R4, SP          ; 已注释

.text:100093D0                 MOV     R0, R4
.text:100093D4                 LDR     R1, =dword_10026E70
.text:100093D8                 BL      sub_1000E25C    ; 已注释
.text:100093DC                 ADD     R0, SP, #0x328+var_120 ; 已注释
.text:100093E0                 MOV     R1, R4          ; 已注释
.text:100093E4                 BL      Copy__6TDes16RC7TDesC16 ; 已注释

.text:100093E8                 MOV     R0, R6
.text:100093EC                 ADD     R1, SP, #0x328+var_120 ; 已注释
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-18 15:44:16 | 显示全部楼层
有人下没人顶...这不是0110的作风...
回复 支持 反对

使用道具 举报

发表于 2005-10-18 16:27:25 | 显示全部楼层
辛苦了,我试了能用,谢谢分享,不过好像在没钱时放氧气会错误退出,这是小问题了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-18 16:35:00 | 显示全部楼层
没钱放气泡会退出?这还真没注意。
不过应该是原版的问题。
挺好玩的游戏,就是BUG太多了。
回复 支持 反对

使用道具 举报

发表于 2005-10-18 17:09:50 | 显示全部楼层
还是在自家顶你吧,刚在BWO看到了,没顶勿怪哟!支持精彩分享!尤其是教程!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 17:22:45 | 显示全部楼层
强烈的顶,尤其是这种技术含量超高的帖子,支持小毛
回复 支持 反对

使用道具 举报

发表于 2005-10-18 18:40:30 | 显示全部楼层
第一贴能看懂,第二楼的就不知所云了
回复 支持 反对

使用道具 举报

发表于 2005-10-18 18:41:47 | 显示全部楼层
不定不行
回复 支持 反对

使用道具 举报

发表于 2005-10-18 20:46:43 | 显示全部楼层
原来那个不是也能存么 我正玩着
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-18 20:48:48 | 显示全部楼层
原来那个不能存档后读取不到...难道你不是用SX1的?好像7610的可以存档。

刚才发现一个小笔误,把放大缩小的键写反了,修正了一下。
回复 支持 反对

使用道具 举报

发表于 2005-10-18 21:35:23 | 显示全部楼层
把小毛顶成大毛,嘿嘿..成了毛大..
回复 支持 反对

使用道具 举报

发表于 2005-10-18 21:42:20 | 显示全部楼层
原帖由 ameng 于 2005-10-18 18:40 发表
第一贴能看懂,第二楼的就不知所云了

一样一样哈哈,菜鸟一只:P
回复 支持 反对

使用道具 举报

发表于 2005-10-18 22:47:07 | 显示全部楼层
我的可以继续    然后就载入游戏了 是这样没问题吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-18 22:58:02 | 显示全部楼层
原帖由 三璇儿 于 2005-10-18 22:47 发表
我的可以继续    然后就载入游戏了 是这样没问题吧


能继续上次的进度养就没问题,以前的版本不能继续上次的进度。
回复 支持 反对

使用道具 举报

发表于 2005-10-18 23:49:12 | 显示全部楼层
哦。没来晚,顶一下
回复 支持 反对

使用道具 举报

发表于 2005-10-19 19:36:18 | 显示全部楼层
存档是在哪里?
是不是E:System/app/Petfish/Petfish.sav ????
回复 支持 反对

使用道具 举报

发表于 2005-10-19 21:06:20 | 显示全部楼层
哗 ,利害~~~~~佩服!
二楼的哪些东西我看就好象是天书
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-20 09:22:24 | 显示全部楼层
装上第一次运行提示注册的不用管他,直接试用,下次再进入就是正式版了。

[ 本帖最后由 小毛 于 2005-10-20 13:30 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2005-10-20 10:54:48 | 显示全部楼层
有沒有人可以把存档改在E:System/app/Petfish/Petfish.sav ?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-7-28 04:46

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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