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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-12 13:57 编辑 2 D9 ]3 E; J5 F8 i
0 J/ A# T7 j; Q1 `* i2 \6 K& i
这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,* W1 o) s- w+ V: s
讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)
9 g$ [) v& g- S# |2 I$ ?https://forums.scummvm.org/viewtopic.php?t=7168
7 Z, V( Z- A& j' U/ y* z" u+ p[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)% z3 F4 l$ w9 w) ?0 |/ v7 d

5 k; Q, w* k8 ]/ P! U. e前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。
8 b( C5 w# @% i5 k0 U7 z# `- X在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。
5 {" m+ |+ o% h6 r/ y; ~0 z+ \: P& D) o3 p- }/ x2 J
我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。
/ s! e0 o' Z+ `0 d在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。" x* x) S  y, _5 y0 {2 B
  b0 ]/ o8 a9 \% ~5 _
类似游戏还有
  1. · Groovie0 m1 E1 |  C/ o& N! z( E5 `
  2. - The 7th Guest% b' ?5 I( c$ w; X; W9 ~
  3. - The 11th Hour
    + g/ ~; m& H, L: M
  4. 5 n& [2 h9 x$ x8 U
  5. · MADE7 w# I5 o. S6 L% a3 x; o+ U
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack
    ' `7 k0 B: m2 D; r( {8 h# O
  7. any text)
    # f$ T& r; J# m. `6 R' r

  8. # \1 t' H. P; \, Q$ G
  9. · SCI 1
    ; g/ {. C* Y" H# F
  10. - King's Quest V (CD Version). In this case, just enabling voice and text
    7 R; m5 @4 Z1 Q  h
  11. simultanously would allow a 3rd party to create a set of MSG files5 U0 Z5 J3 y+ k( `1 a# X& Q9 j
  12. containing the voice transcription/translation, as it happened with Gabriel
    4 O; s0 Z3 N* D# q9 G# f6 t7 W
  13. Knight II.
    ' p1 ^- V6 }! F
  14. 9 \9 O* X0 r- p. Y" u
  15. 5 r5 z1 y$ U( F
  16. Future engines:! Z, i: n' N; U5 a
  17. 4 {  J+ b7 z% L( |! R2 k' ]4 Y
  18. · SCI 21
    2 B( ]* T% S# J  D3 A" t+ k5 p1 U
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in
    4 k, S3 ^- v0 z* w' g; _. U2 E
  20. order to enable the text display feature)
    8 l6 J9 f! z* r* B
  21. - Phantasmagoria1 e& ?; _- ^* q! y" [3 w* X
  22. - Rama8 }3 Q7 @  u2 ~3 ?1 u* P
  23. - Shivers
    4 m$ T: N+ _$ o
  24. - Phantasmagoria II: A Puzzle Of Flesh
    / H5 e# ?" ~  c) m4 s# K% ?
  25. : s' c$ h+ P+ D2 n) X/ F
  26. · SCI 37 q5 v0 O+ {' g
  27. - Lighthouse: The Dark Being
    , k- X8 J3 n# ?( b$ _( l3 X6 H' Y: |  x
  28. 6 t3 j4 w, t: \7 o; K
  29. · M4/MADS1 F/ p9 g: b, [9 S3 b4 f  h3 ?3 b3 z4 T
  30. - Orion Burger6 K. w+ G! M% ]4 i& U! u9 T

  31. 4 D( D# W% Y+ B2 `& X
  32. · Mohawk$ N- |% D8 F7 K3 S9 P( O
  33. - Myst
    1 F  f2 C0 l8 j0 ?; W
  34. - Riven: The Sequel to Myst
复制代码

  n( b+ R3 c$ P
& A- L$ j1 N& B' u: U+ P
; R& H  M2 ^" D3 d8 X
0 e, g1 Z5 e9 N9 {相关代码如下
% w, F: ]+ E- T, [# z  j
  1. bool VideoPlayer::playFrame() {, Q* X6 h. l: j( H% [% p8 J
  2.         bool end = true;
    7 v& F: T. F- B. u; [

  3. ! R4 V* u+ z! |+ Z9 y
  4.         // Process the next frame while the file is open
    6 Z/ N$ q9 H% o) f6 t, q5 s
  5.         if (_file) {9 v3 }1 A8 }: D" E6 [4 t2 A
  6.                 end = playFrameInternal();
    ( C5 I8 s( p2 c

  7. ( j7 M) ^* G& g) `2 ~$ l: ^1 q
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);
    0 s) h) T+ M+ t, x& t
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {
    # z. c: ~8 W% I6 Z* V0 _$ Z4 R
  2.         Common::String subtitle;
    8 [) }% l; N% U) y# u3 U( e4 b
  3.         if (_loaded) {3 G' D2 E2 G7 H; r
  4.                 subtitle = _srtParser.getSubtitle(timestamp);
    * ?, _/ W5 ?4 g" S$ S7 D& j
  5.         } else if (_subtitleDev) {* `# X; Y5 X1 N4 ]+ Y
  6.                 subtitle = _fname;! K  r: P1 |2 z3 j) C
  7.                 uint32 hours, mins, secs, msecs;% I, s% M9 L5 a" a5 ]7 T
  8.                 secs = timestamp / 1000;* n: ~+ e2 h3 G, _& W
  9.                 hours = secs / 3600;1 b% f8 {2 R7 \5 @# Z
  10.                 mins = (secs / 60) % 60;* W; ~( R/ n5 {, Z; c5 N3 L# Z
  11.                 secs %= 60;
    + Q4 @% Z, g# S/ k. K& P
  12.                 msecs = timestamp % 1000;9 d0 V$ Q, y9 _& Y9 F1 o& W% H9 t
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);% Z- Z4 B* `0 ]5 h# J  X) G
  14.         } else {
    - K& g$ h9 R+ O6 M3 W) e, V8 P
  15.                 return false;2 X) U4 `2 e; s) r/ u
  16.         }- |' u* A% R+ W3 e5 N" x4 F: @  A

  17. 3 C; A* b' o1 F4 ^
  18.         int16 width = g_system->getOverlayWidth(),% v- S5 r8 q* }# |2 L6 i
  19.                   height = g_system->getOverlayHeight();) z8 _! `6 e) }$ O. t

  20. $ s" \1 Y7 H5 H& T1 p) @- E
  21.         if (width != _lastOverlayWidth ||
    0 `: H9 c; ]8 a+ V& S# v
  22.                 height != _lastOverlayHeight) {+ }* S* K$ Z7 l" |+ ^) P
  23.                 _lastOverlayWidth = width;4 W! ]4 K# F7 m) I% Q. }
  24.                 _lastOverlayHeight = height;
    ) M. l' u* @8 h
  25. 3 o+ {/ o* J: h/ X
  26.                 // Recalculate the real bounding box to use2 p5 X- s! I& Q/ A7 I7 S1 |
  27.                 _realBBox = _requestedBBox;+ U4 A6 i( F8 ]

  28. ; j, u. Z1 E% k, `: W; L+ |
  29.                 if (_realBBox.bottom > height) {' w# O6 V. a  @. Y2 Z% ]) ?6 Z
  30.                         // First try to move the bounding box
    5 r5 O5 P- ?- e9 c! }3 z4 r
  31.                         _realBBox.top -= _realBBox.bottom - height;8 Z4 ~; r. u: X- P0 b
  32.                         _realBBox.bottom = height;+ @% Z( E7 g' G2 W7 L) Y
  33.                 }
    * D7 ]1 `  ?" g0 g8 s$ z
  34.                 if (_realBBox.top < 0) {1 M  k* U+ V. O# o. a2 R: k! M2 g0 v
  35.                         // Not enough space
    ) T& `* }) A) j) `3 {8 ~  x# O/ x
  36.                         _realBBox.top = 0;# s( \; Y0 {4 h1 O. R" V8 |
  37.                 }: i, j" y2 t, O. n& F

  38. 9 c) J& t% N$ W! r& D
  39.                 if (_realBBox.right > width) {' o% s+ |4 w: p2 K
  40.                         // First try to move the bounding box
    1 `8 q7 D% q7 ~. G5 ?9 E
  41.                         _realBBox.left -= _realBBox.right - width;
    " ^- M* Q: ~# O. R5 ?' N* ]
  42.                         _realBBox.right = width;
    2 |2 k% m/ P/ i. R/ G
  43.                 }% [( p8 I. Y5 p  d, N6 a% Q3 O
  44.                 if (_realBBox.left < 0) {
    / r( ]! R& E) }; j
  45.                         // Not enough space2 J, a+ s+ I0 b, M" ]$ K$ R( E
  46.                         _realBBox.left = 0;/ `  e0 D' e' h' B. ~9 \
  47.                 }* o5 A% b  b, V. T$ Q) S
  48. % q9 ~* x  ^" G+ E; F' t6 w$ G! F
  49.                 force = true;
    ) V2 f- F6 K: E# _+ o$ x% |0 I
  50.         }1 |6 I  w3 ?+ |+ i3 v/ K2 e) ^
  51. ; C+ S  h- V: x3 C
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle)
    " _' a& u! V, x/ K0 n' B
  53.                 return false;+ E( F4 {. `$ g: l1 h5 N

  54. 8 g; e) F' z8 I0 d
  55.         if (force || subtitle != _subtitle) {
    # D! M/ N2 B: r0 Y! t/ Q
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());
    # f) ^4 K0 u$ {' _
  57. ) B) q- [$ p) G, c
  58.                 _subtitle = subtitle;
    " [/ i+ G5 T- u8 G
  59.                 renderSubtitle();' v, U& r2 Q+ P$ b: `
  60.         }; v' J; U6 d9 T
  61. / G7 G% n) B$ K- Z
  62.         if (_overlayHasAlpha) {$ a/ x' t: e# e
  63.                 // When we have alpha, draw the whole surface without thinking it more
    ) c5 z9 P) g! y' r) F* W! A$ H# ]
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());
    ' ]1 g0 E9 l, d7 v
  65.         } else {2 W* z3 _) h8 y
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen/ X/ y. w8 E5 H7 o/ [$ r9 h
  67.                 // We force a copy of the game screen to the overlay by clearing it
    : j6 Z4 H" u7 q9 \6 g
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text  M8 ?$ P, J, ?5 P
  69.                 g_system->clearOverlay();) ]$ R& ^$ S: @* r& F5 Z  q: o
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,8 `6 w: v" k! E
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());; y; k) _) g" d* ?* j0 G2 o. P* X
  72.         }
    ' h) ~  Z# _5 P) m  `( ?4 [. H, {5 @
  73. * a" C/ y1 z0 ^/ x- n+ t* u
  74.         return true;0 s. E4 a, w3 Y7 [8 b% ?, ]3 @
  75. }& x: E; C+ G0 v' l
复制代码

9 h8 A# L+ J; X( \0 ]4 K& e8 b) S# ^) A+ d
& O5 B7 R% U6 x$ p1 |% O, ]

6 Z0 R' \& S3 T5 B5 s
! G# B9 k( Z  _: ]: p' b
8 d- ]7 H5 [! G" V) C1 f0 G) }4 ?  p# N0 j6 D3 ^1 p6 [& a& ^, l. |
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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