最近看了一下魔法师西蒙5这个游戏,发现这个游戏也使用了Sqlite3来保存一些游戏数据。 ! T5 |# T8 }& U6 t
german.meta和resources.meta这2个文件都是Sqlite3格式的,我们可以用以下这个工具来打开修改。 $ S" Q0 M. H2 K4 |$ X6 v. c
https://www.chinaavg.com/read.php?tid=20557
5 \" I& W# \) j2 r& d: B其中的几个字段分别对应了包文件index,文件大小和文件在包文件中的偏移量,所以制作解包器应该很容易。 / b% s5 `: h5 B) Y/ ^. |
C& {4 h- A+ o# Y. I' e在文件名表里面,我们发现了在python/目录下面有好多游戏的.py脚本,暂时还没有发现游戏的字幕。
% o# @+ q* C: {" B我把python/adventure/dialog.py文件手工解了出来,让我们来看一下它头部的注释。
j3 V% R- }/ j% W1 @2 t; c3 o& _: U- I9 h
"""Module to construct, manage and play dialogs.
* \7 Q3 J- ?- Y# ]
4 ]7 ~' Z% L* l8 R2 f- E% QThis modules provides the following classes: 4 { r* I# w4 b- Q6 F
4 i) F9 x6 F) b0 @5 h% W' ~8 {8 I% \
Dialog_element - Basis class for all dialog elements. Not to be used directly, use Text or Choice 7 [( o9 I7 q, `7 a$ @' e6 {5 u9 g
instead.
- y; W& h2 p8 G( V+ s/ T/ J8 w4 ?) D! k0 I; P2 Z" }
Text - This class represents a single text in the dialog (including texts that are part of
( } f6 F0 l' P2 G% Ka choice)
: h5 p% C+ A5 X) N* R" W
* E" X6 v5 {( R1 J( b' K x3 J8 cChoice - This class represents a choice in the dialog. It usually has several Text elements
1 N) y6 n8 y8 j5 ]: {* Bas children. This childrens are the texts that the player can choose from. The Choice itself is a 1 U% F$ c V, x) K. g- n
silent element. * a6 K' @+ R- Y. A, C6 N( ^, m
4 m0 ~) G& @0 v# W1 i" mDialog - This class represents a single dialog. A Dialog consists of several Dialog_elements
6 k; Y' `$ U+ b5 F' x% B* t$ c. nwhich are connected with each other in an arbitrary graph. $ `- ~+ c. J+ |' i2 K; e: I% j
: j8 o( D; P9 X; s) PDialog_system - This class manages and plays Dialogs. 0 z% [3 M2 w/ D9 y2 J- Z- O1 Q" e; m! E
- m5 G' J5 q4 `7 C; FThe classes in this module interact with the text database. 4 V3 ` x, @+ P9 l/ `
The id used for a Dialog_element is also used to find the appropriate text in the text database when 9 e/ x# f2 w; b. J8 H9 C
the Dialog_element is displayed. (i.e. the Dialog_element id and the id of the text in the text
1 v7 }$ m8 q1 j0 qdatabase have to be identical for all instances of class Text).
- M4 c; Y/ h5 y9 ^"""
$ C: @; f' x5 c0 T: b" D3 |6 M5 }( ]3 u2 d. K
我推测,在包文件里面还有一个存放字幕的文件,说不定也是SQLITE3格式的,现在由于还没解包,还不清楚。 ! h1 \# J+ L: Q0 z3 B
另外,还有一个发现在文件名表里面我们发现了一个文件名python/grandmasboy/dwk5_graph.py。
; L) w0 h# @* Y) a8 ^9 X我想起了前不久刚实现汉化的狂野小子5这个游戏,它也是采用了SQLITE3数据库的。 8 I2 f9 A# ]4 n/ W& ^
https://www.chinaavg.com/read.php?tid=20585 ( t4 U0 N, j3 h+ W! _. g/ ^
我没有猜错的话,这2个游戏应该是同一个游戏公司开发的,上面的那个文件应该是前一个游戏遗留在游戏引擎里面的东西。
0 x! v) H% F! m6 r/ k. I4 h. P8 _. S6 J狂野小子5字幕是utf-8的,已经实现了汉化,也许我们能找到一些相似点来实现汉化。 . ]$ a) ]* d$ A- G" S( o
暂时分析到这里,期待有热心的朋友把解包器做出来,以便于进一步研究。 ( `. Y& h7 M+ c
放上2个sqlite3格式的文件和dialog.py共研究备用。 7 O6 c: C% d% @3 E O3 G
6 x' g% z" W. t ~9 N% g9 c/ T
0 z, g) a# q& X) _
----------------------------------------------------------------------- * h' j& m- O4 U" @. n' `" {
2010.2.28 第1次更新
5 D" Q( a9 U" N5 E- E我在resources.d017中检索font,发现了以下的语句,这和狂野小子5几乎是一样的,应该也是用系统字库的。 4 L: z& B* g5 i2 w% T3 X* E9 V
self.__cairo_context.select_font_face("Tahoma", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
+ d) p7 D0 a# F7 N! ]. {3 \7 G j所以,我感觉这个游戏的汉化希望很大,接下去就是解包后寻找字幕文件了。. A( P5 L5 z5 N* R
-----------------------------------------------------------------------
# e2 u! ?+ h$ B# C5 g2010.2.28 第2次更新$ E% ^7 y! L# q* f! f) O
我猜想这个游戏的字幕文件名也许和狂野小子5是一样的。9 v1 N- P5 `/ e5 H3 z
我用sqlite3的工具打开german.meta,果然发现了一个german/text_db文件。' ?- z2 p& }4 x* t: E
这样的话,应该用同样的方法就可以把这个游戏给汉化了。
( |( m% u( x* \0 l等有时间再来做最后的试验。 |