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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-12 13:57 编辑
! f6 U! U; Z+ `, ~
" {  P( Z$ N! D$ c9 s6 X( Q1 a5 i这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,/ X* Z* O* F; [4 G* \( r
讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)
' I" D- a, J/ F% U# M( j& whttps://forums.scummvm.org/viewtopic.php?t=7168
! ]2 ]. c' J5 ?* ~. e8 g' i+ t7 \[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)# o2 ?/ X- X+ P: \0 L
& ~5 ~  m5 R# L% g/ r
前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。6 x# `( I! @* I( u* @$ C3 l
在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。
" \1 `3 Y0 s. g& k. h* p: N4 y
- u. G8 R" z! h- k& T" d我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。
3 \6 I( r4 J0 }6 p  G9 t在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。3 p% \4 M: R2 L3 G$ ~! f

) e; r" Y1 M" V类似游戏还有
  1. · Groovie
    0 `& a: Q1 J3 s2 W, i- J' x, D8 [
  2. - The 7th Guest
    " v( ?1 o# ~+ m/ x6 }
  3. - The 11th Hour2 l! e( L4 Q+ ^2 J5 G0 ]

  4. & y! ?7 g. i; W" h' c
  5. · MADE
    9 S) I' N1 n# z" T9 U# [$ D$ E
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack% a1 J3 y/ k: ?3 b+ Z0 [& t0 D
  7. any text)
    " f; D+ F8 W0 H( v: e$ a. L

  8. 5 g: [% A( F+ Y. [: ~
  9. · SCI 1
    0 C+ ?  J! V, d$ [. V2 ~
  10. - King's Quest V (CD Version). In this case, just enabling voice and text
    * n+ C% l( w) L3 h5 N3 n
  11. simultanously would allow a 3rd party to create a set of MSG files! T  @* V# ~' ^2 u5 {/ `
  12. containing the voice transcription/translation, as it happened with Gabriel
      H: j. y% d& b7 k- R$ N
  13. Knight II.
    ' M4 L/ _2 L$ V  g3 H. s

  14. 1 E9 E: p' @' L1 m9 s

  15. ' U( U- L" Y9 t9 y
  16. Future engines:/ P& ~$ R0 P' f' y

  17. " C# g$ ~2 G' N! J; l2 z
  18. · SCI 21/ _1 U& n, x0 Q+ T3 }$ N8 o
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in
    $ U0 r  h1 o9 q6 ~4 }! b5 C
  20. order to enable the text display feature)
    3 x7 q2 n3 c* p% }8 X& R3 [
  21. - Phantasmagoria& p" |7 ~3 h5 D3 v" Q+ Q
  22. - Rama- Y4 E/ t3 H( l: A- }
  23. - Shivers/ c: H/ S: Y* P" K. }9 j; d
  24. - Phantasmagoria II: A Puzzle Of Flesh. g) J1 W6 @' Z2 H* G

  25. ) m" P5 e9 E; O" }- a
  26. · SCI 3
    - o  M4 k# n6 H5 O/ L" s
  27. - Lighthouse: The Dark Being. \2 z5 i( x, U' B) x" q* u

  28. : w( w" `4 g8 X& \
  29. · M4/MADS
    " D0 T9 \9 O0 m4 S
  30. - Orion Burger
    ( ~  |6 V1 B% Q3 B. |- R

  31. & h: X$ t) p# ?* ]2 l9 R# L
  32. · Mohawk
    " L* n3 W# `! @% ~6 r8 G
  33. - Myst
    + J! |$ b( e7 N, I# i+ z$ U) @: k
  34. - Riven: The Sequel to Myst
复制代码

  D  g5 p! h5 c- H
: C2 n5 V7 D5 ~& G7 H$ w% S% j( V5 t: w
6 I: D0 _9 v4 B4 h! H
相关代码如下  T( l& p! m: m# E
  1. bool VideoPlayer::playFrame() {' F0 W1 h7 C! Z* e0 ~! g
  2.         bool end = true;* z* I8 H- O5 A4 c$ }# \
  3. " U' f5 m% Z! B# L! P5 Q7 Y* S
  4.         // Process the next frame while the file is open
    : L1 ?. v6 E( f, ^& @! U' S: m, d
  5.         if (_file) {/ `) ]) j: P3 G) C  Y( f: u' w
  6.                 end = playFrameInternal();+ H2 w6 [2 m" d4 P, l  X7 n8 ^

  7. : K! T' E7 {2 }9 P2 f
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);
    / f' q( g  v; G! y9 ]* g/ A8 {
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {
    8 W" Z" k0 L7 M4 n
  2.         Common::String subtitle;
    , K, c3 W/ Y6 P. B
  3.         if (_loaded) {8 s; I$ U7 f4 d4 A
  4.                 subtitle = _srtParser.getSubtitle(timestamp);
    % {% u9 z3 Z5 ^; E
  5.         } else if (_subtitleDev) {
    0 j! j8 }# \  h/ V7 F$ J
  6.                 subtitle = _fname;. f* r0 u, c" g3 G* C; R* @* r# c
  7.                 uint32 hours, mins, secs, msecs;/ X/ V' p6 v1 q
  8.                 secs = timestamp / 1000;% f9 j/ D* x/ F
  9.                 hours = secs / 3600;5 \( |1 {, {: t3 r5 Y. z8 m
  10.                 mins = (secs / 60) % 60;
    8 Q1 w1 \  G! J. D' i
  11.                 secs %= 60;
    ; a3 I1 L& D3 M3 r  B, @
  12.                 msecs = timestamp % 1000;3 T4 i- H; N: M5 x
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);
    ' ~7 n; }% b  a  g; ~6 ?5 a
  14.         } else {9 w# Q8 Y) g  S
  15.                 return false;( p( I! n6 N2 }; i
  16.         }- e0 E; d8 |! D4 z
  17. " [, H0 @( f. Z
  18.         int16 width = g_system->getOverlayWidth(),7 C2 L# A* @, ^
  19.                   height = g_system->getOverlayHeight();
    $ e* V" S( l' b* O$ Z

  20. * H9 T: ?( n8 M- e1 M% ?: D
  21.         if (width != _lastOverlayWidth ||/ ^( Q: j+ |4 W, [8 f
  22.                 height != _lastOverlayHeight) {3 d  `! w# K+ \: B
  23.                 _lastOverlayWidth = width;( W+ m% @& T, i9 w
  24.                 _lastOverlayHeight = height;  [8 [1 M$ F) f" H9 B1 s

  25. 2 y  O9 ~$ x. ^7 E1 V5 }! R' X7 |
  26.                 // Recalculate the real bounding box to use$ @. ?. b, d( L  M
  27.                 _realBBox = _requestedBBox;" {& o' O+ V- @- {2 T0 ]3 F& A
  28. ( B& C5 x5 S- W* _
  29.                 if (_realBBox.bottom > height) {
    * ^  i) w( D3 P" D
  30.                         // First try to move the bounding box7 O  U& v/ R, H) x
  31.                         _realBBox.top -= _realBBox.bottom - height;& Z6 V+ B5 b: d1 c( W
  32.                         _realBBox.bottom = height;, Q0 z/ D5 d% h9 B6 q6 r6 m3 X
  33.                 }6 @2 x' e+ X# L4 e2 \4 h/ r
  34.                 if (_realBBox.top < 0) {% Z! a+ Y, ~* y* {
  35.                         // Not enough space
    ( n/ B9 x1 i: q3 C/ \# A
  36.                         _realBBox.top = 0;
    8 x' d! t# s, A5 B# C) l" O
  37.                 }
    + P1 f% G  h* O% |: J: m+ }

  38. * T( [, X' X! X$ M. N
  39.                 if (_realBBox.right > width) {& C, P4 G/ D8 e) j5 ^
  40.                         // First try to move the bounding box
    8 q7 K. e, t1 g, M5 s6 M2 E0 i) P
  41.                         _realBBox.left -= _realBBox.right - width;" O1 i& N0 H( U* D) ?' ]' @8 O
  42.                         _realBBox.right = width;! G, g7 f3 h4 p6 f
  43.                 }1 ?2 W7 M( Y  }0 n, u$ t
  44.                 if (_realBBox.left < 0) {
    + }6 ]* G/ z7 T/ m
  45.                         // Not enough space
    ) U9 E5 i" X* J+ ^
  46.                         _realBBox.left = 0;
    , V& Q9 o9 ^2 }. b
  47.                 }
    + Z4 [2 X# |& y* n- i( C" ^
  48. / d8 t4 ^" p1 G8 [; Y& O" O7 V) `
  49.                 force = true;
    ! H! F, A4 e8 [
  50.         }5 |# l+ L0 l2 `- G& ~% v1 r
  51. # F5 S5 N( I# G& i- O
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle)" {& f% _9 C0 Q7 [- F
  53.                 return false;
    ( o2 A1 f7 W- ~% V

  54. 0 }' z4 u4 Z0 g' i% c2 q
  55.         if (force || subtitle != _subtitle) {
    * k8 B/ D! q$ R& G( p0 V
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());3 O: y" b6 l, {, }7 `/ d3 v
  57. 8 Z) a* ]$ c( H4 p: X0 O+ ^
  58.                 _subtitle = subtitle;+ _& n$ P- C. [2 u- }. l/ N. ]
  59.                 renderSubtitle();, E- j6 ^! v, b0 `. t
  60.         }. t, j/ ~2 m2 F

  61. % S) `  ?+ |7 J, T# x
  62.         if (_overlayHasAlpha) {3 r: @6 }9 F' x/ l; W
  63.                 // When we have alpha, draw the whole surface without thinking it more
    : p9 Y+ R/ i% t: |& g% N/ \
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());
    : `; G! P( @9 S5 E' o2 o: j5 t
  65.         } else {
    ; ^2 C$ A* j: s  W& {
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen
    * C- Z% ^# o- s. [) `
  67.                 // We force a copy of the game screen to the overlay by clearing it
    % h, H) G' |( Z) Q3 l
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text
    * v* I/ l4 ^* ?* {/ H  ^
  69.                 g_system->clearOverlay();
    8 L, I' ~, l5 f( e
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,
    ! [# m0 _5 s* }: A4 z% ~0 p
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());0 g! \7 O  C/ Y- v( W. @
  72.         }
    5 x1 j: P" _* Z; p1 W2 ^( U

  73. 1 |! a4 K1 E7 c1 M7 ^! B6 j
  74.         return true;
    4 l4 d& ^0 r; o2 b! k5 F  [
  75. }
    ; n+ b: q* b& X. U7 H% r0 f4 ~
复制代码
# G+ x& N  w( ]+ C5 M

, A" j# Y* g9 w6 M
5 S! i6 U+ f/ O0 e9 `2 l9 Z
/ O  f. C9 M8 M, q: y" A
# x# ]$ }( P! N$ j* L
# |* l% m& b# \# ~; u. L9 T
+ ^  y. V3 a# d, T0 Y
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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