冒险解谜游戏中文网 ChinaAVG

标题: 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1 [打印本页]

作者: shane007    时间: 2023-9-6 11:00
标题: 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1
本帖最后由 shane007 于 2023-9-6 11:03 编辑 * o- J" O8 Y6 }) Z5 g/ H

( E6 B/ u, T  ^4 U" c& H  D(nibiru.exe 772 KB (790,528 字节))
6 B0 _3 u4 }' y, T$ w
6 W# v5 y$ I3 I& e/ w将sub_451390,sub_451599 这2个显示函数进行了hook.6 s8 I# U4 i& `* b" j
确认这2个显示函数都被调用了。
$ ?3 R- M6 U) r1 n6 E' ~5 `: J第1个可能显示的是调试字符串,第2个显示游戏字幕。; G( {% A. N0 }" W

+ V1 t1 }' V: ?  T) M4 B以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
8 y; ^( \6 {& M- _0 o: `. @4 E) e
* ?& p0 C" `3 _" x- J7 f8 D    //v12 这里出错
/ e& G; b8 x* V% W' r: N& p    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
  y+ j" [/ Y' m7 A+ }) j8 D; A% i7 Q' d4 i& |
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
7 G1 ?( F5 }  d& `7 m/ i1 ~6 g这种方式显然是有问题的,会影响性能。; o# F/ f" M; y9 B4 }& p# Y
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
) d& C3 T4 a5 D
: p! Z2 v$ U, ?5 X; B
  1. sub_451390_Font1_hk
    & l2 W4 |8 ~2 z. k7 u; r
  2. sub_451390_Font1_hk
    & R2 d1 ^+ t# F4 q3 f, F6 F; x
  3. sub_451599_Font2_hk; @% c( U/ Z) E- u3 p' d. F+ z4 P/ d: d
  4. sub_451390_Font1_hk2 N$ ]1 x: P* ]
  5. sub_451599_Font2_hk' c- u( {) V2 w  |
  6. sub_451599_Font2_hk
    4 A( [: `- Y2 w8 B( C2 P
  7. sub_451599_Font2_hk1 p$ W% t; B5 T% ~. L1 w4 J4 R7 B
  8. sub_451599_Font2_hk* @) ?- a+ [* Y' B% P
  9. sub_451599_Font2_hk
      C3 x) `5 ^! G; c& X/ }& w# S
  10. sub_451599_Font2_hk
    3 n& e# C% e6 H8 B( g. n, z
  11. sub_451599_Font2_hk
    ) F+ a& ^8 r5 T2 z5 l" L' p
  12. sub_451599_Font2_hk5 ~. N3 D4 i- O. p2 i( p/ O
  13. sub_451599_Font2_hk
复制代码
3 v" ?& L  [  z8 H- K& s4 ]% \( g
代码* J1 q/ q" E- s" C
  1. #include <windows.h>
    / ?" {9 N& _+ q
  2. #include <stdio.h>
    & o: U0 a/ K8 H, z; m' \

  3. 6 N/ s8 f+ f( _+ t: F8 U. W( `
  4. #include "patch.h"
    ; M* ^3 K4 i: g: I# _0 u
  5. #include "patchNibiru.h"' x6 Q. E4 x) h& \) x2 ?' w
  6. #include <GL/gl.h>" n/ |" T, o. ~+ H
  7. , j6 u7 X" i  x
  8. 2 \7 d6 d- m& e3 ~5 u
  9. DWORD SUB_451810 = 0x00451810;
    9 M4 j( P1 ?2 ~$ @5 q4 Y9 `& ]' U5 w
  10. DWORD SUB_451390 = 0x00451390;3 P5 T5 `* _5 v0 I# V) p; t
  11. DWORD SUB_451599 = 0x00451599;3 V5 X6 S( @$ @* ?
  12. * L9 p5 K( @6 b7 S+ @
  13. HDC currentHdc;
    9 Q* t: A& K  l8 n* [: ~

  14. , `. A* v& _! I( |1 {4 u
  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)3 r; p" R' r- q6 v3 M2 \
  16. {
    - d$ l7 b; J5 J' t
  17.     DWORD v10; // [esp-450h] [ebp-450h], ]' q! B' b1 Y2 Y; p4 g
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    : d3 o( W. R0 ~
  19.     int v12; // [esp-4Ch] [ebp-4Ch]1 _, E' i/ u: v$ R) X0 L9 t
  20.     int v13; // [esp-44h] [ebp-44h]& J4 r( m# }& s: ^7 D0 K
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    % B1 ~- [: o; {
  22.     DWORD v15; // [esp-10h] [ebp-10h]
      u9 E3 v8 z! J2 p7 S
  23.     int v16; // [esp-Ch] [ebp-Ch]) P2 J% W4 y% W- V$ A
  24.     int* i; // [esp-8h] [ebp-8h]. u: g9 X( W' u0 P
  25. " c; e. p0 W6 b, K* @. B" ?4 q" Y
  26.     __asm pushad;; K0 W/ m) s, w0 h. H# t
  27.     FILE* trace = fopen("font_trace.txt", "at");
    ( h9 W+ l# O5 C) f5 y. z6 e* N
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
      w9 Q; k) q! v/ q' I& p
  29.     fclose(trace);; J6 H; `! r1 x3 \9 @( w1 p
  30.     __asm popad;
    1 ]/ ?- i8 G! i, f- f! L
  31.    
    6 t/ |! @/ w  g% H
  32.     //if (!a9)
    5 A* {4 a0 S! ~; k9 |
  33.     //{3 b- Y! W! p& m! G: S
  34.     //    AddFontResourceA(lpFileName);
    " M! E/ B% e, ~1 R% v
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    # D5 [/ Q0 ]2 F
  36.     //        ;% f, }1 l$ i  [9 F
  37.     //    *(_BYTE*)i = 0;) r& ?+ o2 L: f0 c7 U, ?+ T3 o
  38.     //}3 I& c  z+ p1 N$ u
  39.     //if (a4 == 1)3 y; L# `3 o0 r4 g% e; e/ G$ L
  40.     //{$ E3 I9 C7 E2 g% L) H8 H
  41.     //    v16 = 100;5 z- ^) B9 P' d2 a6 Z
  42.     //}& y5 Y0 t+ [6 K+ }
  43.     //else if (a4 == 4)2 f* B- E& y3 p# ^- O! `
  44.     //{( V+ D% S- e! n
  45.     //    v16 = 700;( G$ e% @/ h& l
  46.     //}0 l3 S5 P3 r' R" W: N
  47.     //else
    4 {3 O$ O) s+ l( Q6 k5 z8 q( ?
  48.     //{  ?$ Y# F! W- t& }
  49.     //    v16 = 400;! _# ^9 V$ ~& b! T
  50.     //}) o, N" B" g1 o* F
  51.     v10 = 1;7 h" _# @) V* f$ x& [* F! ?& [
  52.     //switch (dword_4AA490)+ L* z: p" W  d% e
  53.     //{
    4 G9 ^2 u( K9 F- s: a
  54.     //case 1250:7 _) M8 C+ W. `% l1 u7 y
  55.     //    v10 = 238;
    2 V7 i) Z# ]" r* B( I
  56.     //    break;
      O* t; {- p1 k. `3 B
  57.     //case 1251:
    4 W% v7 g: N" U9 X0 _0 D
  58.     //    v10 = 204;
    ! ^+ c+ C6 ^3 j0 c+ p) J7 v' u- |+ ]
  59.     //    break;' K8 L7 @$ s7 R. h2 r8 j% L0 z
  60.     //case 1252:
    5 Q$ ]! p6 |* S; d! z7 Z
  61.     //    v10 = 0;' H7 U3 n" F! w3 V& `: N% Z; B
  62.     //    break;8 R. h5 |0 Z/ ]( ~, a
  63.     //}& B/ F3 j! `/ g/ y- |4 p; a
  64.     v15 = glGenLists(256);) ^1 z9 p: o% t' p4 J5 Y
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");, |' `, @: l4 m
  66.     //if (!v14). e+ O7 }. {/ `$ Z4 y
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    & o: K7 C% ^* f, b7 B* X" Q
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 3 p7 {# l7 x  \4 H  t
  69.     SelectObject(currentHdc, v14);
    * J0 r8 i) ~0 q6 [8 o3 k' a* `' X+ D
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    + z, N3 Y# T. k' g% m0 ~" I
  71. 2 U, @0 I. l" E: O9 S: i* Y2 y6 z
  72.     //v12 这次出错
    & W' x$ `: x' ~, l8 Y
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);5 E- u7 z& U7 P5 |* M
  74.    
    ) f' X6 F1 d0 K6 f: L+ ]' ]* Q* a
  75.     //*(_DWORD*)a2 = v12;$ }6 B( U3 V2 N9 K
  76.     //*(_DWORD*)a3 = v13;
    ; R* X9 s: d( j' I; u/ j
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    % n+ \3 E1 c% l* t, G& n' d
  78.     //if (!a9)
    7 K7 N7 {4 u4 S
  79.     //    RemoveFontResourceA(lpFileName);
    1 {3 ?# ~( h( L8 B# }9 F
  80.     return v15;' ]. T1 B! c$ a) p6 S6 P
  81. }
    . c4 w# b; F5 O8 `2 L% X

  82. ; ?& h6 |$ U* Z- l  a- z9 f: J
  83. //使用到
    ! b- s  x; e1 B5 a
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)) T4 Q$ |% B1 v8 [) X7 ~: p
  85. {1 n* X( Z7 R6 q7 S- F, U# E% T. B
  86.     HFONT h; // [esp+4h] [ebp-8h]
    1 Q, R: `) A$ }# Y
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]2 ~% I& g- h' J$ o( H" V% ^
  88. , c  x+ I5 I# A) C
  89. 5 m+ U/ P( m, I& g8 {, c) b7 u
  90.     __asm pushad;
    , P3 V9 z- ^- v7 p1 k. {* r
  91.     FILE* trace = fopen("font_trace.txt", "at");% D4 }0 S5 j; S! [- W  @: L
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    - A0 s+ k  g1 u7 j" f- Z- e$ M
  93.     fclose(trace);
    7 K' ]% d1 o# }
  94.     __asm popad;
    - @- H; G; [' B; Z- r% r

  95. * S& `% x  m7 ]( a' w
  96.     currentHdc = hdc;( d5 j- R# B/ `; u8 ?
  97.     iCharSet = 1;
    , l$ M- Q! a4 |- ^7 [
  98.     GLuint base = glGenLists(256);
    3 Z, g! z! y/ X0 j' e! R
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");* ?+ q: a8 l1 g- `
  100.     //if (!h)4 Y( P# y% v; ?: Y1 E: A* |
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    . h' j, O! U5 j$ V
  102.     SelectObject(hdc, h);
    ( [! ?" p% R+ y% p9 @' u
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    0 k1 p$ ~3 N0 t: Y
  104. }
    $ {% A5 X- {& ]0 g

  105. + @  ^- O" u  A* ]0 B$ m' r
  106. void __cdecl
    ; e2 X' ?, Q1 ]& a% o0 P- E
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)6 X; P4 M1 p. j3 L7 U8 V
  108. {( b: Q8 _% C% o  V7 r
  109.     __asm pushad;
    + h4 ]/ ~2 t1 c1 E4 j' Y0 F
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    ( c0 p6 R0 n- ~" i/ v7 ?1 o
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);- C2 M* z! @$ E5 S2 n; v+ x/ ?
  112.     fclose(trace);, _  C% v, ]0 W8 h* N0 Y1 a) f
  113.     __asm popad;/ R0 y# @& w& _! z) G2 e

  114. 7 i) X! f& o% n4 Q' s
  115.     //return a1;/ E( V8 ~4 H* D$ h# q
  116. }) n9 E" s0 s6 M
  117. * a% J3 q; i5 o2 f7 v
  118. bool: Q& b- t. K. N( I
  119. ApplyPatchNibiru()
    2 M" q' F! B  x4 M+ Z' ]
  120. {
    ! ~9 [/ u( }7 ^, O/ }: b* C: Z' z8 G
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);0 L. k/ V( N$ n- X  S
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);* Y! }6 h) b( l0 _' v3 R
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);3 R4 }2 \/ r5 }4 T
  124. # L8 V9 ^8 F+ w; c

  125. 2 N, R1 ~6 }5 h( m

  126. / }( c6 C* D$ s& j* r, W/ ^$ m
  127.   return true;' k' S+ C7 _4 x
  128. }( \' ^# L+ H$ u1 V5 v
复制代码

& e" b) L, E6 d- w- J% m) P
1 m/ V% G4 N& X5 [; L
, H, M4 w, w9 g" O9 P2 N0 V0 _. N5 U$ v+ ?& ^1 v, M+ R





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