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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 / x; s* ~2 h; x) |. l/ a6 z

1 j7 d( ^5 J2 w% f6 Q  U(nibiru.exe 772 KB (790,528 字节))1 i: M3 X) W/ v) R
6 @4 S( X/ r! g2 Y1 S0 B$ E
将sub_451390,sub_451599 这2个显示函数进行了hook.
" u6 ]5 o7 a8 l  N' J确认这2个显示函数都被调用了。9 e. |* s: n- ^
第1个可能显示的是调试字符串,第2个显示游戏字幕。
) ?: |2 u( N  x/ O% P
* r1 u* u/ [( M- s$ [( @- I; {以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
' M* B/ h7 G* @$ n1 ~
1 N; p1 F' ^. C0 e- o3 U    //v12 这里出错. |) \! S4 S7 ~0 H* E  V  ?
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);  Y& `* q0 ?2 h& t2 Z
  }1 {- A, j' R9 ]
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。& c7 w- C$ u# @+ h$ _0 h; o
这种方式显然是有问题的,会影响性能。5 }& p9 u+ H4 P0 X1 _, m7 N
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。, X/ T0 D/ U; c' x3 k

8 s: c4 @5 r4 d9 i% x- V
  1. sub_451390_Font1_hk
    5 `8 g2 `$ ~5 g" P1 J) w
  2. sub_451390_Font1_hk
    3 f% w; d! u" L8 D
  3. sub_451599_Font2_hk! u+ t2 b+ U8 c
  4. sub_451390_Font1_hk$ A: G$ Z8 C: h+ V3 T+ a' f6 i
  5. sub_451599_Font2_hk
    ) D# g. O$ a8 q% S
  6. sub_451599_Font2_hk
    ) W8 l$ H) I8 F/ \
  7. sub_451599_Font2_hk
    $ w. ?* U! X& d+ A3 [
  8. sub_451599_Font2_hk. R( W9 s3 v: [  l
  9. sub_451599_Font2_hk: ?# _: W1 @/ R% |- e: n; Y
  10. sub_451599_Font2_hk
    9 _4 r1 I* o% N9 U) B; b
  11. sub_451599_Font2_hk: K) K: b7 L9 I" y+ K; G
  12. sub_451599_Font2_hk
    4 ~7 [; n6 K, F0 G) i
  13. sub_451599_Font2_hk
复制代码

( I1 M  r" P( N! |8 M. i; U  t/ D代码9 }5 E2 D0 B- X+ n0 R7 X. L( a
  1. #include <windows.h>; O6 c1 J% V& N/ u
  2. #include <stdio.h>
    & ~) _6 `. g2 |- l2 I( }
  3. 2 V( K3 C9 n* k( C# I) |$ F  [
  4. #include "patch.h"8 \$ M+ K0 A* w! [+ b( Z
  5. #include "patchNibiru.h"
    0 A) n, B! P, A
  6. #include <GL/gl.h>
    . F0 I1 L$ z& _; z3 I- G) f5 z  I% U
  7. 4 Q: }7 T7 z& E5 j+ A$ ~
  8. . h  A+ y3 v* ^4 [( H
  9. DWORD SUB_451810 = 0x00451810;1 e6 O' z6 P6 \# h, U# |0 N" @3 T
  10. DWORD SUB_451390 = 0x00451390;
    , ~/ L' G/ r9 Y
  11. DWORD SUB_451599 = 0x00451599;$ M3 Y2 g2 p4 l: h8 U7 j4 u6 h; g

  12. 3 C/ m3 }9 Q$ Y- ^
  13. HDC currentHdc;3 y. t+ n) ~, _4 Q

  14. 1 w4 U; Z: U) M, r6 G
  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)
    " n; D$ f+ f$ B2 X- E( m
  16. {1 z0 ^. V+ D8 W3 r6 @- X) B, j
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    , U; e- e/ v: o7 X
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    : C% o: [0 }& w7 B% f7 E4 A
  19.     int v12; // [esp-4Ch] [ebp-4Ch]  F) f% J" Y6 t' F- Z
  20.     int v13; // [esp-44h] [ebp-44h]
    & G0 ^1 ~* H2 w4 s! `9 j- t% [
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    + G0 G9 B# n& k1 I3 a
  22.     DWORD v15; // [esp-10h] [ebp-10h]! Z. {- O1 v4 h
  23.     int v16; // [esp-Ch] [ebp-Ch]
    0 c# c5 a+ o  d5 ^6 [( r) }& N6 q
  24.     int* i; // [esp-8h] [ebp-8h]
    1 C8 D; ?$ f. X! T$ P. W
  25. * l2 q8 s3 I1 S; l5 n/ @
  26.     __asm pushad;
    4 W( l" `( e+ l, }& B; G, D  A& C7 n
  27.     FILE* trace = fopen("font_trace.txt", "at");' \4 M! `$ T  v' f8 {9 }" |* d+ f
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");/ b" T- D9 b& N- p7 A; h' u. ]
  29.     fclose(trace);) d& x0 ~8 Q' d3 j! o
  30.     __asm popad;
    % h4 h8 j+ ], M
  31.    
    ' j. y- k% b% H6 u' w9 N
  32.     //if (!a9)  _3 u1 Y4 a7 _: D5 O
  33.     //{
    2 [5 K) g& R! F4 S/ B5 ~9 x9 O
  34.     //    AddFontResourceA(lpFileName);, b3 X  T2 g, Q$ C" K6 R
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))2 v# C/ }" V* D. _
  36.     //        ;5 y* R; p. D2 a' f7 c- m" \
  37.     //    *(_BYTE*)i = 0;/ ?1 z7 r" [' L9 A8 ^6 Z. h
  38.     //}
    1 H) t/ ~8 c+ {) l; P
  39.     //if (a4 == 1); X) m+ \5 R' S1 H: i
  40.     //{
    ' c# O7 v/ }) K
  41.     //    v16 = 100;% _% u1 x) t4 p1 o& T6 g. ?
  42.     //}% P- u( U: W, U4 D& d- }: o9 T
  43.     //else if (a4 == 4)' S( `/ a: Q6 ^4 f' o3 P1 @* f5 ^! U
  44.     //{5 O* j0 C  v. G; J# {2 e
  45.     //    v16 = 700;0 ]/ l! A, l# }0 u1 X
  46.     //}
    0 z* G% q4 [9 f. t7 k- n) o2 e3 Z
  47.     //else5 {1 Q$ f5 o. q4 G1 J: S6 T. {
  48.     //{
    , V7 q5 b5 X* K/ G8 H
  49.     //    v16 = 400;% ~3 t" T# Z! j! t0 C
  50.     //}4 J. P! Q( g. f' w7 w) r. Z/ {
  51.     v10 = 1;" |9 A' \" }7 t! O: n
  52.     //switch (dword_4AA490)
    0 e2 I  h  C/ w& C8 D- N
  53.     //{
    ; M3 t& ^! G- I/ Q  y9 n
  54.     //case 1250:
    ; G* o+ p+ g1 s% m7 d0 p
  55.     //    v10 = 238;6 R$ L* n2 u7 }0 A( a% L" {9 L
  56.     //    break;
    . |4 b% ]1 {, S5 F5 {
  57.     //case 1251:
    # X# @" M+ n; m. t: J* H4 k2 q
  58.     //    v10 = 204;
    - Y3 G5 t+ D+ w) J
  59.     //    break;# \/ q1 X8 L: {9 D
  60.     //case 1252:
    8 e0 B. P2 ~$ n- e
  61.     //    v10 = 0;# ]4 A! V0 P8 }4 ^
  62.     //    break;
    ; t' g) [- q; b$ v2 F2 t
  63.     //}
    7 k0 D2 E3 V# t9 C! J0 m, X. l
  64.     v15 = glGenLists(256);
    ; x, p4 B' f9 P; ]3 M3 P9 V
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    ! @- D0 c( I  y3 P5 S) b* g3 P
  66.     //if (!v14)
    & F" A7 m) a2 m& V# T& A
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);. W* K% s# k% N! M
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    5 H. }$ A/ @5 a2 [
  69.     SelectObject(currentHdc, v14);
    , {+ l& f. A% p/ f% K: E2 Z4 g  \
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    ! d; N6 Q; A8 X+ @. r9 F
  71. 1 ~1 W1 k" a$ Q5 ^3 _6 P
  72.     //v12 这次出错/ ^6 Y  S9 m& k
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);) M0 y0 i" I' M3 P+ Z' b0 z3 j3 F
  74.    
    * D' B/ [" W3 o- P/ f9 c. k1 u: e
  75.     //*(_DWORD*)a2 = v12;1 _  h6 ^  _2 k
  76.     //*(_DWORD*)a3 = v13;0 W: o4 t6 b- u0 i1 y( a7 J7 ~
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    , D$ ?6 g, F5 T0 @
  78.     //if (!a9)3 `% W2 r, m$ [( R4 n6 j
  79.     //    RemoveFontResourceA(lpFileName);: |4 A$ g% y! a, I0 x# {
  80.     return v15;7 j6 M9 c( t. B8 H: J% ?  E
  81. }% G  j9 n. m4 S* g4 X% S* t

  82. 5 ?) _; v7 d# B5 r: x$ G% n
  83. //使用到
    # {; @$ s( }$ N8 N3 P
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)2 t3 {, Q$ ]5 }6 o/ q! G
  85. {0 |% s  G2 B+ `1 ]7 g
  86.     HFONT h; // [esp+4h] [ebp-8h]
    " K8 M& w4 Y& {7 R& ^% Q
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    0 {, U4 `6 N) i: n& t
  88. ' O! O$ X" K% m  E0 I! S

  89. . G6 T& ^$ X7 e: W' ?& g
  90.     __asm pushad;- E% A! x, k6 I% f- J
  91.     FILE* trace = fopen("font_trace.txt", "at");
    " r. |/ p1 ~+ ~( ~  E5 z. Z
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");, b$ e$ W; \& f" _: C/ T( H! G- ?- a
  93.     fclose(trace);4 k) X. v; H) g* ?; b
  94.     __asm popad;/ `( n6 M9 p# }3 Q2 Z* G

  95. ; T$ W5 P) M4 G2 {5 f3 l
  96.     currentHdc = hdc;- C+ M3 i6 x0 I( L  b
  97.     iCharSet = 1;
    8 \" y( i/ Q; ]1 v0 m/ t$ ~
  98.     GLuint base = glGenLists(256);
    " K% V$ k& h6 V( w/ q# U8 [2 T0 n
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");  X8 W2 P$ J2 j7 R% q: h
  100.     //if (!h)- f9 s, ]- T" u7 V9 o6 |
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);) Y5 ?& n) I7 l) w7 x! I' a
  102.     SelectObject(hdc, h);
    # q& V8 a. ]* }
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    - L& _1 O+ P& w, M$ L* Z& k, G
  104. }# r& @9 M( {: ]5 m

  105. / p5 l  B7 f; D
  106. void __cdecl
    9 \9 j6 R4 @& Z$ L
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    " j! g: C8 z1 l7 _3 \3 D  J
  108. {. I; D* H3 r: D& g2 Q1 L  E
  109.     __asm pushad;
    , Y1 g; V4 {6 R  z- y. g+ l
  110.     FILE* trace = fopen("sub_trace.txt", "at");$ z* K' g8 z& y/ z. U2 [
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);) m8 o% w: I& y
  112.     fclose(trace);9 O$ K# B7 L; Y5 V0 j1 M
  113.     __asm popad;
    . T. ?/ I- G) }& p& w
  114. 8 X5 c1 r  ?# g; p
  115.     //return a1;
    . L" O7 x0 ?& E5 ^
  116. }
      ~! l) i: k( F# d9 J; m% j! B4 u
  117. , f- x+ J8 r' ]0 o4 Y* ^
  118. bool$ Z6 |4 E6 Q. K% O4 c
  119. ApplyPatchNibiru()0 [6 w/ B' T# I) P( w+ }
  120. {
    ( T9 }; U- J: d" Z* e
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    ' M( b2 u$ ^' Y5 @7 b: C! Y
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    + `: l$ u9 z; z
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);& Q: Q# o: m1 B! P8 Y" B: e- \' L9 |

  124. , D. L; `* _1 j( M4 F

  125. ) q4 N/ u* C. ^. L0 R# J

  126. 7 a8 Q6 H/ F$ z: |- \
  127.   return true;- a1 H8 f' \( C7 L% ~5 W0 O
  128. }4 }9 s, J4 C4 D7 [) Y+ ~7 c6 W- E
复制代码
9 O5 n# q# X( ]9 i' G

4 B3 |! _! i! `! r
. u0 {( _: U: O# G. G& |
2 f, N2 B3 Y8 s
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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