设为首页收藏本站官方微博

其他 【Scummvm汉化 #3】The 7th Guest 第七访客 #1 字幕篇

[复制链接]
查看: 341|回复: 0
打印 上一主题 下一主题

[其他] 【Scummvm汉化 #3】The 7th Guest 第七访客 #1 字幕篇

跳转到指定楼层
楼主
发表于 2023-8-12 13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【Scummvm汉化 #3】The 7th Guest 第七访客 #1 字幕篇

本帖最后由 shane007 于 2023-8-12 13:57 编辑
9 M4 [4 G2 B8 n9 }+ `4 m) K/ R2 R2 p1 n  f( ]8 x* F
这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,
3 i6 C/ [. @+ R讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)
6 x$ ?# k2 D8 R- E/ G' T) Ehttps://forums.scummvm.org/viewtopic.php?t=7168& k* }9 y# Y  p% c3 E
[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)$ R" h7 a& [2 Y: }( {
% T" Z1 E+ `8 T) P% J$ h
前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。, s3 j  M; [; ]
在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。/ M2 ~& Q$ }6 s" ^
3 |) g* ~, i& t& f$ o0 k
我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。
/ Y4 H9 H& J( X3 l5 z在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。5 ]5 U  k5 {# A$ d  F0 k& k. }
* O* K1 B/ y7 z
类似游戏还有
  1. · Groovie
    & }/ \6 A. b) S! v+ P
  2. - The 7th Guest1 X1 r. O' U4 D2 T" V
  3. - The 11th Hour" D" x: O( f. T1 O% N

  4. " r7 s* X) Z# I( S! A
  5. · MADE0 \# D- }2 w7 D& H: I8 L
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack
    * N7 x; e: h8 [: ~' q- c) q
  7. any text)
    1 m6 ]% u1 u2 l) j! y6 {
  8. ' ^; n5 b, T3 Q6 m/ P4 m0 L
  9. · SCI 1
    ) O8 [, A& A* h' K+ T3 q6 z
  10. - King's Quest V (CD Version). In this case, just enabling voice and text
    7 L0 F! a  X7 t" A
  11. simultanously would allow a 3rd party to create a set of MSG files
    ( o' F5 P1 ~) _6 |1 ]
  12. containing the voice transcription/translation, as it happened with Gabriel9 [! M# f& H" h
  13. Knight II.
    , b) o& J, t  I! \: A8 d+ ?

  14. + c& B$ E! ^/ _' P+ X" W

  15. , f- p9 k2 a4 ^! O9 R  F% ~$ v; v
  16. Future engines:: b, c, |- O- w8 e6 ?! M
  17. , }3 Y3 A: {2 D6 L$ y1 ^% P/ W
  18. · SCI 21
    8 c3 \: B0 D0 f1 n3 ]
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in$ I0 _! Y* D3 [2 V% x% h% _
  20. order to enable the text display feature)
    2 g9 t$ P3 I  ]
  21. - Phantasmagoria
    0 M2 i7 G: _* e
  22. - Rama
    : Y4 R; J" l' f8 |/ W
  23. - Shivers
    1 Q* h- e8 q- G( ]7 A
  24. - Phantasmagoria II: A Puzzle Of Flesh
    ) m- W+ \1 W+ g8 x
  25. ; A  g+ \# w" i5 n5 G+ L1 }5 b7 F
  26. · SCI 3
    8 Z3 t& P' n' x. @- C( \; P
  27. - Lighthouse: The Dark Being: o# d9 q, v  Q9 W( U! [
  28. : |' Y, N- ^5 Z# C& J' F
  29. · M4/MADS
    % X: b3 s1 P2 H$ {# d  B
  30. - Orion Burger
    + _2 V: g2 E$ ~9 p$ V8 k8 C
  31. 2 |9 E+ D5 X# K
  32. · Mohawk
    2 q0 j/ g6 G" R. r$ p& G7 ]$ _
  33. - Myst. j1 p( Z: y( g# w
  34. - Riven: The Sequel to Myst
复制代码

6 ?# ?2 m0 b; n  E! b0 w7 _6 }6 Y# z6 D. H! ~  A3 W/ C
' ~/ N( e  ]  n! H( Y# V( s* f
3 r; }' w, q, d3 T
相关代码如下$ V/ N6 R1 K) v; T) s' m( W
  1. bool VideoPlayer::playFrame() {& T+ {7 C! f+ j+ N) l6 C
  2.         bool end = true;0 c6 F  q5 l+ }% {5 ^, Q! b

  3. ! r( a+ `1 k! n+ j5 N) @
  4.         // Process the next frame while the file is open
    * d# m$ {8 r- H
  5.         if (_file) {
    : f( w9 ]9 D2 }- h8 s4 [
  6.                 end = playFrameInternal();
    9 }5 B: n& `6 |! v+ `

  7. / k% `/ l' T% p1 V4 i
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);8 `' |. [" \" E1 w4 |, \
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {' a1 H1 T+ `, S  e' f* F7 ^
  2.         Common::String subtitle;. x7 w1 g% c& C7 v
  3.         if (_loaded) {* R4 {0 h  C4 ?9 J# r
  4.                 subtitle = _srtParser.getSubtitle(timestamp);
    1 ^9 Q* k7 G) z
  5.         } else if (_subtitleDev) {
    3 y8 b9 T5 g8 B5 F; g3 C5 T. P
  6.                 subtitle = _fname;
    6 O$ B+ N2 ~0 \5 R& [
  7.                 uint32 hours, mins, secs, msecs;
    : D) ?$ Z  m  X8 P
  8.                 secs = timestamp / 1000;
    3 _* M+ J5 O5 X( {
  9.                 hours = secs / 3600;
    3 e( w. j4 M$ J. h
  10.                 mins = (secs / 60) % 60;
    # d: Q# q# C1 k3 m
  11.                 secs %= 60;
    2 F# m6 _4 m( o4 `' ?; }
  12.                 msecs = timestamp % 1000;
    3 s" z: O1 B: p5 ]5 W7 C# R
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);4 F) k* j  i/ h+ X' g( l  V
  14.         } else {
    3 Z2 s9 T" \$ `: f) q3 @  N
  15.                 return false;
    7 R: l, ]# l. J* f9 j* q
  16.         }
      x6 O9 L& Y2 L- l
  17. 7 S5 a9 o% P" m( E% w+ s( Q. s! u' q
  18.         int16 width = g_system->getOverlayWidth(),
    - k" J' k) o+ F4 R0 r) N# t
  19.                   height = g_system->getOverlayHeight();/ [% |8 X: S% c; t# d; G! R& |

  20. 9 M; S9 Y2 n2 x* c  f0 u9 e4 z" J% K
  21.         if (width != _lastOverlayWidth ||
    , C7 N+ _# z+ Q% P4 v+ X8 W
  22.                 height != _lastOverlayHeight) {
    " e# q1 E, K. H5 E$ U
  23.                 _lastOverlayWidth = width;4 _+ w+ d' h3 x% L7 V  g
  24.                 _lastOverlayHeight = height;
    , e  W* T& F$ h' R% u
  25. ' J. v3 Q$ b- `+ c$ W5 O
  26.                 // Recalculate the real bounding box to use
    - `# i% h0 {; g9 y0 w! ?+ f' T& S, s
  27.                 _realBBox = _requestedBBox;- y& [) x  c; s$ e

  28. $ v3 {9 i: Y& e
  29.                 if (_realBBox.bottom > height) {
    8 y1 Q! E! X; X# [
  30.                         // First try to move the bounding box
    $ x* w8 x% {1 y9 |7 O; L
  31.                         _realBBox.top -= _realBBox.bottom - height;
    : T; p! K# M! x3 L
  32.                         _realBBox.bottom = height;5 h6 e; P1 Z; M" r$ I- \: f
  33.                 }! ~4 |' O' T* L  ]8 |
  34.                 if (_realBBox.top < 0) {+ t' l! A$ h9 b/ ~
  35.                         // Not enough space0 z* ~: i' @4 p7 u6 u
  36.                         _realBBox.top = 0;  `% a1 {0 g# ~: g& X9 F, }5 \* j( l  X
  37.                 }
    3 O& H* w2 a) V
  38. 4 r+ K4 d! ~/ w$ a2 }: l
  39.                 if (_realBBox.right > width) {, L6 w) k( J0 W( F- N% D! e
  40.                         // First try to move the bounding box% L3 a: w4 K& X+ k8 h6 x  E9 W$ i
  41.                         _realBBox.left -= _realBBox.right - width;
    7 k6 d8 v( W! I& }; ?7 f
  42.                         _realBBox.right = width;
    + {5 C: g+ a' @5 L0 _. o+ y7 T
  43.                 }
    9 s7 ]( L2 J+ s/ _
  44.                 if (_realBBox.left < 0) {
    + r1 J/ D( N5 }% M0 e
  45.                         // Not enough space) T. y9 w% D! Q: q; w
  46.                         _realBBox.left = 0;
    9 y- q* G/ S' t6 v. H9 O
  47.                 }- u- W" v& Q, d* u: t
  48. * k8 A- d& R" f2 c
  49.                 force = true;
    3 q+ @# _' q1 }* B9 r7 y8 L) q
  50.         }
    0 ]0 c  c/ O0 C0 J% d  _) Q

  51. 7 B* Z$ H% R/ f5 ~% H6 J1 T
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle)! `: T! c; e' ?
  53.                 return false;) q8 f: W% S: {/ C. C; W: l

  54. ; F+ J5 N: }( z  d) c# V. o5 A
  55.         if (force || subtitle != _subtitle) {7 ?1 Y! M  A0 M
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());
    . q: Z1 B/ p' k! k5 v1 _+ B  K4 ]
  57.   `' M- [2 c5 l' l) M; G1 n; B" P+ b2 y
  58.                 _subtitle = subtitle;
    : ?  \# S( u: v
  59.                 renderSubtitle();
    3 P4 t& q  x% q8 Q( u2 `4 X* d& M
  60.         }
    $ \' l* |2 @7 j: E
  61. ) E2 \! v  n& j4 c, M
  62.         if (_overlayHasAlpha) {
    2 ~  m5 }: x) d5 H6 H
  63.                 // When we have alpha, draw the whole surface without thinking it more
    5 e4 Q2 B2 n+ k8 z2 M
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());
    , K9 ^) X: J0 C$ f2 c
  65.         } else {1 g9 o" Y& w5 \1 l
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen6 S1 {, a$ Y( T* o) R
  67.                 // We force a copy of the game screen to the overlay by clearing it4 t9 _+ l2 m( h7 e: u: [5 V! q; D6 o
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text4 f# S8 J9 h* o+ G2 w5 {4 H
  69.                 g_system->clearOverlay();7 w$ i0 p* Y; I5 c% E3 s! Y1 t) v
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,
    4 @, K& @+ z, g9 C1 h5 f+ l0 c
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());
    4 _! v, @4 W, b1 U
  72.         }' z6 O, ~# ^* q# X7 \; H1 O1 x
  73. % M& I; [0 }) j# ~8 w7 Y
  74.         return true;
    " q4 F+ Y5 r% K- L5 v
  75. }
    % F5 d0 O" K" t$ g9 L
复制代码

$ S* S8 s7 T' L. v# D  f! E" P
; Q2 U$ \  V* Z* i9 ]& A
" m" @% T# V, p# s6 P- B3 ]3 J+ }; ]$ T, s8 t5 _* ~
# s8 |% A0 ]+ ^$ a% I

8 b5 _- R8 Z6 r% ^- I% {, ~: b, }8 V( B9 v' b, O' B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表