アカイイト 游戏脚本文件分析及脚本提取

アカイイト,中文译名红线,success社05年出品的PS2平台上的和风百合游戏。音乐由Little WING负责,神作。
这是官网:http://www.success-corp.co.jp/software/ps2/akaiito/

红线的脚本文件是PS2光盘或者镜像里的SCRIPT\SCRIPT.AFS文件。其余文件的内容凭文件名也很好猜。BGM.AFS是背景音效,CELDATA.AFS是CG,VOICE.AFS是语音。NULL.000和NULL.001则是两个垃圾文件,每个大小512M,倘若制作汉化镜像应当去掉。

SCRIPT.AFS中的脚本文字是按SHIFT-JIS编码以非加密方式存放
下载地址:http://unicue.googlecode.com/svn/trunk/Files/Akaiito/SCRIPT.AFS
下载回来后可以用notepad++打开,就能发现脚本是一段一段的嵌套在非脚本字符中,非脚本字符有很多是不能显示的ASCII控制字符,并有大量0x00也即终止符,因此刚开始时不能当作字符串来处理。

不过脚本字符和干扰字符所属区段不重合,因此非常适合编写程序来处理,差不多六个函数搞定。

第一步,剔除控制符等干扰字符。
将整个文件都当成SHIFT-JIS编码的文本进行检测,原理和GBK、Shift-JIS、BIG5编码检测算法提及的检测算法是非常像的,只不过这里的检测遇到异常字符不终止继续而已。
剔除策略是,遇到0x00~0x1F用空格替代;遇到0x7F,用空格替代;半角假名区的字符事实上没有出现(倘若余错了,请联系纠正);遇到0x8000~0x813F,用两个空格代替;遇到SHIFT-JIS中0x8140~0xFFFF中不存在的字符(使用到了映射表文件jis2u-little-endian.map进行检查),用两个空格取代。

在第一步后,文本已经是一个正经的字符串,这时候可以用正则表达式进行后续处理。

第二步,删除$w、$s、单个ASCII可见字符(前后均有空格),有限状态自动机模型。第二步后文本已经基本可读。

第三步,需要将文本分割成章节标题和脚本内容两部份分别处理。#cr0在游戏中是回车的转义符,章节标题字串的#cr0是替换为换行,脚本内容字串的则是删除掉(脚本内容字串的最后部分需要灵活处理)。最后的工作是将长空格串(三个连续空格以上)替换为换行。自写代码的处理到此结束。在去除空格串后文本由6M多缩小到1M多。

第四步是合并文本,并将SHIFT-JIS编码转换为UTF-8(使用ANSI2Unicode,本想调用toUnicode.h实现的),用notepad++的正则表达式替换功能删除数字编号(应该不会删错吧?自写程序会鉴别前后是否有换行。偷懒了),并将多余的回车换行删掉,最后剔除少量错误。

step3的脚本:http://u.115.com/file/f0f1b09c22,未删除数字的或许对分章有意义

程序:http://unicue.googlecode.com/svn/trunk/

最终脚本在此:akaiito_script_step4.pdf
共计57万字

2010年8月20日 | 归档于 程序, 红线
  1. 2013年1月7日 12:05 | #1

    应该用什么程序来提取好呢?在文章中提到的程序能用吗?

  2. 2013年1月5日 13:32 | #3

    小熏,如果用现成的游戏脚本文字提取工具制成的文件打开后是乱码,是否不懂编程就不能处理了?譬如我提取了アカイイト的续作碧城的PC版游戏字幕,生成的文件后缀名是DAT ,无法显示正常的日文段落。

    • 2013年1月5日 21:48 | #4

      那个游戏脚本提取工具没对应アオイシロ吧。自己手工提取工作量很大,所以还是用程序来处理比较好

      • 2013年1月8日 21:35 | #5

        但使用那款现成游戏脚本提取工具分析文件SCRIPT.AFS后提示成功解析并提取了1253个DAT文件,这是······?

        • 2013年1月9日 16:09 | #6

          但是那些文件还是等于没有用,是不?所以还是要自己动手分析SCRIPT.AFS,没有捷径的

          • 2013年1月10日 18:09 | #7

            明白了,谢谢。果然要看懂资料还是太勉强自己了,希望以后还能继续请教熏姨。

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: