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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-12 13:57 编辑 * a2 _8 l" L( A! Z
( i" Q* o: i3 }6 J% T+ V
这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,
; ~* I, L5 V6 e& {讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)/ W/ R/ X5 ^! D# J; V+ C
https://forums.scummvm.org/viewtopic.php?t=7168" Q6 K8 P$ X7 I
[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)
  p) T4 C" e3 O) ?" g! Q; w, O
# J' \* a4 K/ s4 U  G前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。
# c+ u- S2 p! }& s% V) o  C在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。7 K, j! {. n, m$ I8 |

" h+ e2 I3 n. n" m我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。" }6 l* W( u& K! `8 ]+ w( G2 x
在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。; Z. {: H: _" N7 m: M* p
9 i! q* i" P) K
类似游戏还有
  1. · Groovie, p/ K7 S0 I/ _2 R
  2. - The 7th Guest* P6 A$ V% A* a  N: u- ~
  3. - The 11th Hour, a# U1 C5 u9 E5 [

  4. 8 o& \; @% d4 r2 P2 i* ~
  5. · MADE5 D& l( Y3 H% a7 x
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack
    ' _$ P! J% t7 H. b. f" m% ]' M
  7. any text)
    . `& J$ j% M7 J$ Z
  8. 5 d! D+ l7 C% f* G1 @, j
  9. · SCI 1
    , g# w; G2 g. G/ u8 q8 D" a5 ]
  10. - King's Quest V (CD Version). In this case, just enabling voice and text
    ( }9 P# x% V+ d% v- d* ]
  11. simultanously would allow a 3rd party to create a set of MSG files
    , a; X# O) \" }5 I' w
  12. containing the voice transcription/translation, as it happened with Gabriel
    * a8 D' p. o& F6 z
  13. Knight II.7 r$ Z/ K3 ^) c/ s# O" l# u" M; k
  14. 4 U" A7 X: r9 Y

  15. & X+ k) Y* S  [+ j
  16. Future engines:
    # g6 I# ?3 r7 g% P

  17. " d# O; z- P% _" C& ~- c: h
  18. · SCI 21
    $ D! o5 r/ ?' o0 l- x1 \$ q" f
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in' @5 U7 L" j7 h, F
  20. order to enable the text display feature)  J+ c2 V4 A& v$ I& Q' k8 K
  21. - Phantasmagoria% ?5 i5 N' u+ m3 [3 @* d
  22. - Rama) G% x" }' r; U6 W# p1 u
  23. - Shivers. b  I+ n  m& x6 D, R# }3 w
  24. - Phantasmagoria II: A Puzzle Of Flesh
    & c* E" C% J1 O1 K$ F/ n6 T

  25. - ?" {5 B4 B( a/ V' e' o
  26. · SCI 3
    ' r, K. v+ s* q- A2 j
  27. - Lighthouse: The Dark Being
    9 r; c& e8 B2 N. G6 H

  28. 9 I8 {1 Y. C3 @8 r
  29. · M4/MADS
    , Q' s( S, N& T: n, W/ w$ b5 S' w
  30. - Orion Burger6 l# Z& @- E2 q( t/ `) y% d
  31. - G7 y$ l; _4 K
  32. · Mohawk
    , ]+ F$ @& R# n" X! U3 h0 t# ?
  33. - Myst3 [7 H( M" B$ g2 y" F9 z
  34. - Riven: The Sequel to Myst
复制代码
) S9 j1 ?2 n" h7 U9 e2 @

) N/ k/ J0 Z, ]# b( B
5 s# Z; C6 n: m# d1 ^8 d) C, G# k1 P/ H" k. r2 Z
相关代码如下% h4 T5 z  v: O8 u  d% @
  1. bool VideoPlayer::playFrame() {
    8 O: I7 j' {5 r) u6 C) C. |, D  f
  2.         bool end = true;/ i% I/ a8 s$ D, @
  3. , `8 K7 C3 G* {+ w; W7 I$ s& P3 X
  4.         // Process the next frame while the file is open* p  w' u# n3 M" e8 @. Z
  5.         if (_file) {
    ; z4 t7 L0 a) O; C) |7 g
  6.                 end = playFrameInternal();8 b4 d) R! w* A: U4 q& c
  7. - L0 w" `5 Z3 d1 S* b# q
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);7 B: p0 B% _* P1 Y
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {( P5 r5 I3 c; u1 M6 g
  2.         Common::String subtitle;; o' U: {  i" J+ B( f& J  G
  3.         if (_loaded) {
    ( w7 S$ E# V# q" }
  4.                 subtitle = _srtParser.getSubtitle(timestamp);
    ; A' d$ b+ i+ P; b. f
  5.         } else if (_subtitleDev) {7 Q  W& R9 ~; ?" l4 }. u+ ~
  6.                 subtitle = _fname;8 q3 }+ w: T8 L1 x6 t2 D$ ]
  7.                 uint32 hours, mins, secs, msecs;
    9 `. V9 v* B1 i" R. ^: P
  8.                 secs = timestamp / 1000;
    + j. \3 w. k7 u$ Z
  9.                 hours = secs / 3600;4 b0 R4 V, Y6 Q9 H& y% z% ]
  10.                 mins = (secs / 60) % 60;
    ' l: X. A9 U* L5 D
  11.                 secs %= 60;
    6 u4 n* ]6 h8 ]4 D
  12.                 msecs = timestamp % 1000;7 ^+ u# i# L) T
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);1 I1 ^( \3 J# g# t, ]$ s. f
  14.         } else {
      j0 w7 G, J8 c1 R4 f
  15.                 return false;+ C: C6 z& w7 U% y; z
  16.         }
    : [+ h9 U6 G! I$ ^) D: f/ m; l

  17. ) ]8 h/ t! f; ~, T  u' t7 _
  18.         int16 width = g_system->getOverlayWidth(),0 `, f0 ~( s% _/ ~
  19.                   height = g_system->getOverlayHeight();
    ; Y% Z# v" k/ v- Z) t6 ?

  20. 8 _/ ]2 v  L- X5 `9 w! R5 S
  21.         if (width != _lastOverlayWidth ||
    0 m6 U7 }# |* c4 q
  22.                 height != _lastOverlayHeight) {
    ' V( W+ z$ t3 L! S5 v
  23.                 _lastOverlayWidth = width;
    . e7 i" ]6 |4 V" k9 o. _
  24.                 _lastOverlayHeight = height;
    $ I; y& R& e% S8 y# E  f# B" H
  25. , V* [/ Z$ Q7 [- h. t2 b3 l. g
  26.                 // Recalculate the real bounding box to use
    / s- b5 ?* X2 D7 P+ ^  G# ^
  27.                 _realBBox = _requestedBBox;# P$ h) {6 D' X! l

  28. " s" X+ J2 `, `( x) G; y& U+ f5 a% ~
  29.                 if (_realBBox.bottom > height) {3 e- S; M$ F: _* J8 U/ l
  30.                         // First try to move the bounding box( h- U9 T! I$ \8 ^
  31.                         _realBBox.top -= _realBBox.bottom - height;
    , a) z# v) z8 m! l& u- k: k
  32.                         _realBBox.bottom = height;# G1 x5 _3 E4 U. a# G) h1 h
  33.                 }
    9 U) V7 c$ f- s8 G: E
  34.                 if (_realBBox.top < 0) {
    % o$ Y  a! I7 z; F2 j, ?- r+ b
  35.                         // Not enough space3 c. @& T/ q) o. T1 s, ~
  36.                         _realBBox.top = 0;
    . g! x* k7 s! M
  37.                 }9 \7 R" A$ \# z% T& z9 K! z
  38. / h, i2 _/ P0 R% W1 Q
  39.                 if (_realBBox.right > width) {5 e% ~& j1 _& p' ]% R& B
  40.                         // First try to move the bounding box/ \' j' N9 {* n+ K* Z7 T1 P
  41.                         _realBBox.left -= _realBBox.right - width;6 n! J: i5 k2 o3 ~$ }
  42.                         _realBBox.right = width;! h  n4 G4 B+ z
  43.                 }
    ) T1 Y3 e' l' X4 D( S
  44.                 if (_realBBox.left < 0) {
    / S- W% Z4 g; w9 c: y) f5 |
  45.                         // Not enough space
    1 }/ z7 ~1 A& t
  46.                         _realBBox.left = 0;- W4 ?. x8 I# G/ @& L
  47.                 }
    6 v7 B. G1 _, V( {( p3 M8 @

  48. " g; _# {3 a4 v- v- G
  49.                 force = true;# S4 [' |  x$ [7 q# S) t
  50.         }& I5 ?' X3 m$ V

  51. ' `) k1 W2 p& A: c3 s
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle); g8 Z! u0 ]% b& v7 R0 B8 }4 e
  53.                 return false;
    ) e% M. @$ r% f& E" m

  54. - ^1 b* Y* ^' ^3 P0 c& m
  55.         if (force || subtitle != _subtitle) {
    3 R6 M0 J; ]% k2 s* u
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());
    5 b% Z4 q! h( }1 K6 X0 ?
  57. . ~- j, A& y( {. N
  58.                 _subtitle = subtitle;* a7 F3 E! B+ A$ N
  59.                 renderSubtitle();- s6 d' w7 u5 s) v+ l' j' L
  60.         }) t9 k+ _! M1 b6 T) }
  61. $ M  ]% F& I1 n5 i
  62.         if (_overlayHasAlpha) {1 A3 y5 K) F4 i' W3 G
  63.                 // When we have alpha, draw the whole surface without thinking it more
    4 Y) s0 D) v) r' c& f
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());: C/ t% Q& A! F, g' X; E' \
  65.         } else {
    2 c8 v1 l! D/ P7 ]
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen
    / S/ V" f! \: a) V' J% V
  67.                 // We force a copy of the game screen to the overlay by clearing it
    5 G9 q; T7 x. p9 ?% N9 f# X$ d
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text
    / @; J, r& M- p9 f& B
  69.                 g_system->clearOverlay();$ A- a* y: k6 Q& d  i( f' I! R+ Z
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,
      j5 G0 l8 O  l  O2 l
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());
    9 j/ v% `% O3 T3 i
  72.         }" O3 y" f5 C. E# r+ L
  73. 9 F* {2 I0 ~+ q
  74.         return true;; R( x& K; r4 u, m# j/ ?
  75. }6 D# w4 d7 _! m. ^3 ]; U
复制代码
2 d  f1 C- `4 D2 g& `

& l9 L( i- K: b, \: ?" m5 M
1 V6 Q' e: I$ P  q* o3 p& z5 x* x5 H
/ c& U2 X! d" H, `+ o% e* U
- n, D2 k5 a) i# G& G

6 M0 e  _. W4 x, |* ?
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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