页面: 1 2 下一页

私有品分类

九月
28
2010

日本IP代理

7
作者:AirForce

61.213.158.124

分类
标签
十月
15
2009

话说,project-open的确是一个非常优秀的项目管理系统.

通过这次本地化参与.我体会到其系统内部各个模块之间的依赖与交互做的不错.

但是也有不少字符串翻译的让我头疼…即使我有财务方面知识背景,还是翻译的七荤八素.

俚语和惯用语是翻译的老大难,如果大家看到翻译质量有问题,欢迎联系我指正.

www.project-open.org

www.project-open.com

国内:

www.project-open.org.cn

www.project-open.com.cn

http://www.google.com/url?sa=t&source=web&ct=res&cd=4&ved=0CCAQFjAD&url=http%3A%2F%2Fwww.project-open.org%2F&ei=gDjWSoq2NJiI6wOt7YS8Ag&usg=AFQjCNE_qIHelinfxGO6LLqhJALRQgwITQ&sig2=qIBQ3JNYL27z_Yst8_l5Hw
八月
21
2009

TBG迷宫_人物选择界面

TBG迷宫v04

TBG迷宫v05

TBG迷宫v06

这些都是高中的时期做的…有时间再去重构吧…

一月
13
2008

一月
13
2008

战国Rance [土豆视频]

6
作者:AirForce

十月
15
2005

[给AF的]  System35.exe修改备忘录

发表时间: 2005-10-6 17:20:12 | FLOOR ATTIC | | GUESTCODE | 136E9A02A6 |
作者:测二版即将面市

首先说一些和System35的修改不相关的事。
因为估计没几个人能把本文看完,所以在开头说好了……

公告: N天以后将发布测二版, N >= 3 ……, 请大家继续支持测试工作。

希望今后能够每一两个月就发布一个新版本……当然这要看情况。

其实我只是个汉化外行,但对兰斯这个游戏,
似乎有一种缺憾情结吧,故现在作为一项业余爱好在汉化之。
左右大脑轮流使用,也算是一种挺不错的放松。

完毕,以下是纯技术帖。

那天偶然发现,原来AF就是以前汉化大恶司的那位,
汉化靠我这种毫无激情的人终归是不行的,
我对你很期待,故为下文,
概要介绍一下迄今为止我对System35.exe进行的一些修改,
希望能让你及其他有志汉化的人有所参考。

所用的工具是W32Dsm和UltraEdit。

一、 首先要让System35.exe能够显示GB编码的汉字。

用W32Dsm打开System35.exe, 有这么一段:

:00418145 57                      push edi
:00418146 6A00                    push 00000000
:00418148 6A00                    push 00000000
:0041814A 6A00                    push 00000000
:0041814C 6A00                    push 00000000
:0041814E 6880000000              push 00000080
:00418153 6A00                    push 00000000
:00418155 6A00                    push 00000000
:00418157 6A00                    push 00000000
:00418159 FF3540C54700            push dword ptr [0047C540]
:0041815F 6A00                    push 00000000
:00418161 6A00                    push 00000000
:00418163 50                      push eax
:00418164 FF75FC                  push [ebp-04]
* Reference To: GDI32.CreateFontA, Ord:0000h
:00418167 E827400100              Call 0042C193

这里调用了CreateFont()。查看CreateFont()的函数原型,发现是这样的:

HFONT CreateFont(
int nHeight,               // height of font
int nWidth,                // average character width
int nEscapement,           // angle of escapement
int nOrientation,          // base-line orientation angle
int fnWeight,              // font weight
DWORD fdwItalic,           // italic attribute option
DWORD fdwUnderline,        // underline attribute option
DWORD fdwStrikeOut,        // strikeout attribute option
DWORD fdwCharSet,          // character set identifier
DWORD fdwOutputPrecision,  // output precision
DWORD fdwClipPrecision,    // clipping precision
DWORD fdwQuality,          // output quality
DWORD fdwPitchAndFamily,   // pitch and family
LPCTSTR lpszFace           // typeface name
);

