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

建议 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

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

[建议] 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

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

【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

本帖最后由 shane007 于 2023-9-6 11:03 编辑 + Z& R% x4 b+ O, d+ f; K! _: W

0 _' n+ S9 i2 {  x(nibiru.exe 772 KB (790,528 字节))% y  j% U$ e6 f' s: P7 _

3 B, P: }' _8 v8 N将sub_451390,sub_451599 这2个显示函数进行了hook.
/ L. F" a) z) d( U8 T! b; H; Z确认这2个显示函数都被调用了。
8 J. B' x6 E; k; m第1个可能显示的是调试字符串,第2个显示游戏字幕。9 g$ o3 R) t2 L0 ^

( a0 n9 V; l1 Z$ c% i% \, f以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。  N: ?. r% D( l; `5 n

5 T1 a$ [" _' U, f* t    //v12 这里出错
5 B  ~1 Y9 P' e0 [# c" {    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);* c+ X/ D% t: i) g+ p0 ~
# G0 K& S* i- B5 q, e9 j
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
; Z; U% D. \# ^+ t  ~+ a这种方式显然是有问题的,会影响性能。& Y0 x6 ]9 [6 \4 r  t$ N9 G
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。4 A# j5 d$ J3 R. N5 R$ D
* q) b* y8 F' q4 |! P; g1 J
  1. sub_451390_Font1_hk' B& Z, d1 |: y4 q& G
  2. sub_451390_Font1_hk
    , W7 N9 ?/ d% L) P* c
  3. sub_451599_Font2_hk6 _: a9 r, }, C6 b9 R- q6 A2 a
  4. sub_451390_Font1_hk
      R5 ~% R: o+ y4 l  Y6 E6 _% [
  5. sub_451599_Font2_hk
    - N7 Q: l6 N2 w6 T& L
  6. sub_451599_Font2_hk
    2 n. P/ J) D' B' t# s1 S
  7. sub_451599_Font2_hk4 T" l* m" p/ C
  8. sub_451599_Font2_hk
    5 u! x& i+ S" u9 J$ {1 |
  9. sub_451599_Font2_hk
    4 n: `( A4 H) S* G
  10. sub_451599_Font2_hk! g% g) t0 P, Y! z4 i6 }4 `
  11. sub_451599_Font2_hk
    $ c( h, d4 f+ O! @! r* k  F3 W/ ^3 W
  12. sub_451599_Font2_hk& h5 n1 }9 K  `6 V
  13. sub_451599_Font2_hk
