luyizuel吧 关注:390贴子:8,379

研究了一天PC98游戏汉化

只看楼主收藏回复

首先碰到一个困难,我手头只有jis双字节码表,但没有单字节码表,这就导致导出的文本变成了中间缺少部分假名的碎片,根本无法理解和翻译,于是试图自己把单字节对应的编码挨个试出来。
16进制编辑器里面无法显示单字节的内容是日文假名,只能根据游戏中的对话文字来试图找出不能显示的日文假名究竟是什么,然后自己动手把码表写出来。
单字节的编码似乎跟五十音图的排列顺序有关。


IP属地:内蒙古1楼2021-06-21 16:37回复
    ╮( •́ω•̀ )╭花了半天还停在这一步,好累。
    还有一个很重要的事情,我没有简体gb2312的码表,但是有翻译big5的码表,大概翻译成繁体中文是可行的。


    IP属地:内蒙古来自Android客户端2楼2021-06-21 16:47
    回复
      我逐渐理解了,大概是↓这样,不过搞不懂编码的还有许多符号以及浊音
      B1=あ
      B2=い
      B3=う
      B4=え
      B5=お
      B6=か
      B7=き
      B8=く
      B9=け
      BA=こ
      BB=さ
      BC=し
      BD=す
      BE=せ
      BF=そ
      C0=た
      C1=ち
      C2=つ
      C3=て
      C4=と
      C5=な
      C6=に
      C7=ぬ
      C8=ね
      C9=の
      CA=は
      CB=ひ
      CC=ふ
      CD=へ
      CE=ほ
      CF=ま
      D0=み
      D1=む
      D2=め
      D3=も
      D4=や
      D5=ゆ
      D6=よ
      D7=ら
      D8=り
      D9=る
      DA=れ
      DB=ろ
      DC=わ
      DD=ん


      IP属地:内蒙古3楼2021-06-21 17:06
      回复
        测试成功了哦哦哦哦哦!!!
        目前仅汉化了可操作的指令部分,实现了简体中文,正文部分因为太长以及很多符号编码尚未确定因此暂时未能汉化。


        IP属地:内蒙古4楼2021-06-21 17:58
        回复
          单字节码表光靠上面那些还是不够,继续补充:
          A1=。
          A2=「
          A3=」
          A4=、
          A5=…
          A6=を
          A7=ぁ
          A8=ぃ
          A9=ぅ
          AA=ぇ
          AB=ぉ
          AC=ゃ
          AD=ゅ
          AE=ょ
          AF=っ
          B0=ー
          (A5本来应该是=·的,奈何这个圆点无法显示出来,只能姑且替换为…)
          还有一些控制符不知道怎么处理,看来只能跳过它们了。
          还有一点,要加上这个:
          单字节过滤:20=空格
          因为游戏里内部处理会把单字节字符自动替换为双字节字符(也许是为了压缩空间),所以半角空格可能会导致出错,因此把它给过滤掉。


          IP属地:内蒙古5楼2021-06-21 21:35
          回复
            我自己写的这个单字节码表其实还是有错的,本来应该对应的是单字节的小假名,我把它们全都写成双字节的大假名了,反正游戏里有自动把小假名替换为大假名的功能,在游戏里是显示成大假名的,也就是说将错就错也照样能用。


            IP属地:内蒙古6楼2021-06-21 21:42
            回复
              简体码表不是网上就能找到吗?另外pc98的教程好像在狼窝看到过


              IP属地:广东来自Android客户端7楼2021-06-22 09:04
              收起回复
                不知为啥单字节过滤突然不好使了。
                我用的工具是很久之前下载的菜鸟导入导出工具,目前还没怎么弄懂。
                目前一些问题:因为使用了单字节和双字节混合模式,有很多时候导出的文本要求长度是5字节这样的奇数,而汉字必定是双字节,长度对应不上就会出错。
                目前正文部分导入文本失败,推测是因为简体中文码表里也有假名,跟单字节码表的假名发生冲突,由此出错。
                单字节码表我试着修改一下吧,用输入法可以输入半角假名,然而存储到文本文件中只能用utf8格式,如果按gb2312存储就会提示有无效字符。
                如果是单纯的双字节模式导入导出文本,就一发成功,成果就是上面截图。
                但是不使用单字节模式,导出的文本就无法显示普通的平假名。
                也许可以试图直接在16进制编辑器里操作,通过修改16进制编码来达到目的,不过这样会格外劳累。


                IP属地:内蒙古来自Android客户端8楼2021-06-22 16:14
                回复
                  用单位的winXP电脑就突然不出错了,也许这个软件win7支持不是很好。
                  设定单字节过滤之后就可以让20(单字节的半角空格)可以操作了,比如要求5字节,我就可以用“汉字{空格}”这样的形式来保证文本长度跟原文一致。


                  IP属地:内蒙古来自Android客户端9楼2021-06-22 19:49
                  回复
                    啊,差点忘了,我用的菜鸟汉化工具在win7需要自己用命令提示符(管理员模式)注册两个文件,这期间杀毒软件会报毒,而winXP就没有管理员权限这一说,也许这就是在win7上会出错但在XP就没问题的原因吧。
                    以上只是推测。


                    IP属地:内蒙古10楼2021-06-22 21:50
                    回复
                      试了一下别的游戏,发现连文本文件所在的位置都找不到。而我目前在做的这个非常良心的没有给文本加壳,所以像我这样的门外汉也能轻松提取文本。别的游戏就没这么简单了。


                      IP属地:内蒙古11楼2021-06-23 00:06
                      回复
                        正文部分也汉化成功了。
                        目前仅存的未解决之处:对部分符号暂时未做处理,比如「和」这两个符号。


                        IP属地:内蒙古12楼2021-06-26 07:49
                        回复
                          先记录一下游戏中的控制符(只是猜测,可能有误):
                          控制符似乎是跟ascii码对应的。
                          52=R,作用是换行return
                          50=P,作用是改变颜色paint,50xx是改变颜色的整体代码,比如5003就是改为紫色,5007是改为白色。
                          选择肢附近的代码姑且写下来:
                          24b200{第一选项,占用八个字节}2424d908{第二选项,占用七个字节}245d4705{选第一选项跳转目的地}
                          7f5d{选第二选项跳转目的地}41 53 01 26 41 7f 5d 5d 5d 1a
                          按照双字节码表shift_jis和单字节码表的ascii码进行翻译的话就是这样:
                          $いnul{第一选项}$
                          $あbs{第二选项}$
                          ]Genq{第一选项跳转目的地,显示文本}
                          del]{第二选项跳转目的地,显示文本}
                          ASsoh&Adel]]]sub
                          什么东西……完全看不懂。
                          推测$和$中间被包夹的字符串用于形成可选项。
                          sub是弹出多个可供玩家选择的命令选项。
                          enq是请求,del是删除,这两个命令的出现位置可以推测出:它们分别用于显示第一选项和第二选项的后续文本,游戏里应该会多次弹出选项,那么就意味着必须只能跳转到最近的enq和del命令里,而无法跳转到更遥远的其他enq和del命令里,以此来保证当前选项的跳转目的地只有一个。
                          soh是开始标题(游戏正篇从此开始?)


                          IP属地:内蒙古13楼2021-06-26 09:08
                          回复
                            因为上面这个选项的意思是“初次见面(开始新游戏)”“见过了(读取存档)”,那么第二选项跳转目的地后面的一串代码应该有读取存档的功能。
                            实在是太难理解了。
                            虽然这一楼和上面一楼都跟汉化没太大关系,只是单纯对游戏的内部流程有好奇心。


                            IP属地:内蒙古14楼2021-06-26 09:17
                            回复
                              不知为什么代表半角小引号(左)的A2在游戏里内部处理成了全角小引号也就是这家伙:「
                              从十六进制分析就是半角字符A2被处理成了全角字符8175,而8175在日文码表里对应「,在简体码表里8157对应的是≈,这就是符号出错的原因。
                              这意味着要在不改变源码的情况下解决这个问题,就需要我自己写一个新的简体码表并重新制作一个font.bmp文件来作为新字库。
                              一个笨方法:使用十六进制编辑器修改源码,把单字节A2替换成双字节8157(简体码表对应「),把单字节A3替换成双字节8158(对应」),这样就可以解决符号显示错误的问题了,同时文件大小增加了1kb左右,不过这样一来又出现新问题了,那就是游戏直接卡死。所以这个方法暂时行不通。
                              另一个笨方法:直接修改font.bmp,用剪切粘贴功能把对应符号对调位置。感觉可以一试。


                              IP属地:内蒙古15楼2021-06-26 11:13
                              收起回复