注意其中的参数 fdwCharSet, 这个参数指定了字符集。
和这个参数对应的汇编指令是
:0041814E 6880000000              push 00000080

在WinGDI.h中有字符集的定义
#define SHIFTJIS_CHARSET        128
#define GB2312_CHARSET          134
#define CHINESEBIG5_CHARSET     136

push 00000080 是把参数0×80压栈,也就是把字符集指定为SJIS。

现在我们要显示GB编码的汉字,所以需要把该参数指定为GB2312_CHARSET。
只要用UltraEdit把
push 00000080
改成
push 00000086
即可显示汉字。

二、避免乱码及其他不正常现象。

System35中大量使用了半角片假名。这在汉化过程中会造成乱码及命令解析错误等等非正常现象。

所谓半角片假名,是指只占一个字节的片假名。其值范围从0xA0到0xDF。

再举个例子,GB编码的全角空格是两个字节 A1A1, 这两个字节会被System35认为是2个半角片假名,然后System35自动的把半角片假名转换成全角平假名,(如果事先已经改过CreateFont的参数的话,)好好的一个空格就会变成两个汉字,当然是乱码……

再举个例子,汉字B140(盶,不常用,说明问题而已)。System35会把第一个字节B1认为是一个半角片假名(半角的ア,输出时会自动转成全角的あ),那剩下的40怎么办?System35会认为这是一个命令……于是就此走上崩溃之路……

对System35做两个地方的修改就可以分别避免这两个现象。值得一提的是System35对半角片假名的检测有三个地方,其中一个我至今不知道作用,所以一直没改。目前好像挺正常,今后可能也会有修改的必要。

修改位置:
:0041F5B5 807DF8A0                cmp byte ptr [ebp-08], A0
:0041F5B9 7213                    jb 0041F5CE
:0041F5BB 807DF8E0                cmp byte ptr [ebp-08], E0
:0041F5BF 730D                    jnb 0041F5CE
以及
:00424810 807D08A0                cmp byte ptr [ebp+08], A0
:00424814 7304                    jnb 0042481A
:00424816 31C0                    xor eax, eax
:00424818 EB0F                    jmp 00424829
:0042481A 807D08E0                cmp byte ptr [ebp+08], E0

修改方法很多,不赘述。思路就是,取消对0xA0~0xE0进行的特殊处理

三、 做了以上修改后,发现还是有乱码?

有些字符,比如数字和空格,不是直接存放在脚本中,而是经程序转换的。
(脚本中一般使用半角空格20而不用全角空格8140)

修改以下的地方即可:
:0041C5B4 66BF8140                mov di, 4081
:0041C5B8 EB40                    jmp 0041C5FA
:0041C5BA 66BF824F                mov di, 4F82
:0041C5BE EB3A                    jmp 0041C5FA
(类似的地方有多处)

四、 竟然还是有乱码????

这时的问题出在EXE中。把0x00036c00的一串SJIS码改成GB码即可。
(测一版中只改了前两个字节,因为似乎只有空格用到了。等有人报告乱码的时候再说吧,毕竟对程序的改动越小越好)

五、 还会不会有换码了?????

静观其变,发现一处修正一处。

以上修改测一版就完成了,下面的修改将反映在测二版中。

五、支持字体的选择功能。

在日文系统下,测一版也是能够选择字体的,
所以要不是 兄提起,我还不会发现测一版存在这个问题。

非常感谢 兄提供了具体修改方法。

另外还有个小问题,经测试发现,如果直接把80改成86的话,汉化版在日文系统下就无法选择字体了……另外考虑到大陆和台湾都有这个游戏的支持者,所以在实际修改的时候,我稍微变通了一下,允许80,86,88三种类型的字体。

六、汉化了菜单等资源。虽然简陋的程序图标看起来也颇为不舒服……不管它,以后再说。

做这事有现成的工具,如exescope等等,简单易用。

七、最无价值的改动!!!!!!

我有一台破笔记本。配置不错,但CPU是AMD芯片,发热量巨巨巨巨巨巨巨大。一旦CPU100%工作,那么短则10秒,慢则5分钟,机器必定死机。

把任务管理器最小化在任务栏右下角,运行这个游戏,你发现了什么?CPU占用率是永远的100%。这对我的笔记本可是超杀啊!!!!!

于是我另外修改了一个System35.exe,在每次PeekMessage之前,让程序Sleep1毫秒,达到降低CPU使用率的目的。这样改虽然不是没有缺点,但至少这样做能大大降低CPU的发热量。看看任务管理器,cool~~~~靠,爽死老夫了!

在测二版中我将同时提供正常版和COOL版两个EXE。当然对台式机和非AMD芯片笔记本的用户来说,COOL版除了降低游戏流畅度以外,毫无意义。

发表时间: 2005-10-6 17:23:18 | FLOOR 8 | | GUESTCODE | 136E9A02A6 |
作者:测二版即将面市

晕倒,空了HMX-12兄的名字……
(写文时我无法上网,所以把名字空着了)
===========================================================================

五、支持字体的选择功能。

在日文系统下,测一版也是能够选择字体的,
所以要不是HMX-12兄提起,我还不会发现测一版存在这个问题。

非常感谢HMX-12兄提供了具体修改方法。

另外还有个小问题,经测试发现,如果直接把80改成86的话,汉化版在日文系统下就无法选择字体了……另外考虑到大陆和台湾都有这个游戏的支持者,所以在实际修改的时候,我稍微变通了一下,允许80,86,88三种类型的字体。

发表时间: 2005-10-8 18:14:06 | FLOOR 7 |
作者:HMX-12

楼主解释得很详细,我认为一般程序汉化步骤就是修改字符集、字符处理、内码转换/翻译和字体选择(可选),楼主各方面都涉及到,我想也没什么好补充的了。
关于字体选择的修改,我认为字符集的选择必须和CreateFont函数一致,不然的话虽然菜单显示有很多字体,但实际上字符集不一致的字体即使选择了也没有效果。同样有一些修改(如Shift-JIS转GB的字符串)是不能正常运行于非简体系统的,考虑到广大港台支持者,建议楼主在下一次测试时发布单独的繁体中文BIG5版。
刚巧我的笔记本也是AMD的AthlonXP,运行楼主修改的程序一段时间,感觉发热量的确少了一些。话说回来我这个笔记本用了三年多,除了玩一些3D游戏,发热量也没有楼主说得那么夸张,死机的情况也不多。楼主可以试一下装AMD的PowerNow!软件,它会根据需要自动调节CPU频率。另外我发现当玩一些老游戏的时候,调低进程优先级也能够减少CPU使用率。

发表时间: 2005-10-8 18:23:15 | FLOOR 6 |
作者:邪见

要不开个置顶的技术贴吧?

发表时间: 2005-10-8 20:24:27 | FLOOR 5 | | GUESTCODE | 136E9A02A6 |
作者:测二版发布推迟……

>> 我认为字符集的选择必须和CreateFont函数一致,不然的话虽然菜单显示有很多字体,但实际上字符集不一致的字体即使选择了也没有效果。

最初我也是这么想的,但实际上是有效果的。下图是在日文XP上运行汉化版:

http://tinypic.com/eber8y.jpg

其实,我们在中文XP系统上玩Rance日文版时,CreateFont的参数是0×80,枚举到的所有字体却都不是0×80(否则也不会被过滤掉),本身就是不匹配的。

>> 同样有一些修改(如Shift-JIS转GB的字符串)是不能正常运行于非简体系统的,考虑到广大港台支持者,建议楼主在下一次测试时发布单独的繁体中文BIG5版。

