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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 / M+ @7 v0 P4 H3 n
% H$ h( w, O+ a0 K7 b/ |8 C. }
(nibiru.exe 772 KB (790,528 字节))2 U) m& B9 r7 N8 ~% f; j
6 q% _) ]) w; }* ^6 ~) @) ~
将sub_451390,sub_451599 这2个显示函数进行了hook.1 |+ R! M! p* g9 W, N7 p7 `
确认这2个显示函数都被调用了。: C. \: b  p  g& A6 e2 o+ U) a/ Y0 o
第1个可能显示的是调试字符串,第2个显示游戏字幕。0 j0 P: D2 p' d% i* r
6 Z/ _- `+ M, M% ?. w7 C
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
& R; Q' |, E4 o+ g% A7 q. |5 w6 [* H0 W
    //v12 这里出错2 {: {) M& E, f$ ?- B0 I" u
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
7 V1 V/ K; A3 ~2 q) z9 K* R# c  k$ H) l: e3 E: n* U
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。4 L  F) M* }7 K/ ~; y9 ^1 a% H
这种方式显然是有问题的,会影响性能。
! J6 o3 c8 I/ J5 l" \在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。- g* O8 K! A% g7 G

% j+ Q! P2 W9 L2 K
  1. sub_451390_Font1_hk* [) [1 Y+ F& M8 Q  {9 y
  2. sub_451390_Font1_hk/ B3 ^, ?8 X2 c! j3 c
  3. sub_451599_Font2_hk
    1 M0 C& r* B$ F% {1 ]/ ?/ ]( S
  4. sub_451390_Font1_hk' [, e7 _* \9 r& M9 i) ^3 X" V
  5. sub_451599_Font2_hk8 i- y$ }( g. m/ s
  6. sub_451599_Font2_hk( V. x6 a9 b4 b5 L: K+ x
  7. sub_451599_Font2_hk
    + c6 B5 m' Q8 x7 S, W# h
  8. sub_451599_Font2_hk
    ) w8 P, y3 O* S" n: i* h. h) U8 ~
  9. sub_451599_Font2_hk
    4 Q' v/ u  Y4 R1 O; X/ Q
  10. sub_451599_Font2_hk
    " B& g5 F* a% \( P: S- k
  11. sub_451599_Font2_hk
    : p( {7 _+ y7 c5 ~9 [
  12. sub_451599_Font2_hk+ G) D1 N7 M) u# K8 N  E
  13. sub_451599_Font2_hk
复制代码
8 F. Y/ D' v- n* |
代码
8 `/ [3 C8 A) S- x, R9 `" k
  1. #include <windows.h>* b( a' i& k* a4 W8 U
  2. #include <stdio.h>) h/ j+ Z: Y% s9 M6 d. y" M

  3. 9 V8 Z  y6 t; I) L5 [
  4. #include "patch.h"
    8 i. ~) f7 r  V  u' |' y* u
  5. #include "patchNibiru.h"
    9 b$ d- p* w" X- z9 r8 C! P  F! q5 ]
  6. #include <GL/gl.h>
    , ?0 t" T8 d. |: _' ?* q& g
  7. 3 |- C% @  g% i% {
  8.   ~5 n2 h/ J8 z
  9. DWORD SUB_451810 = 0x00451810;
    3 Y# o0 j( Q- V; _: j8 q
  10. DWORD SUB_451390 = 0x00451390;
      g' C9 u6 F: F' |& G( S
  11. DWORD SUB_451599 = 0x00451599;
    : G- L' A0 P  P
  12. ' L. h! g5 j: I, P; ^1 T
  13. HDC currentHdc;8 V/ B" E; b9 }- a1 O
  14. ( C! M( w9 c; L) y2 u* Q" M
  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)
    9 i- O$ Z7 [+ W. i- G: h
  16. {
    + y& d) J( h' T9 i! C& y2 u
  17.     DWORD v10; // [esp-450h] [ebp-450h]$ m$ k) u( x+ B
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    ! y$ W! r0 U7 V: @- D+ L
  19.     int v12; // [esp-4Ch] [ebp-4Ch]& ~7 @2 V/ K4 a0 l  f5 D; q7 j  Y
  20.     int v13; // [esp-44h] [ebp-44h]/ z8 j5 o, Y, L6 u3 u3 x; f
  21.     HFONT v14; // [esp-14h] [ebp-14h]8 M, ^- ], P3 l- a! t" h/ i
  22.     DWORD v15; // [esp-10h] [ebp-10h]. I% X3 |9 i( n+ ?- X7 `. m! S
  23.     int v16; // [esp-Ch] [ebp-Ch]
    6 Q6 V! v/ J  x
  24.     int* i; // [esp-8h] [ebp-8h]1 M5 t  V$ e( m& Q0 M: |% I8 h

  25. 9 A( w: `$ O- c% |$ o3 V9 K
  26.     __asm pushad;
    + O& ]6 w1 x  j- J0 ]
  27.     FILE* trace = fopen("font_trace.txt", "at");$ A& B/ R, a$ Q0 ~
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    - N2 o7 S& l5 M, Q& @, [
  29.     fclose(trace);
    . @& _" F/ Y& j
  30.     __asm popad;
    2 L# x8 D5 l5 e& c' y7 {
  31.     2 [, J- H7 r, x8 H
  32.     //if (!a9)
    8 B, ]7 Y- E+ J2 H6 Y
  33.     //{
    & ]+ m' F; l, m3 l9 A. m
  34.     //    AddFontResourceA(lpFileName);
    / P8 K/ c/ c! E
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))% }' J, H; P- [6 }/ c$ X1 F/ P
  36.     //        ;( s8 Y2 t, d, |6 ~; f6 m% S5 r
  37.     //    *(_BYTE*)i = 0;& g- ~: n! ]) {+ T6 _# Q" ?2 r
  38.     //}! Z/ ^# v& k. C7 o
  39.     //if (a4 == 1)
    & l/ o3 \4 ~1 c3 \2 q5 o
  40.     //{+ @5 i$ R$ W5 H& H
  41.     //    v16 = 100;9 \) |1 @( ?4 v6 d+ Y- r7 J
  42.     //}: |& M; b: r. h+ O2 `* E
  43.     //else if (a4 == 4)! b9 \2 T, s; _
  44.     //{, s- E8 m8 Y. W( V/ S' Y
  45.     //    v16 = 700;( E( B* x9 O# S4 S
  46.     //}
    2 h0 O, G" I1 `: n6 ~3 |
  47.     //else
    & u, \1 q" o' T& O
  48.     //{
    6 ?3 \9 ?9 X3 C  S5 c5 Z
  49.     //    v16 = 400;
    $ _/ L) N& r0 N/ Y! a
  50.     //}
    4 ]  {: j1 g% h! E# g
  51.     v10 = 1;
    $ O8 k+ Q. t) [2 ~& r- W( X
  52.     //switch (dword_4AA490)9 T) O) j* f" Z7 g4 ^) t8 |
  53.     //{4 m& K" b6 w# Y" T! f9 `/ V7 j: M
  54.     //case 1250:' R$ T& S: p' Z
  55.     //    v10 = 238;
    6 ~2 Y1 L/ C: i
  56.     //    break;
    ( n. W' L1 D& J
  57.     //case 1251:
    ; m7 x) V( B0 I; F- V; w. F, ^4 O
  58.     //    v10 = 204;1 E+ H/ u0 d8 X4 {, B; Y. k- f* O8 H5 [
  59.     //    break;5 g8 p; m1 v3 w2 g6 ?; u+ _
  60.     //case 1252:  k) R5 l; `5 h. M- ]0 i/ n
  61.     //    v10 = 0;
    ) B) g  \( i7 ^! K! I( l
  62.     //    break;
    * P5 o7 e( C' H" q
  63.     //}/ j+ D* }2 x5 Z
  64.     v15 = glGenLists(256);
    $ d) p8 o2 ?1 X0 A
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    $ J3 P) Q. _3 d
  66.     //if (!v14)3 ^  \8 t6 X# E7 I
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);6 U$ M+ f/ @' _
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 2 b2 M6 B- E3 x
  69.     SelectObject(currentHdc, v14);  X% h" H7 r* i. g0 y* X2 _
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);5 v$ h: m2 l3 B3 D. l3 [  [& r" L
  71. : {' V/ A) @/ {% N# e
  72.     //v12 这次出错
    ! [# B) v" o) _- p- f
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);' f: L. Q! [+ I, a! E2 X' X
  74.    
    " u; C! `9 t' r! v6 h4 D
  75.     //*(_DWORD*)a2 = v12;) I% B' m0 y8 q2 P& d6 S
  76.     //*(_DWORD*)a3 = v13;* ?- u+ }" y0 R' v, [% e& T
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    : }$ p0 L: g3 z6 i0 X% _% C
  78.     //if (!a9)7 t% q2 f% I7 W& m
  79.     //    RemoveFontResourceA(lpFileName);9 u: b8 p% m  [" `: u6 u
  80.     return v15;5 x; s) {: ?% F9 u" c. Y
  81. }
    8 O( e5 P; i5 Z5 l% J$ {$ F
  82. * ^# J* M7 s: }. e4 |  X1 }
  83. //使用到
    + k( A- ]& L* S
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    3 W5 M2 Y3 X* p# U3 L! j" q1 K
  85. {" x8 k3 G0 N" q
  86.     HFONT h; // [esp+4h] [ebp-8h]( K# u" i0 C6 a% z$ ?# m6 B- F7 a# E
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]# E; n! R: |& B7 G% K

  88. 4 @  d" W8 ^* O( N( j; Q8 V$ _; Z! P

  89. $ z$ n& i3 X- X, Z; Y& P9 ?$ T
  90.     __asm pushad;
    8 \4 W7 W2 n8 A
  91.     FILE* trace = fopen("font_trace.txt", "at");
    " ^$ G  E3 l! K. X0 F+ V
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");1 e6 h( r# C% ]" h4 [" O+ ~6 r1 ]
  93.     fclose(trace);5 S5 `5 N& m: n3 K
  94.     __asm popad;
    ( q( R# Z6 a8 \* S7 [+ z

  95. 5 ^+ `# z; p9 I  U- k' \$ [' i
  96.     currentHdc = hdc;/ A& `  z4 |+ u# Q/ A$ g8 `2 ^& g
  97.     iCharSet = 1;4 E" I0 }. X% B, l7 c4 A
  98.     GLuint base = glGenLists(256);0 Z! G' z& r0 c, q* ^% O
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");9 O9 ?4 \* [4 T. z
  100.     //if (!h)
    6 G" q& \$ a$ u% |
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);& B2 y$ R% x( k# x6 A- B; z
  102.     SelectObject(hdc, h);
    " ^$ n/ }1 v  [  g9 Y* }
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);9 d2 M1 E9 s4 W$ t" a. o
  104. }. y9 @9 n- t, ]/ v

  105. 4 u1 Y) h, _9 _  R0 @% r3 I6 O; Q
  106. void __cdecl0 Z3 S5 s. Y6 Y- m/ M2 O
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)% s5 }8 q+ V- J  |; {
  108. {. b$ Q$ M+ b5 p, i8 _8 C6 ?7 \
  109.     __asm pushad;
    8 {) U4 a& I: |' l# ?* I. D
  110.     FILE* trace = fopen("sub_trace.txt", "at");4 k2 @% Y6 C5 o& Z
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    0 |" p- \% K/ R
  112.     fclose(trace);
    * _/ g, Z9 P4 |; r; I( ^7 I
  113.     __asm popad;2 f1 E. @+ a8 w! B+ u7 D% @
  114. 6 g/ G; }$ q, @1 i. Q% p
  115.     //return a1;1 o% j- W! b' b& }. i
  116. }
    # G: E" E8 [. G  ^1 x& f

  117. / B7 w; {8 [3 ?7 V$ k
  118. bool
    3 I$ a: @4 P4 @" `: i( D+ Y+ b
  119. ApplyPatchNibiru()" A. T3 |0 J" S9 G0 _# t
  120. {
    9 V6 m* p0 A: ?+ e5 E- B
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);" h- U* }( d- b& t5 U
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);# N& a  ^6 c/ k* z" d" u; o
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);- t# B' l6 ~3 O5 Y
  124. ! [# V8 \+ u% H; f3 E. P

  125. : R4 v3 D* a  }8 e3 H' j- h

  126. , c0 m0 u  L: ]& E( a
  127.   return true;9 ?: E4 X" q" U3 J2 y7 T
  128. }
    1 C0 n  @: X" ]* Z) K! C
复制代码
) r7 J9 ^1 e, w* m! ~* ^8 }9 o$ Y" o
5 u  E. z- S7 r- o

  o( \4 j% t3 m- n: T9 v6 H3 S  S& 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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