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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-12 13:57 编辑 ; r% k- \: h0 o) ?

' q: H4 a. _! s. c; E, i这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,
! M5 a: Z, r' P3 ], I: c讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)! I( b  f2 C4 d3 w5 `7 |
https://forums.scummvm.org/viewtopic.php?t=7168- M/ X) ]9 k: W: T
[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)7 j. c, O5 Z. S9 B: v- c  S) e
/ _5 @2 P& m  @2 {/ x3 j
前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。
' y. y3 J0 W+ Q5 v: p在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。5 B2 D6 Z% n* l% h7 c5 `* `

* \3 [' {2 h. ?+ ^: z  s0 I" g我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。
9 I8 V; w, K" d! R- v+ r/ G在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。/ T* E. h$ _% k) T: I( s( r

4 ]5 R$ P5 ~% o6 J) C类似游戏还有
  1. · Groovie. V+ }* h6 l: ~( z
  2. - The 7th Guest2 U+ s( b' c' F+ I# ?
  3. - The 11th Hour
    1 a" N) L2 p" j0 w+ m

  4. ) F2 x4 j( [& ^" p! ?1 i9 w8 G
  5. · MADE
    8 I, b; G: w' b* @9 J
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack4 u, A. v0 K2 ]* g* a, X
  7. any text)
      C4 {% \7 Z! Y" l( s% Q
  8. $ `( I4 {0 I/ X1 b
  9. · SCI 1
    ) t" R4 \- m. s, u- T4 j# e6 g
  10. - King's Quest V (CD Version). In this case, just enabling voice and text
    4 c; h5 D! @8 v0 W% D
  11. simultanously would allow a 3rd party to create a set of MSG files
    4 D+ N9 Y* e3 }4 y/ w. r7 P
  12. containing the voice transcription/translation, as it happened with Gabriel/ h$ @0 m2 W$ S2 P% b8 Y' l/ @
  13. Knight II.
    & W& s( d- n8 U9 w) e7 V

  14. " C9 F' o$ Q9 O; I; s0 l' `5 q
  15. ! z7 F4 }/ p- Z1 I: I( O6 C- q
  16. Future engines:0 f1 [' H1 q/ [7 Z6 D" I' a3 h: C

  17. # f+ q0 p, @* A$ W1 K
  18. · SCI 219 j. f- y3 J' Y, D& V
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in
    8 R& V& S; K' G* B4 _
  20. order to enable the text display feature)
    ' O. W$ H8 t8 I
  21. - Phantasmagoria
    # W' F7 d' ?9 I1 U8 s) @
  22. - Rama
    / L; m  z5 }8 t7 o' d, L, T
  23. - Shivers: p1 z0 ]: ?; g" |# w5 ], Z
  24. - Phantasmagoria II: A Puzzle Of Flesh
    ( y) p9 ~6 Y+ X+ K3 ~# I
  25. 6 V& A. w+ P: L/ F% d
  26. · SCI 3
    ) k1 D1 c2 x9 L- W% H4 `
  27. - Lighthouse: The Dark Being% T( E. n" ^( J5 a# |  m) j" c0 s
  28. ! ^& z7 r  k/ S- v* K9 o( y/ f! v. M' ~
  29. · M4/MADS2 r( J0 J/ {* |
  30. - Orion Burger
    . G( h7 u" p% Q" O% _. i# d
  31. , V$ u( V1 j0 T; C. y
  32. · Mohawk
      h. g$ f% W# I. j" C9 n/ @3 \4 g
  33. - Myst
    1 ^2 j5 s) c% m! j+ I4 V! h
  34. - Riven: The Sequel to Myst
复制代码

! v9 b. X  r1 y8 D+ \, a9 Q5 F% O# o7 X9 a/ W- }. Q9 J

" {8 h% f. e% z6 R
( ]+ s  S3 X: Y$ M5 g/ y' T& a+ d相关代码如下
2 p8 @) v# T; J/ B& u' u
  1. bool VideoPlayer::playFrame() {
    ; L8 Y/ \7 X4 t/ V. l7 ~' c
  2.         bool end = true;( t) {" w( Q7 p  ]
  3. " Q. X2 J" b6 A% @4 u$ K1 q
  4.         // Process the next frame while the file is open
    ) `' L! D0 R% Z) y1 |5 H
  5.         if (_file) {7 p2 {) n! X5 s0 k. R7 X5 z
  6.                 end = playFrameInternal();
    $ B: Q0 P7 R# [8 x$ S

  7. ! x8 F: U, G: n) N
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);
    ; H$ N7 A7 d! Q1 C
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {
    % X: l) M. K$ s3 n; ~5 Q
  2.         Common::String subtitle;9 k; d) I+ I. I
  3.         if (_loaded) {* ^- V1 `; p8 K2 `% _8 Y" x' G3 f
  4.                 subtitle = _srtParser.getSubtitle(timestamp);( \# z; O- ?, O" H' n  V/ ?3 ^
  5.         } else if (_subtitleDev) {- l/ S9 `* L8 k$ Q- Y* @$ u# @
  6.                 subtitle = _fname;4 s: N- Z, E8 r$ _& }7 X( ^
  7.                 uint32 hours, mins, secs, msecs;
    - M" z, m7 s- T3 U# J
  8.                 secs = timestamp / 1000;* b3 G; f. z  t. }: }3 [3 J
  9.                 hours = secs / 3600;2 ^8 R9 H, I$ G0 ^8 O$ I5 e
  10.                 mins = (secs / 60) % 60;
    + r/ ?; O7 _; K
  11.                 secs %= 60;
    ; y6 l6 h! I% A- ~# {, P# x) e7 N
  12.                 msecs = timestamp % 1000;
    4 w. B: l: K: o5 u8 F
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);4 _; E1 _8 |) Q6 q# \
  14.         } else {9 W3 c+ x0 E4 |" Q: }1 \
  15.                 return false;
    6 k( B; j% M9 v: v+ d+ L
  16.         }4 g$ t8 G6 j1 F5 L2 \2 ^- i

  17. " ~2 }: K* a2 q  X! P( G- k
  18.         int16 width = g_system->getOverlayWidth(),  g3 T; P, D7 T0 ?- Q: h6 x. z
  19.                   height = g_system->getOverlayHeight();
    ) ~$ o% U$ r/ @, f; N6 D8 M

  20. ' C2 G7 `* K; T! P% d) B
  21.         if (width != _lastOverlayWidth ||
    ; v" W4 l; J/ A' s
  22.                 height != _lastOverlayHeight) {4 j1 R: t% ?% t: Y7 v1 @0 O' ]
  23.                 _lastOverlayWidth = width;
    1 N1 q* U0 @4 Q4 c8 W/ y* S' l
  24.                 _lastOverlayHeight = height;
      t" Y. g7 V6 i* J- T

  25. . A+ H6 [* J( [" {3 {/ Y) m3 e
  26.                 // Recalculate the real bounding box to use
    ; D9 J& Z, J. q
  27.                 _realBBox = _requestedBBox;
    1 t! Y% H6 U/ A) z' [# U; x9 P* D

  28. ' }; r8 ^  K9 D. S7 ?! A
  29.                 if (_realBBox.bottom > height) {
    8 L6 r; Y3 W/ r8 J! h4 e
  30.                         // First try to move the bounding box
    , }; _1 X& G, g* l2 k
  31.                         _realBBox.top -= _realBBox.bottom - height;$ ~5 P; d& ~% y% o% F6 t
  32.                         _realBBox.bottom = height;
    9 d) j  C7 \( [; h" X4 f
  33.                 }. g; ~9 I* h3 b& r+ s4 ?# |
  34.                 if (_realBBox.top < 0) {
    1 L! z* c) \# M; p$ A8 p6 w4 Y
  35.                         // Not enough space6 F+ R( o4 F1 O0 H. T, s; x7 V
  36.                         _realBBox.top = 0;) L! J  p2 |7 s. S0 L8 U' f
  37.                 }
    4 S& a& v3 F9 T/ P" Y

  38. 5 |1 T$ U2 r, Z, Y% z! w4 m0 w
  39.                 if (_realBBox.right > width) {
    # L4 Q; y6 L6 z" T, h0 B0 n2 Z3 y
  40.                         // First try to move the bounding box
    , t, g, P, t. U& `* G
  41.                         _realBBox.left -= _realBBox.right - width;, {8 e1 |) {% z' E4 p" Z* p
  42.                         _realBBox.right = width;
    5 E* a+ Z* P$ t: H! g( o) i" L. g
  43.                 }  R3 Z0 Z5 ~* ^9 u+ u% ?9 y' u! [& S
  44.                 if (_realBBox.left < 0) {
    , S. V3 C. K3 N+ w
  45.                         // Not enough space
    $ T6 Z. w9 b- M" U8 _- j- b) Z3 l
  46.                         _realBBox.left = 0;  E; s4 l! W; z& ^* q! ~
  47.                 }# ~/ j( T+ A; @( @" |
  48. " q  Z  g; T* y1 r& I! l) c
  49.                 force = true;
    1 y6 {2 Q8 H8 J  A& L4 U4 o
  50.         }
    # m4 I4 m, s/ c! S

  51. 0 e; Y; Z; M2 z2 S; t) n5 ~' W3 r
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle)+ z( ]$ Y8 u& f7 i  S6 V
  53.                 return false;
    ; h2 e5 ~/ m+ U1 R, M* y- u
  54. 2 \- |. W, X* Y
  55.         if (force || subtitle != _subtitle) {# ?0 j* h: k7 S
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());
    9 z9 Q! l' J" I7 q7 b: v* s

  57. $ r2 q$ @6 x: Q) z. D
  58.                 _subtitle = subtitle;  U' q" r' s. p3 }2 f* d' Z8 W
  59.                 renderSubtitle();
    * @& e8 c2 Q" o$ T
  60.         }
    4 P: i6 S; ?: _, N

  61. % v- p! R, E( ^( A- V' S3 y0 i) d" Z
  62.         if (_overlayHasAlpha) {
    5 K( P$ ?! X$ J2 Y4 |- z- Q
  63.                 // When we have alpha, draw the whole surface without thinking it more
    4 s( d+ N& L  P/ e3 W  ~9 }( t
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());
    & {5 Y: v) p' G$ _+ x4 s8 W
  65.         } else {
      I; D2 ~* S& v4 m
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen
    + f7 Z9 ~2 ^" u  }- k0 F/ R5 D
  67.                 // We force a copy of the game screen to the overlay by clearing it
    0 U* ?0 _* }* Q1 d& f
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text
    8 j. ~! Z; j# j0 s+ ?
  69.                 g_system->clearOverlay();. ]9 J$ i) O/ L' {& I
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,$ _, a# e3 d  {: |
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());
    + v" j0 w6 N3 r- G) `
  72.         }: ?, P% c3 @. |' q5 i

  73. ) V5 b7 e$ K% a9 l$ p1 c2 @0 C
  74.         return true;+ _( p, O" o* k' z( \
  75. }0 f0 y7 w1 s+ H7 K
复制代码

7 g  A8 K! r# N$ z1 t' f% c4 z) L( w0 ?3 D/ c% o7 R$ V+ E

; f) m' c" H# K1 `/ H) Y6 Y$ s
% E- H8 Q4 O, |  P  a6 ?5 |1 ~- J/ I8 l
1 ]* `6 D( W) ^

9 e  }8 M( w5 p) B; \% J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

高级模式
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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