冒险解谜游戏中文网 ChinaAVG

标题: 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists [打印本页]

作者: shane007    时间: 2023-8-27 10:39
标题: 【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero)字幕显示函数 glCallLists
本帖最后由 shane007 于 2023-9-4 18:28 编辑
* M, G) @/ T! Z$ V' ]! |+ Y! b7 z" Q' [2 j7 }2 `
这是一个opengl的游戏,当初发售的时候只有德文版,因为被人遗忘了," }3 f: f1 g' ]3 R, x
但目前已经有了英文补丁,因此汉化又被提上日程。
6 j" S! N* F7 u
+ `$ t1 X( J% p2 v2 Z* G对opengl的调用主要是在toh.exe完成的,
4 ~  q) o4 z( U! f% N. J对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数$ a, R6 X' w  T( M
8 W* R9 {; D& \
glGenLists的调用处共有6处,每处都类似,
4 o$ d/ Q! p! k3 {0 ^可见游戏初始化了6种字体,每种有256个字符。
) V+ Q* \6 k- ]其中一处代码如下。可以看见游戏创建了256个显示列表,并调用CreateFontA生成字符的材质。
6 \) t1 j  C0 [) Z4 `/ S修改的时候,应该还要修改到上层调用的其他函数。" |4 q+ _. \. E, F) @7 B
  1. BOOL __cdecl sub_4518C0(HDC hdc)8 }8 w% C# K& S) O4 H' Y
  2. {
    . N# {6 G, k9 w+ S
  3.   HFONT h; // [esp+4h] [ebp-8h]
      Z8 s8 `7 S: t/ Z: r7 u7 E
  4.   DWORD iCharSet; // [esp+8h] [ebp-4h]; s2 L% x" G+ o. \6 ]9 r

  5. ) y( ?. o4 m, v5 u( f) z
  6.   if ( dword_4A4490 <= 1252 )
    ' u6 b5 ~! A( Z% f. X/ `0 z
  7.   {
    - A4 n, {& Z7 ], J
  8.     if ( dword_4A4490 == 1252 )! d3 r  p3 F6 k; _& w! y! f
  9.     {0 a8 k, E5 Y2 e8 E
  10.       iCharSet = 1;- b+ G0 _8 f) Z* y! E! G
  11.       goto LABEL_11;
    . V( u# r6 X. H: U% f* ~
  12.     }  `: b  Y# m9 T# e% f
  13.     if ( dword_4A4490 != 1250 ). f  Y1 V+ K6 O8 U( j( p  a
  14.     {
    ; ]! c1 @9 R- L1 u
  15.       if ( dword_4A4490 == 1251 )
    / e' [9 w! G2 w3 m
  16.       {5 M6 x; ^- B6 }
  17.         iCharSet = 204;5 O! J3 ]- I3 |7 H
  18.         goto LABEL_11;5 s# W  G& x' e+ L% ?: Z, E
  19.       }* t- @; S2 n5 a
  20.       goto LABEL_10;
    # t% o/ W' O( Z* [0 s) r+ S
  21.     }
    3 u9 {8 P9 Y2 t$ B2 i9 W( S; f
  22. LABEL_7:
    6 d3 X: v% p) u, g
  23.     iCharSet = 238;, x1 i2 U3 h% c. E
  24.     goto LABEL_11;& b% O+ c! a- f5 f% t/ T
  25.   }
    + U7 d1 B" e! @' Z; J
  26.   if ( dword_4A4490 == 11250 )
    4 i4 E) r; C. b
  27.     goto LABEL_7;5 Y/ V( x, c. E
  28. LABEL_10:
    8 i5 B3 s! T/ L+ d; D, x
  29.   iCharSet = 1;. p5 R) b. {( t9 i1 j" Y* `
  30. LABEL_11:0 T) J" o2 Z* A. B0 N$ [. n$ _
  31.   base = glGenLists(256);
    4 L& g$ g& T' O/ H8 K* P
  32.   h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, pszFaceName);# U. g2 O9 S0 C( O3 s! Z! Y
  33.   if ( !h )# `$ d) Z6 S$ s
  34.     MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);6 X# [. Y% T( {# f  t: B- G
  35.   SelectObject(hdc, h);8 ], W9 l- S( p/ ]) S% r
  36.   return wglUseFontBitmapsA(hdc, 0, 0x100u, base);# f) a& I. |0 R/ z7 p8 c1 |: [4 Z
  37. }
复制代码

8 B, O1 O: i# g0 a& n! T, @- a0 F
2 H  E9 f/ O* Z2 U+ u; GglCallLists调用的地方共有3处,% G) s: d6 A& O4 s* s* Y$ ]
这个函数就是游戏的显示函数,共有3个参数,3 v5 B7 D8 V. T% y
  1. void WINAPI glCallLists(
    0 S9 C, a/ g* g8 b% e3 z
  2.     GLsizei n,
    ; s; T# k  I0 N% ?  N
  3.     GLenum type,
    1 b. t7 M, O  v8 G$ j# G
  4.     const GLvoid *lists
    9 R3 d, ?7 ]0 J' V9 u
  5. );
复制代码

3 D8 f' h2 a" _
& L/ P- h; k; ~+ r; }7 w  其中n为字符串长度,type为字符串类型,*lists为字符串指针,
& C/ f! w  }. F, ^0 d  ^! Q, i  @+ x  如果游戏在调用glCallLists时第二个参数使用了0x1400,即GL_BYTE,则表示单字节:5 l( [( V2 c# w# s
  需要修改为GL_UNSIGNED_SHORT,即0x1403。, Y) v( e8 z: h; Y+ Q# ?) Q$ x0 N- q

8 F; o# `2 T! c1 f6 h定义
- I! O/ u; A, N/ K; J% A
  1. #define GL_BYTE                           0x1400
    4 z. o; ^7 A4 C% X2 q* B; u
  2. #define GL_UNSIGNED_BYTE                  0x1401
    ' f( U; s5 G3 o8 ~' u
  3. #define GL_SHORT                          0x1402
    2 }" _! W: [  f/ b6 D" C, J
  4. #define GL_UNSIGNED_SHORT                 0x1403
    / Y8 l2 r% M% k  q" a# f7 e
  5. #define GL_INT                            0x1404/ f  o0 d1 q( L7 y8 ?. n9 g
  6. #define GL_UNSIGNED_INT                   0x1405
    # }7 c& W( d' \. g- \1 l
  7. #define GL_FLOAT                          0x14068 ~* A2 `. k* V  `0 V. M
  8. #define GL_2_BYTES                        0x1407& g  [6 n! _9 h$ ~+ k3 K+ _( D
  9. #define GL_3_BYTES                        0x1408
    4 O  s- ^! ?0 ]' y4 I) {$ E
  10. #define GL_4_BYTES                        0x1409
    9 e1 l- q2 ?9 _& q5 }$ L+ u
  11. #define GL_DOUBLE                         0x140A
复制代码

2 R% N9 J, C+ h+ @1 V0 S3 k0 _/ x3 _6 Y  d8 I

作者: shane007    时间: 2023-9-4 18:28
顶上来,顶上来




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2