冒险解谜游戏中文网 ChinaAVG

标题: 【Scummvm汉化 #1】Hopkins 国际刑警 #3 字幕篇 [打印本页]

作者: shane007    时间: 2023-8-12 09:08
标题: 【Scummvm汉化 #1】Hopkins 国际刑警 #3 字幕篇
本帖最后由 shane007 于 2023-8-12 09:10 编辑 9 \8 G; j5 d+ y3 V1 L- j  t
) x: j: g2 K0 Y# u6 E3 W) R
这游戏的字幕放在LINK目录下,分为*.IND和*.TXT 这2类文件。
' t5 w+ q$ W9 `( V% o% c 其中*.IND是索引文件,每4字节是一个索引,定义了每条字幕在*.TXT中的偏移位置。1 v$ K: h7 [6 e- ^- W
" [7 o' v4 t1 b6 G0 i! d
比如,对话字幕保存在以下一对文件中,其中an代表的英文,此游戏共支持3种语言。# G8 a. l; @3 P! ?3 @; x( ~
RUEAN.IND- C8 G. h( c* Z0 c9 R, Y0 ]
ruean.Txt
4 x3 {( Z/ g1 m7 N5 V. t5 O+ M1 a; ~, W+ P2 E6 C8 J1 e
*.TXT使用了加密方法,将字幕逐字节按照某种方式进行加密,具体实现可以参考代码。' `: \- V" f3 h, R: [
提取字幕的方法,暂定为在*.TXT的解密代码后边临时加入一段代码,将解密后的明文输出到控制台,然后提取出来进行整理。9 }3 C9 j$ u. Z3 s$ M$ M1 A% I

, W% p& \8 Z1 m- V, G/ M$ R: E! W7 v, \: H7 M5 [
*.TXT的解密代码如下
  L/ X6 P8 u+ Z' t7 G
  1. int TalkManager::countBoxLines(int idx, const Common::String &file) {( P- [* ^1 C# }5 W) e: G' c
  2.         _vm->_fontMan->_fontFixedWidth = 11;
    * b9 j, g/ q) c, p0 @

  3. 7 i3 i, f/ \1 y6 u  Q8 k# {
  4.         // Build up the filename6 r5 B. [8 a- Y1 T4 L2 R
  5.         Common::String filename;
    + F. b8 M$ \/ d  M* M; D6 q0 q- ~
  6.         Common::String dest;
    - j+ @+ o6 S( M3 G
  7.         filename = dest = file;! [% T3 u; d0 _9 Q: I# X
  8.         while (filename.lastChar() != '.')) C* F2 k1 ]% s' R7 i8 ~: J
  9.                 filename.deleteLastChar();
    5 o/ N6 h3 V1 z! P6 B/ A
  10.         filename += "IND";
    ; F( M% {+ g) Y/ `$ C
  11. & a% h5 w) k, K7 W7 k
  12.         Common::File f;3 o: J, k; I- [& P
  13.         if (!f.open(filename))4 T% v8 [8 c2 T; s* d: W  z
  14.                 error("Could not open file - %s", filename.c_str());4 `- E/ Q& D( Q& f- I1 }3 {4 s; o
  15.         int filesize = f.size();( Y6 z; M, p' u; Z
  16.         assert(filesize < 16188);( Q2 R/ ?3 a3 v/ H

  17. , `6 C; p, d# v3 W, [
  18.         uint32 indexData[4047];! F2 |" I  T3 t# j) v; q% \7 a
  19.         for (int i = 0; i < (filesize / 4); ++i)" u( p7 y  L3 r/ o
  20.                 indexData[i] = f.readUint32LE();
    : i: k! g. y  o1 p: c
  21.         f.close();0 _2 y- F! H7 I  E& x$ _
  22. : n( o5 A5 u, @4 ]8 V8 s7 D- n0 k
  23.         if (!f.open(dest))
    ( l7 G* v  {2 Q6 Z* P3 H" {8 s) T+ N
  24.                 error("Error opening file - %s", dest.c_str());
    6 w5 k6 w+ k* E4 q6 l- Q. Q, Q
  25. / x2 i# v. V1 B6 O& c( _/ B1 ]
  26.         f.seek(indexData[idx]);  h  T4 I3 X3 ?5 M
  27.         byte *decryptBuf = _vm->_globals->allocMemory(2058);6 c0 S) C- f6 d# V" A
  28.         assert(decryptBuf);
    6 T# n: H1 T5 e, D
  29. 2 x$ F9 X. o! E- ?1 O3 @% b0 n
  30.         f.read(decryptBuf, 2048);
    ' Z$ [) M/ a" o* Z2 Z! y$ S
  31.         f.close();
    1 r( |; P/ b% Z  V2 }5 I
  32. $ m( H, J3 s9 f- R  [$ W
  33.         // Decrypt buffer
    ( U* |# c( r2 A; k
  34.         byte *curDecryptPtr = decryptBuf;, @, y2 @% H' ^" V0 v
  35.         for (int i = 0; i < 2048; i++) {( G! M8 ?% t4 B$ T! p! O* Y& D5 H' t
  36.                 char curByte = *curDecryptPtr;2 @, @4 }& J7 E& b
  37.                 if ((byte)(curByte + 46) > 27) {
    . f# {) M: H9 Z; R; m
  38.                         if ((byte)(curByte + 80) > 27) {
    0 |' {* v9 z2 u6 G. Y; H/ K
  39.                                 if ((curByte >= 'A' && curByte <= 'Z') || (curByte >= 'a' && curByte <= 'z'))
    + ~' c& G/ d0 r& q
  40.                                         curByte = ' ';
    3 w5 \( l  K+ n0 K$ U
  41.                         } else {
      C( l8 T1 U* `' J
  42.                                 curByte -= 79;  ^& q$ J2 K" ~4 j% I" I; U
  43.                         }
    7 d, G3 q+ }5 U5 y! x! {4 b% P' k% s
  44.                 } else {+ ^$ f/ c1 ]7 |. R4 f1 t
  45.                         curByte += 111;' r: z" Z4 E5 H6 J. p" X
  46.                 }0 f+ x; m; n: ]$ b
  47.                 *curDecryptPtr = curByte;
    ; y) I+ R% [2 G& {! ]) ~6 f, S& o
  48.                 curDecryptPtr++;( S. j1 a& l! f# y% s
  49.         }
      q' b7 N  O/ h

  50. / C' X3 q; R2 G
  51.         // Separate strings
    5 N3 F- f6 _! R  D: P/ _* G
  52.         for (int i = 0; i < 2048; i++) {
    $ w5 t' g$ O. g; V, |  y. ?
  53.                 if ( decryptBuf[i] == 10 || decryptBuf[i] == 13)2 W$ i" W; @! r; F2 I
  54.                         decryptBuf[i] = 0;
    8 {% g; u' Q3 H" X9 C
  55.         }& ]  s' R8 B* g1 P; T/ r! W

  56. ! `2 }" d0 |( W  m
  57.         //add by shane007
    1 @, r% K8 C$ A8 B( n/ D, W# H; ~. S
  58.         //debug((const char *)decryptBuf);
    + G( z7 i* h7 T0 S% b. c

  59. $ Y* V. E. o/ o( b3 b
  60.         // Check size of each strings in order to compute box width7 A. z; b  P) w+ z
  61.         int curBufIndx = 0;/ w$ j% ^! {% V$ t7 D, R0 W
  62.         int lineCount = 0;5 V& o3 Z7 a7 B7 H- E
  63.         int lineSize = 0;8 T$ A( E# c" ^
  64.         char curChar;2 }& S  p# ?; H/ H$ c! o3 ~- ]
  65.         do {1 _2 L- }4 Y0 K1 W2 H. S
  66.                 int curLineSize = 0;# o- A* N7 O& v2 l1 p- P
  67.                 for (;;) {5 }1 C7 J/ b# e1 f; y
  68.                         lineSize = curLineSize;# O: W, }0 s" z( Z0 S$ U/ J
  69.                         do {
    / w3 n/ A& C# D/ C& p6 K- C
  70.                                 curChar = decryptBuf[curBufIndx + curLineSize];
    9 h1 A1 M4 A" `2 D3 l0 J
  71.                                 ++curLineSize;& P. ]1 H: }( e. D
  72.                         } while (curChar != ' ' && curChar != '%');
    7 A+ p- E# [  @1 q2 X9 D

  73. * Y  ?1 O2 X$ H4 N$ g# B- v% }
  74.                         if (curLineSize >= MIN_LETTERS_PER_LINE - 1) {* F9 t9 Q1 j/ t9 I! Z
  75.                                 if (curChar == '%')
    ! a, }# v* N7 K
  76.                                         curChar = ' ';: H  p. }5 m- L7 D% P
  77.                                 break;
    + W5 X, a% q, k. F# P2 @
  78.                         }
    7 H/ D4 c1 N( o# d& H
  79. ! S4 C7 g6 g6 l2 G$ \  B3 g
  80.                         if (curChar == '%') {
    6 X" H+ P# V2 B: w% r
  81.                                 lineSize = curLineSize;. \% n1 A) o: e, Q9 l3 ^9 `
  82.                                 break;# u5 F$ _. f1 k- \$ M( E6 E
  83.                         }( i' h2 i" q# U' g, m, Q
  84.                 }
    5 D6 ?; v" E% ^  A: r- J
  85.                 ++lineCount;7 U" V, q1 O- p' i
  86.                 curBufIndx += lineSize;
    0 i/ L9 k5 J9 q
  87.         } while (curChar != '%');
    % |/ c4 i$ M8 k8 d: p
  88.         _vm->_globals->freeMemory(decryptBuf);
    0 |: P1 U9 Z% I2 e  C  N) e
  89.         return lineCount;3 r9 R; v* B7 V" U
  90. }
复制代码

+ t; d  T+ ^! ?; D0 ?- @) _; w2 ]" ~* E7 d! O





欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2