复制代码
  l( m6 L5 E7 h  V/ k4 I6 n: K
代码; _/ R# u6 W/ ?' L
  1. #include <windows.h>
    7 a5 B* W# S' L" i+ O
  2. #include <stdio.h>+ r* n+ \: m0 M" `7 d9 x1 G
  3. 4 P2 A; r$ f  `
  4. #include "patch.h"
    4 f2 [4 J8 A& P3 L. d
  5. #include "patchNibiru.h"  M* |6 E/ n  y# q8 K1 Z* c0 N# B4 @
  6. #include <GL/gl.h>
    ( ?( x0 [  c0 E  U
  7. ) X7 {' l' q6 \; o& ^8 O) X
  8. $ B2 X3 ]9 r% J& I0 A
  9. DWORD SUB_451810 = 0x00451810;
    6 U9 }; j, K( O. S4 l: y
  10. DWORD SUB_451390 = 0x00451390;
    5 }" X1 Q! G8 R/ Q" ?& g
  11. DWORD SUB_451599 = 0x00451599;
    1 L7 T* e3 s9 w& ~
  12. + C. Z2 h& f# Z: v5 q
  13. HDC currentHdc;& ~5 X- I4 a+ @2 Z6 N
  14. + M0 p7 B: T" p4 C
  15. DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
    8 }) I) L0 S; B, I) x) L# {2 v
  16. {) R- |2 P, ?+ C4 _% P8 d
  17.     DWORD v10; // [esp-450h] [ebp-450h]  Z+ O8 W% j. `) p+ Z
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    1 }* R- f6 C- ]" x6 }
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    : b+ m- Y* a1 y8 z  K
  20.     int v13; // [esp-44h] [ebp-44h]
    5 H% q4 M4 P! v1 m  s1 h, `2 ?
  21.     HFONT v14; // [esp-14h] [ebp-14h]* `* x; ]( l5 V2 [- j; g" P( e! i+ @
  22.     DWORD v15; // [esp-10h] [ebp-10h]; W; K3 j0 x8 w; x% o7 [
  23.     int v16; // [esp-Ch] [ebp-Ch]; B0 |1 z; j5 o# G& ?2 }
  24.     int* i; // [esp-8h] [ebp-8h]- _4 o' k2 {; Q8 V" d3 e4 |
  25. : W+ W) q5 |. Y; R, t$ O" k
  26.     __asm pushad;: G* Q% u  n, A
  27.     FILE* trace = fopen("font_trace.txt", "at");6 P: M9 g7 Z2 a, l# j2 z! }( A; p+ A1 V, z
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    ; ]) d& V/ O7 o3 \1 d
  29.     fclose(trace);. V+ V; h7 q; m1 l% N: p' p
  30.     __asm popad;
    9 S% w# \( N4 m3 O+ b) M' _
  31.    
    & \& `, l/ c' ]2 M% o3 t2 g, R  U
  32.     //if (!a9)
      g2 ]+ k! b: \$ \+ J6 N/ j
  33.     //{
    3 J# y6 @& g: H" z3 m% F
  34.     //    AddFontResourceA(lpFileName);# c! x& C1 c4 J; o3 |
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    . K- ?2 K% e0 \0 t: ~
  36.     //        ;
    3 \4 e1 c2 G3 |+ L: y( a
  37.     //    *(_BYTE*)i = 0;+ x& T* \$ T( ~/ G$ `
  38.     //}+ ?* V/ q, E+ n7 j1 M
  39.     //if (a4 == 1)
    / k8 P2 g2 k; E0 ^: r+ j7 G0 ^
  40.     //{& r. T/ k! K/ \9 q9 c" L
  41.     //    v16 = 100;
    . r0 [1 s5 y2 P: S% ~6 @  _4 m
  42.     //}
    ; }' F* ?2 z' n, Z3 }3 \: ^
  43.     //else if (a4 == 4)& T4 j* t8 Y% X/ x5 Y4 r" l- f
  44.     //{! e# [8 y; X$ l! e7 H
  45.     //    v16 = 700;' I. t9 b( p+ q8 u) v! Y
  46.     //}% K1 X+ W  Z) _# \7 \, p& |
  47.     //else
    ( s( w* I  ~% Z& T: E
  48.     //{* n5 G6 w- O0 W* G; l0 R
  49.     //    v16 = 400;/ Z% b1 J, F8 Y; M9 ^
  50.     //}
    2 C( e+ K% P; E& _5 _# g7 ?* }* O
  51.     v10 = 1;* \$ p" A5 y: K7 d
  52.     //switch (dword_4AA490)9 r+ R/ `# h' a% H+ j
  53.     //{" p4 x- w  X, p
  54.     //case 1250:8 v! Y. H# o. {7 Y9 @( }! {; V
  55.     //    v10 = 238;
    6 q  k$ R9 ~. a6 ?( q
  56.     //    break;
    & E3 y7 }9 J2 A; t- [* W7 X
  57.     //case 1251:
      z7 K; `) v9 m6 R3 V" C3 y
  58.     //    v10 = 204;
    $ S5 e: ~( g$ r6 o  F0 {- y/ k
  59.     //    break;. G: U( n" \0 P
  60.     //case 1252:
    ( V' C) {6 o2 q# M7 Q; ?
  61.     //    v10 = 0;
    7 u8 i! W% e( Q+ b' ?
  62.     //    break;
    1 y5 m3 a/ a$ a$ P# E
  63.     //}
    / j; t6 j4 j  ]+ V( p* [" a, a
  64.     v15 = glGenLists(256);
    * S: }* t3 Z! G+ C; y
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    : I4 _# k& t) p( U: p
  66.     //if (!v14)
    3 k& B& J$ Z; d, ^8 J; h
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    5 b  O5 v, r$ p% q
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 3 ^9 c& w/ s1 o7 Y" d$ Z
  69.     SelectObject(currentHdc, v14);
    + J( ]5 \, U% r3 n9 J" h6 h5 e0 Y
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);2 G" ?9 a% E1 C
  71. 2 x! T, Z( t9 f
  72.     //v12 这次出错
    . q1 f! ?* b* @& t6 T) i
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    ! Z" ^/ J+ u4 A/ u- j
  74.    
    # Q  Q2 `; b% I; i3 g6 J
  75.     //*(_DWORD*)a2 = v12;* n% B, r4 m9 e. C# z+ F  H
  76.     //*(_DWORD*)a3 = v13;
    ! ~3 f; Q0 i- d% j; L2 z9 C) }
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);+ |8 Z7 M, f- {( ^6 y, k% o
  78.     //if (!a9)
    " [& p6 C5 ~1 b+ p' b
  79.     //    RemoveFontResourceA(lpFileName);
    * T% j1 i; b1 S3 Z5 I
  80.     return v15;
    0 }8 \( H$ T& I
  81. }7 u' y& C7 Z0 z) s' B2 Q+ X

  82. # t' o9 w' k+ ?, F+ [% e9 Q3 S
  83. //使用到
    $ _) b, t! C. ?5 }0 q+ W& B/ v
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc). H+ J1 K+ z/ D; B: L
  85. {
    $ R+ j5 X+ T8 ~, }
  86.     HFONT h; // [esp+4h] [ebp-8h], B: e7 s  H2 a  ]: r+ c! V
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]) ?6 x& Y$ Q5 D6 E* ?1 M

  88. 4 {; {: H1 F# C5 a( D
  89. : X. U5 k8 F9 u0 B* |/ _
  90.     __asm pushad;, T, m9 h3 f$ ]6 h2 p; b4 Q4 `! U1 `( Q! n
  91.     FILE* trace = fopen("font_trace.txt", "at");
    ' x) O) t5 U( s# S. K' ?2 `. {
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    4 Y( D3 D0 D* X" S
  93.     fclose(trace);
    8 p0 m+ G5 Z; q- r- w* m
  94.     __asm popad;! I8 o1 h) P4 G" P  z+ ?

  95. ; a1 _9 v: z8 |* D  B
  96.     currentHdc = hdc;
    2 b- p' q. i0 {/ @/ n6 }
  97.     iCharSet = 1;
    1 W8 T- t6 B8 ]$ R" \" `, @, ^
  98.     GLuint base = glGenLists(256);
    1 C. c/ Y/ r% o* K4 g6 R
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    0 O5 A2 W: f! }/ G
  100.     //if (!h)
    & [" ]& R; e0 K
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);1 ?7 u5 h/ U" T! u1 o8 M" H( `
  102.     SelectObject(hdc, h);
    $ y- ?  A3 y8 P5 n( Q8 n7 O8 m
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);; f  n" q; g" P: ~) q; e  o- Z" e1 @
  104. }4 B: ^4 J; q0 h. `+ j+ x  e: Y

  105. ; U5 F2 [7 ]$ \- K: @" m. B3 c
  106. void __cdecl
    4 `8 @4 E) y. d0 z1 F. E1 t
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    + X/ q" S- a  {  |! ?" \5 A6 F
  108. {) n2 g# n3 N+ {$ A* M
  109.     __asm pushad;: N, z7 c( I7 }# w4 h5 a4 Y5 v2 o
  110.     FILE* trace = fopen("sub_trace.txt", "at");: e7 x; x. ~1 C4 Y; Y. ?
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);3 S1 n. I* E0 P( V- V
  112.     fclose(trace);1 L1 ^, J8 |  P4 x! A) Y3 X& a
  113.     __asm popad;
    ' }5 e; [5 Q/ x+ n8 P3 l# p4 B

  114. 3 }: k, N3 A/ \6 g$ G+ r0 c
  115.     //return a1;
    - S5 ^) W4 ]. k% B  T1 p% ?' A5 ^6 `
  116. }
    ( f4 ?7 e6 g# m+ H  C0 u8 B8 n
  117. 4 a7 f2 D3 \: S2 i3 ?1 ^- \
  118. bool
    ( j4 t6 G2 {& j) V
  119. ApplyPatchNibiru()
    ) x7 B& w1 u! f3 W% U
  120. {4 }0 b' r6 e( w1 f
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);" T8 N  u/ W* X" M" H
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    & [$ ]4 W& E/ C
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    * O/ E* m2 c- j  F

  124. 0 ^9 L5 D+ S% c* E7 [
  125. 8 \7 t( |& t3 R9 ?/ \8 }7 D( P

  126. . y" @; E3 |8 o! q+ `* i
  127.   return true;
    0 _% m( D+ n) s1 H( Y+ l9 T
  128. }
    4 u# X4 @7 P# p2 Y' O! y! o
复制代码
" D( ]! ~: |$ N# L$ h5 _
( ]: R1 e* w" }: P
2 a9 ~0 \$ ?+ @( [

  l% [6 X( Y+ z8 W; q
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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