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

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

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

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

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

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

本帖最后由 shane007 于 2023-8-12 13:57 编辑
6 s' f: G9 X3 Y2 L& F$ z' P3 t* p1 o
这个游戏原本是没有字幕的,但是在Scummvm论坛上发现了一个帖子,
6 I: f( U( E" U" S$ ]讨论的内容是关于在原本没有字幕的游戏上加上字幕。(最初的缘由,是为了帮助一位失聪的朋友)+ R# k+ }! Y% B# x4 x: {
https://forums.scummvm.org/viewtopic.php?t=7168, L, j2 C( L- ?
[Scummvm-devel] Displaying subtitles in voice-only games (narkive.com)
, ]0 ?5 B  N9 ^  X( C7 t8 N# {% ?; t; u$ W. t/ F
前段时间第七访客出了25周年纪念版(The 7th Guest 25th Anniversary Edition。
' u, ]+ N+ U6 R4 Z+ T在这个版本中,游戏的视频是有字幕的,因此把这个视频的字幕用到Scummvm中就成为了可能。) @7 t, |6 d7 }1 `4 m

, F2 p; U0 X$ r  x$ P; ~我查看了一下最新版本的Scummvm的代码,发现老外已经加入了一部分代码。
. b) z& X4 C( A; [在此基础上,汉化是大有希望的。此种汉化方法,也是前所未有的,如果真的实现了将会有重要意义。
7 ^/ A* w1 X! q5 ]3 K8 S- W% k! {7 K6 I8 a* \8 a
类似游戏还有
  1. · Groovie8 @1 k0 n2 i" ?% g  J1 N
  2. - The 7th Guest
    8 i1 }2 _1 U0 C$ K+ Z8 x' g
  3. - The 11th Hour
    - w% `% m! c. @9 Z) |5 P
  4.   g! n7 A; q5 y! `
  5. · MADE
    1 c5 w, ?. a  O; v+ d% o
  6. - Return to Zork (descriptions are text only, while spoken dialogs lack
    / g: L" b4 F" m8 d
  7. any text)
      [- P3 Z% a3 D- p/ a
  8. & O2 B. n+ I& C3 Z4 n! V4 j4 N: y
  9. · SCI 1! Q# I# b) N# @0 u% {
  10. - King's Quest V (CD Version). In this case, just enabling voice and text
    + v( ^7 @" ?4 z" H$ s- t; i6 h
  11. simultanously would allow a 3rd party to create a set of MSG files1 d; n3 C. d4 i2 I6 G- q4 X
  12. containing the voice transcription/translation, as it happened with Gabriel
    4 W) j) x1 H1 k
  13. Knight II.
    , d/ s) W- w, B; X

  14. : \# k$ h, Z2 A* a0 s
  15. ) e# c0 S& R3 C( g8 y8 u% L
  16. Future engines:) f* V* k. N3 i5 r* g: W% s% f
  17. ; X( |) ^6 r5 y% u) g* \
  18. · SCI 21/ N% \) d& _- N" w( E( P
  19. - Gabriel Knight II: The Beast Within (Already a fan patch available in
    1 Z- T7 n4 H" S& |: g* l
  20. order to enable the text display feature)
    ' ?2 [( `6 C3 C& S, p
  21. - Phantasmagoria) h, m# _7 n) p7 f+ O+ r
  22. - Rama9 b! A3 A0 H$ V7 K9 O
  23. - Shivers
    & x  w5 I; D0 k9 ]- {9 @
  24. - Phantasmagoria II: A Puzzle Of Flesh
    ( I! R  ]8 T) P5 v- K

  25. ; K% w7 S" h( ]/ l3 b
  26. · SCI 37 M, M: k( ^% f; {% [
  27. - Lighthouse: The Dark Being
    8 M, z4 b* \; J2 u7 j1 j$ i" n

  28. $ c0 Z. W- S  C5 u. L* A1 q
  29. · M4/MADS
    8 ]- }: {" Q6 q( {1 M4 Q
  30. - Orion Burger+ s! ?2 ?7 F* O( V' K- O5 [$ `) y

  31. 6 k* y$ l% @' V) }- q( n' h
  32. · Mohawk: g" K4 g+ w4 S' r' B
  33. - Myst6 d( v2 q4 u0 d9 s
  34. - Riven: The Sequel to Myst
复制代码

  }. O9 f- _; @5 C0 w2 j, L- R/ V+ f1 H  ^- K5 H6 C

3 A$ s$ |2 g; Z' N$ |. }7 j  p9 f2 ^4 u( ]5 P5 L4 _* ?" V
相关代码如下
7 x3 _- Y8 I% ?8 u' V
  1. bool VideoPlayer::playFrame() {
    2 }1 p* G! M: c
  2.         bool end = true;
    4 m; n% j$ I% z* T

  3. . w' q! Q. L, a
  4.         // Process the next frame while the file is open
    " U4 y* E! _  K: @
  5.         if (_file) {
    + z; U) z( X& s1 p7 y
  6.                 end = playFrameInternal();
    . q. t( C, c4 b  ~# i

  7. * `: e( f- T/ N9 v
  8.                 _subtitles.drawSubtitle(_lastFrameTime - _startTime);- I# ?6 F: J) c" g4 N  t( m7 L
  9.         }
复制代码
  1. bool Subtitles::drawSubtitle(uint32 timestamp, bool force) {/ `4 U6 ]9 s- q1 }
  2.         Common::String subtitle;
      Z' @0 _  M3 M7 z8 W7 N
  3.         if (_loaded) {5 I& z( v; C% ?: b2 l' U+ k
  4.                 subtitle = _srtParser.getSubtitle(timestamp);
    2 \- J% f' A4 A1 P* u
  5.         } else if (_subtitleDev) {
    . L$ E( V6 g% f2 T# T# k
  6.                 subtitle = _fname;* Q6 T& @7 V" o/ @4 U$ [
  7.                 uint32 hours, mins, secs, msecs;$ D! {8 W0 v" G9 r  K
  8.                 secs = timestamp / 1000;( o+ w2 t: B1 f3 B3 U: q
  9.                 hours = secs / 3600;
    3 F. \9 J" \7 }  a) I: |
  10.                 mins = (secs / 60) % 60;! q* `  ?' v% W+ H( p2 a
  11.                 secs %= 60;8 S8 K1 F. j; i
  12.                 msecs = timestamp % 1000;# q! W/ J: P4 \" G* T2 ?
  13.                 subtitle += " " + Common::String::format("%02u:%02u:%02u,%03u", hours, mins, secs, msecs);
    ! E! t9 h/ m# U4 U# D, {, o$ Z
  14.         } else {
    0 r" N/ J* R- P% F; K, {$ s
  15.                 return false;3 m- q' Z8 O( y1 ?! i: S
  16.         }
    & G3 [- h( U! O) g0 i; @8 ^

  17. / R) s1 k. x  g& t- _% z
  18.         int16 width = g_system->getOverlayWidth(),+ O! w/ r2 }% k1 [/ K  X
  19.                   height = g_system->getOverlayHeight();
    : M1 T% ^& D8 a$ x' @+ v/ M
  20. . v3 k1 G0 g& p
  21.         if (width != _lastOverlayWidth ||& K2 Q, z6 F' U" X, U+ j  }  I
  22.                 height != _lastOverlayHeight) {: S+ g4 ~0 _- ~
  23.                 _lastOverlayWidth = width;
    ; _, P4 g+ a& {* j
  24.                 _lastOverlayHeight = height;
      n; ~* B& e* E6 I1 k
  25. - H$ _# T4 R' R3 O, t- B5 }) n+ h
  26.                 // Recalculate the real bounding box to use0 z) n! ?" b" @' J5 d. q
  27.                 _realBBox = _requestedBBox;" ^, ?9 L/ G0 T9 X* i8 l

  28. 3 d) D$ r, P+ [0 ]' R" F* V8 l
  29.                 if (_realBBox.bottom > height) {
    6 [2 }8 E# ?# s2 m% s8 w; f9 h
  30.                         // First try to move the bounding box
    ' ~" Y9 e5 G! e5 A+ i
  31.                         _realBBox.top -= _realBBox.bottom - height;
    , \4 h8 R2 X& `. b9 |1 T! e1 U
  32.                         _realBBox.bottom = height;
    ( k, @: {3 ]" X5 g
  33.                 }
    . \) M* q& v! J* V+ V2 j4 R9 U, `
  34.                 if (_realBBox.top < 0) {
    3 T' H" L# M  y9 Z6 {' Y$ \
  35.                         // Not enough space
    * p; W7 `; j: o5 C: A9 I$ W8 n: E
  36.                         _realBBox.top = 0;3 M: P. m, w( O  p( E
  37.                 }
    ! m9 J+ k% f& g

  38. ' M2 o+ n/ Q6 @; J0 R
  39.                 if (_realBBox.right > width) {
    5 M: C! c0 p; R" O# U
  40.                         // First try to move the bounding box
    7 r6 o9 t% g0 o2 Z( p  l- }3 T( z$ ~
  41.                         _realBBox.left -= _realBBox.right - width;% \9 a4 o3 E# Z! U; j4 L' `
  42.                         _realBBox.right = width;
    6 p; y/ B. l7 a% _
  43.                 }) L0 k! N; Y* M  u
  44.                 if (_realBBox.left < 0) {
    1 E/ t' a: n4 j$ _2 d8 N8 u, {
  45.                         // Not enough space
      V# c+ j; `5 c4 ^
  46.                         _realBBox.left = 0;
    ) p; E8 S- B  p5 u) @
  47.                 }' R( c6 e) @0 A$ n" }2 E4 s
  48. & s+ \8 T: Q' ^" f
  49.                 force = true;
    3 Q* T5 J0 `2 g* X/ n
  50.         }# l' @) p' z" O& |! {

  51. - @( Q2 `, y- N8 b
  52.         if (!force && _overlayHasAlpha && subtitle == _subtitle)* x" {. _' i6 X$ k& q* ]3 A# `7 }" s
  53.                 return false;
    . k) w" n8 w0 d, |; ~6 i' h7 A

  54. 0 a: p2 U% A3 P3 A
  55.         if (force || subtitle != _subtitle) {4 c; X; i' v8 a1 d
  56.                 debug(1, "%d: %s", timestamp, subtitle.c_str());& W' S. @: P! H  w& c: J

  57.   r& Z6 I4 t0 m/ F9 r- v& _: {
  58.                 _subtitle = subtitle;
    , n. k% F& O! @0 l, \% R' ^) v
  59.                 renderSubtitle();
    " j, A5 C8 \/ g
  60.         }
    ( h& c! k& W' J; l& N. B, n) H
  61. # V4 C  C) U0 e5 b0 D+ N
  62.         if (_overlayHasAlpha) {/ v( @8 m2 H8 d# a; V+ E" V) {
  63.                 // When we have alpha, draw the whole surface without thinking it more5 S$ p) g5 L9 Z' a2 E3 i# w# w: I
  64.                 g_system->copyRectToOverlay(_surface->getPixels(), _surface->pitch, _realBBox.left, _realBBox.top, _realBBox.width(), _realBBox.height());2 L- W9 m8 Q' {; f* s5 a6 X
  65.         } else {& H( D/ C2 W% Z3 ^! y0 k' }
  66.                 // When overlay doesn't have alpha, showing it hides the underlying game screen: R% d! R1 n* O& J' c2 u9 R
  67.                 // We force a copy of the game screen to the overlay by clearing it
    ! t" e6 f( p* H1 C/ n1 r, ~
  68.                 // We then draw the smallest possible surface to minimize black rectangle behind text
      t8 {) P3 ^* U$ W
  69.                 g_system->clearOverlay();
    2 Q1 n" w' E2 i. s6 l' s1 u
  70.                 g_system->copyRectToOverlay((byte *)_surface->getPixels() + _drawRect.top * _surface->pitch + _drawRect.left * _surface->format.bytesPerPixel, _surface->pitch,, k( }, T8 R1 `; X: {& I
  71.                                 _realBBox.left + _drawRect.left, _realBBox.top + _drawRect.top, _drawRect.width(), _drawRect.height());
    , y6 N$ o) B8 P7 b- g4 g% h, S
  72.         }
    / e6 \  U. ?. t6 p# b# f  {$ w+ C- U

  73. ! v9 E$ e4 ]  Y. G$ B/ R
  74.         return true;0 _8 w6 {. J1 [2 |& [
  75. }
    + z" ?" N  v9 S
复制代码
# E" E, d- e+ L! q& {
9 z1 Y9 [4 ~& q8 |# K: I( }

/ T- Y" Z/ p# f3 S, {% _* u. j
- \8 m; ]7 m: @3 _/ |; p
! o, O! ~. _& U5 d5 O) F' P8 x
  D& o- j# ^7 Y. E( ]+ ~9 b" g; q2 e5 B) Y4 D& X' |) C
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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