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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-12 13:57 编辑 & o9 Q% W* h% n) T+ I2 D3 d
9 q# e/ F- Y3 N" J3 E. y6 d
这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,0 `% B: B  f( ^1 f2 \9 c$ u, r
讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)
7 M5 w0 L, |% K0 C6 Vhttps://forums.scummvm.org/viewtopic.php?t=7168- W1 F8 O! M; ^4 n7 s6 i
[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)
/ _, G* ~' t4 F. B# |- q8 n, q
前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。+ X( y* S5 A/ c6 a- w8 T
在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。
8 S* H5 N2 ^; }
8 ^; I1 t0 p/ s& x( Q! N# g我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。
6 I8 p5 ]* e1 q. x0 Z在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。
2 z, u; P, g4 o/ |. W! q7 f! {
4 j& c, \/ Z. V* p( Y类似游戏还有
  1. · Groovie: [7 c9 f, }4 G0 e& `7 y
  2. - The 7th Guest
    ' a4 n# \) Q6 G4 B; n9 n
  3. - The 11th Hour; ^2 N4 X+ s) G, o; i0 F

  4. ( R# S+ H  N6 v' g. F
  5. · MADE
    / F$ T7 a3 r- m; p' K9 h0 v
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack- h1 m1 |# e5 l
  7. any text)+ Q5 ]; f( c; m1 x# I
  8. ; ?% ?) q% o" N8 o/ L
  9. · SCI 1: i( C8 e& b; y; b1 p+ j* ^3 [( ?
  10. - King's Quest V (CD Version). In this case, just enabling voice and text1 s& k2 Z5 b4 y
  11. simultanously would allow a 3rd party to create a set of MSG files
    8 p# W4 q$ U$ k$ F  t  X: p; `% n
  12. containing the voice transcription/translation, as it happened with Gabriel6 X. U% c% j5 J8 G" i* B
  13. Knight II.1 h# P+ `8 A3 ^$ M# N* y% c

  14. $ U0 c* \0 ^9 M  k; l5 N

  15. 6 x3 V, f$ z- B7 r7 [
  16. Future engines:
    - C' t1 n' q4 @8 \# X" w: e8 t) h& c
  17. * e  f. c- F0 C( X& U3 a) V
  18. · SCI 21
    4 F. {. U. @! k& ]6 K' R
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in
    - S8 B# Y5 e. c" [! z8 Z" j
  20. order to enable the text display feature)- i% V# y! I% ~8 N7 |7 g3 e8 }
  21. - Phantasmagoria9 C$ n" }+ B7 N2 i% ]. V$ A: ~
  22. - Rama
    % C4 l. B) I6 Z9 n
  23. - Shivers; c0 v3 u& w4 ?$ q# m
  24. - Phantasmagoria II: A Puzzle Of Flesh
    1 k' Y' `- Z4 P. X# {  C, s# t
  25. & W  k  S4 x8 K% i* a' l
  26. · SCI 3
    & o0 x6 R6 U. H% w: D4 }/ `: u- ]
  27. - Lighthouse: The Dark Being- l$ ?& Z' G0 P- z

  28. - m$ j+ W5 y! C6 q/ Y. L
  29. · M4/MADS) @) A1 _/ K3 N. I! _5 s2 X9 T
  30. - Orion Burger5 E$ ^7 R5 A; |5 Z  R
  31. 2 b( @5 L6 U; q! v  n( Z
  32. · Mohawk
    ) b" ]% Q8 [7 T. |+ f% z. u9 M8 y
  33. - Myst
    5 Z8 Z, o% l# h" C. P5 A6 `
  34. - Riven: The Sequel to Myst
复制代码
; c( q7 V2 k0 {+ ?9 P
  K1 w5 R( R9 j* k# |
6 U& k7 q1 L# X
6 g9 B. x, E0 O8 f8 C1 p0 q
相关代码如下
1 G0 h4 u8 C  k1 x
  1. bool VideoPlayer::playFrame() {0 T' H  J( j1 s" o
  2.         bool end = true;
    6 S% {) j2 k: F
  3. $ n! W1 z$ y1 A- B
  4.         // Process the next frame while the file is open
    1 g4 v, Y7 }0 b
  5.         if (_file) {
    1 z1 Y* D  h1 @5 ~0 D' r5 {2 ~  J  t
  6.                 end = playFrameInternal();3 B* J. r" w# z$ H) ?; g3 _

  7. / h7 \3 T! Z* d5 g* C
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);1 a/ F! ~% f/ i+ s
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {
    , x6 x( Z. B1 ~! a- K( [  N
  2.         Common::String subtitle;) {9 I( u; ]# H& h; `9 a% A. P% {
  3.         if (_loaded) {
    $ F  Z: Y* N3 L! D9 C4 g
  4.                 subtitle = _srtParser.getSubtitle(timestamp);
    5 S  `! ?( p! b  l; s/ s
  5.         } else if (_subtitleDev) {
    - o, ^! G( ~' x* c4 ^+ |
  6.                 subtitle = _fname;
    ; W9 t- l! P; o& @+ R
  7.                 uint32 hours, mins, secs, msecs;
    - s# z% @; l: E0 V1 X
  8.                 secs = timestamp / 1000;
    / G% {+ q! J" E( C
  9.                 hours = secs / 3600;" g) G, p! d$ D' C/ B! K  u1 D
  10.                 mins = (secs / 60) % 60;+ P1 j* B6 u4 I
  11.                 secs %= 60;
    1 ]( Z% R8 C% U9 g  m! j
  12.                 msecs = timestamp % 1000;
    5 Q3 }, }1 q# R9 l9 x
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);) ~4 u# W2 x: g8 t: d0 H7 e; T9 _
  14.         } else {
    ( h- }" c1 a1 z9 L1 M7 N" }; i
  15.                 return false;
    ; \( j6 T2 L: Z9 ^' u6 a
  16.         }& T( ~1 p3 U$ l9 U4 f. {$ ^
  17. # V( c: `+ }. W
  18.         int16 width = g_system->getOverlayWidth(),( ^; {9 {; x1 ~0 h5 |" q
  19.                   height = g_system->getOverlayHeight();' S+ R5 y: t: [% q/ y% C# o
  20. : o0 n" X6 Z3 Q5 `4 M
  21.         if (width != _lastOverlayWidth ||, f  E7 L# ?2 @1 Z
  22.                 height != _lastOverlayHeight) {; X) o6 E  {4 ^3 p
  23.                 _lastOverlayWidth = width;: P/ ?2 Q/ m2 _  r" ^. `, Q3 h
  24.                 _lastOverlayHeight = height;" x; M& T" i& K' ^  w

  25. 2 {$ F6 L6 `2 A' I9 d+ v
  26.                 // Recalculate the real bounding box to use/ W, m/ b9 O( L
  27.                 _realBBox = _requestedBBox;
    5 s0 o3 i9 Y2 J  W1 G$ B. b

  28. 0 U" _5 Z: {+ U6 v
  29.                 if (_realBBox.bottom > height) {
    3 {5 R! O5 e: W" K7 ]) G
  30.                         // First try to move the bounding box
    - z* p; I' @) j2 `* y+ `
  31.                         _realBBox.top -= _realBBox.bottom - height;4 G% J& z$ m, n% E; c$ v# Y
  32.                         _realBBox.bottom = height;
    $ Z* a3 e; N7 t( Y0 Q- O
  33.                 }
    9 a* p$ @8 `) I3 e! r& B
  34.                 if (_realBBox.top < 0) {
    - L: G4 \' {! S# `/ Q6 O/ C
  35.                         // Not enough space, H( E- o2 V# u3 D2 Y# E; F
  36.                         _realBBox.top = 0;! Z# u$ \" e& a. M) z+ p2 Q- y
  37.                 }" G9 L4 g1 r' S: r& a0 g: u) x
  38. 4 ?, [+ j+ O# p3 |
  39.                 if (_realBBox.right > width) {3 s& J. [7 T5 X- @/ o; k
  40.                         // First try to move the bounding box
    2 q: V4 W1 b1 W' n/ q
  41.                         _realBBox.left -= _realBBox.right - width;9 ~# p$ q- v9 z1 C. U
  42.                         _realBBox.right = width;; {, h: j! }& B9 D2 ^  H
  43.                 }
    / t' E" u4 L- P% d2 j  K
  44.                 if (_realBBox.left < 0) {, }. C! g9 y) E1 _1 t2 ]$ G
  45.                         // Not enough space
    # {  z4 e/ h: r* }
  46.                         _realBBox.left = 0;7 S7 }/ S5 `8 i! T
  47.                 }% b  a) ^- Q: Z( l) Q6 z# O$ x
  48. ' c% p/ M; S: g' t- ?( Y9 v! k" V0 g
  49.                 force = true;
    ; L$ {; M: L' ?: Y9 o& l. F2 q
  50.         }9 N  `% ^0 b8 c, M9 }  {$ n
  51. 4 C7 q% @, c$ [% E% b0 z
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle)
    8 n" F4 C/ E2 ^! {  S$ c$ a
  53.                 return false;5 b9 ?5 W- O! j& p) i
  54. 4 g( E* a+ ~! |5 h+ G8 g1 R: z0 Q
  55.         if (force || subtitle != _subtitle) {
    2 e/ }# w) t3 B5 \8 F; i
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());
    : s+ H) K  h( B6 C. P& g" {

  57. 4 t0 S/ G* ~+ S- m  R& e' h+ T
  58.                 _subtitle = subtitle;
    * T4 e- d6 ]8 ]
  59.                 renderSubtitle();( o! K: p! X4 r
  60.         }- P7 M, ?, D/ P, n' c- B: E' ^7 D

  61. % {; N0 h+ ]6 v0 r- W
  62.         if (_overlayHasAlpha) {! s1 |( S8 Y; n( X# W+ z! L, I
  63.                 // When we have alpha, draw the whole surface without thinking it more6 D! H9 f# I  F
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());. V0 U1 ?6 [  Z/ P% k+ z: K3 X
  65.         } else {: D, d0 |! t& O# l% i5 w) ~5 L
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen
    ) U" ?7 N; E( W7 m2 r3 H6 y
  67.                 // We force a copy of the game screen to the overlay by clearing it
    ; g$ i8 g/ {- F" }  e' S  T4 l$ X
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text
    , o+ G' B" J/ y; f9 Q& L( Z
  69.                 g_system->clearOverlay();7 o+ @% g8 n% x3 {0 \9 j
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,* R* i" `* H: A. b% q* p
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());# X9 A) B% d7 O* I$ Z# [; g& _7 \# F( O# u
  72.         }
    7 v$ ^/ E! Y& {8 w8 C" F0 t! Y8 x

  73.   b; K5 J1 a0 W' Y+ E" \. X/ W
  74.         return true;8 p% E. d: z* r/ w; J) O$ Y
  75. }2 l9 V  z+ `! M6 N% B! I1 @/ {# ?
复制代码
7 {. D% j+ a- l2 U
' e% g: k6 |& e  \4 o# O1 a

- T  Q, b; @- L; u" B
. Y% `2 `) k! l' O- x* V% F( Y1 Y) S$ i, O  g2 t9 Z* t  Y3 F( E

- g, m& H. K+ v8 [/ N9 r6 |4 k* g9 ?7 L/ I" _8 F2 M- E4 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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