这个要看情况。如果字符串是通过CreateFont()输出,那就不会有此问题。如果是通过其他途径,比如CreateMessageBox之类的话,就可能会有问题了……所以修改EXE的0x00036c00的一串SJIS码,是不会有这方面问题的。菜单资源也没问题。目前有问题的窗口标题栏,以及选择“终了”和“截取图片”以后出现的MessageBox。为了这不到20个字维护两个版本,好像不是很有必要。

>> 刚巧我的笔记本也是AMD的AthlonXP,运行楼主修改的程序一段时间,感觉发热量的确少了一些
是吗?不过那个COOL版EXE我应该还没有公布的……  :)。
我这个电脑大概是特例中的特例吧,不管是发热量还是价钱……

发表时间: 2005-10-9 21:20:41 | FLOOR 4 |
作者:HMX-12

看了楼主截图,我的看法是有部分字体是支持多字符集的。例如常见的MS Pゴシック除了支持日语之外,还支持德语、俄语和希腊语等,同样部分中文字体也很有可能支持日文字符集。这样就能解释为什么EnumFontFamilies枚举出的日文字体给CreateFont同样有效。字体方面我觉得和所选择的操作系统有很大关联,还是看一下别人运行的情况再说吧。
关于发热量的问题……可能是主观感受,也可能是之前玩的光碟版播放音乐多占用CPU,要不就是我的RPWT了。-v-||

发表时间: 2005-10-9 21:25:28 | FLOOR 3 | | GUESTCODE | 1EEA954C4118C9 |
作者:鱼肠剑

中文字体都只支持部分日文字符,而且因为编码问题是不能通用的。

不过我手上有几个日文化的中文字体集,如果楼主需要的话可以提供。

发表时间: 2005-10-10 12:01:29 | FLOOR 2 | | GUESTCODE | 136E9A02A6 |
作者:测二版发布推迟……

鱼肠的好东西还真多

简体中文系统对日文支持得还是可以的,
遗憾的是日文系统对简体中文支持得就不怎么样

九月
16
2005

CLONE MAMATOTO的SLG游戏

6
作者:AirForce

战斗(开发中) 点击浏览该文件
内政和战斗准备界面 点击浏览该文件
游戏标题 点击浏览该文件

正在不断开发完善中,包括道具,回合切换,技能,数据存储。
考虑添加最近看到一个ASTAR类库fileshow.asp?boardid=0&id=269882

欢迎大家提出建议或帮忙一起努力。

标签
九月
13
2005

九月
12
2005

/**
+———————————————————+
| |
| Control class |
| version 0.05 |
| 2005.9.11 |
| 作者: af |
| http://www.sound.jp/airforce/ |
| Email:sidealice@yahoo.com.cn |
| |
|=========================================================|
| |
| 全局变量: |
| _global.mapW 地图宽 |
| _global.mapH 地图高 |
| _global.ntileY Tile在Y方向个数 |
| _global.ntileX Tile在X方向个数 |
| _global.tileW Tile长 |
| _global.tileH Tile宽 |
| _global.rootPath “_root” |
| _global.mapPath “_root.map” | |
| _global.tilePath “_root.map.tile”*未用 |
| _global.charPath “_root.map.char” |
| _global.clicked 鼠标点击 |
| _global.targetx 目标Tile的X格数 |
| _global.targety 目标Tile的Y格数 |
| _global.charMoving 角色移动 |
| |
+———————————————————+
_global.currentState 当前状态
_global.ctrlPath 控制路径
_root.attachMovie(“mouse”,”mouse”,200000);
eval(_global.mapPath).attachMovie(“char”,cName,100000);
*/
class ctrl extends Object {
public var ctrlName:String;
public function ctrl(cName:String) {
this.ctrlName = cName;
eval(_global.mapPath).attachMovie(“ctrl”,cName,150000);
_global.ctrlPath = eval(_global.mapPath + “.” + this.ctrlName);
}
public function drawCtrl(nx:Number, ny:Number) {
eval(_global.ctrlPath)._x = nx;
eval(_global.ctrlPath)._y = ny;
}
}

查看全文 »

页面: 1 2 下一页