冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2023-9-6 11:00
标题: 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1
本帖最后由 shane007 于 2023-9-6 11:03 编辑
1 B% H2 g7 D& G4 X) b; a: m; P7 n+ E( F* \
(nibiru.exe 772 KB (790,528 字节))  v  T  u& e( x

8 i( M" z: y! t9 y! Y将sub_451390,sub_451599 这2个显示函数进行了hook.6 [0 `" W5 d0 @$ D5 w; {4 L
确认这2个显示函数都被调用了。
0 L+ l( o0 d7 L2 j! ]1 B第1个可能显示的是调试字符串,第2个显示游戏字幕。3 j7 C: |7 }3 U% t9 j1 L
- ?% l2 d# e: B
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
0 x2 o5 E3 h4 F5 n+ v* s
/ M9 Q# A4 I7 p- @    //v12 这里出错3 a  S% @. ~2 Q! a( t: T
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
7 A4 m% R9 n; X. L- J% K# ?8 |) H1 v; S$ W& J
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。: h# V- s* X0 j; H4 Y
这种方式显然是有问题的,会影响性能。
6 E. ]7 s8 V* C$ ~在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
, Z( y3 d8 Z4 G4 M& s0 X* V, z! b- Q) Q* H  I" M
  1. sub_451390_Font1_hk
    6 \6 P  q% }8 ?4 ?
  2. sub_451390_Font1_hk0 }  v2 e4 j9 D+ B
  3. sub_451599_Font2_hk
    . g/ u- C  o$ A, x
  4. sub_451390_Font1_hk
    0 t1 ]; b5 n2 x, J0 |  e+ J
  5. sub_451599_Font2_hk' d* j$ B6 M: M1 M8 }7 Q0 S
  6. sub_451599_Font2_hk
    . o  Q# y; v, ?: [# I3 a3 ^2 o
  7. sub_451599_Font2_hk
      o/ w! S) N- S8 J9 s, G2 z3 o
  8. sub_451599_Font2_hk
    % L3 ^' K; Y3 L- y2 Q1 x
  9. sub_451599_Font2_hk. l2 K- p( w$ w& d
  10. sub_451599_Font2_hk
    ' l$ e/ s% ~9 S+ W, g% D
  11. sub_451599_Font2_hk6 u; j9 ?7 {$ I
  12. sub_451599_Font2_hk
    , n, q; Z) d8 u' x) R
  13. sub_451599_Font2_hk
复制代码

  p/ K- j. e! j& i代码! V6 _% c4 Q+ k/ [# F2 V
  1. #include <windows.h>
    , z7 }5 M/ m( V  S, D& n4 s" |) y! m5 P
  2. #include <stdio.h>: [( W: c* P$ [4 j& t

  3. + I7 D' x2 ^4 Z. H
  4. #include "patch.h"& {5 i4 j6 V( F8 s$ I' O. A
  5. #include "patchNibiru.h"8 Z9 X* p# j0 [4 T8 ~4 O
  6. #include <GL/gl.h>3 \) U9 j0 e0 n0 n5 e
  7. $ z2 r4 w1 Z! H3 F7 L

  8. & P7 r% D8 q! z2 H+ N) }
  9. DWORD SUB_451810 = 0x00451810;9 g) o+ m) {6 [# r
  10. DWORD SUB_451390 = 0x00451390;/ ~4 @: g* k' L% b" \1 f4 g
  11. DWORD SUB_451599 = 0x00451599;' [- g6 U. e" D8 |  I: j

  12. - S- }" j6 Y. A! n3 ?
  13. HDC currentHdc;
    3 v5 g, `- e( O; w, T% E6 r
  14. ! ^8 y* L( N/ e- b- 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)' F' o4 o& l; a  D; i6 Q% u
  16. {) J9 L* q/ q( x
  17.     DWORD v10; // [esp-450h] [ebp-450h]; P- z9 }6 r) C8 d) s( M; D
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    + Q( W5 m2 }5 o5 N$ d$ Z( r
  19.     int v12; // [esp-4Ch] [ebp-4Ch]2 T0 C4 a' m+ b/ I
  20.     int v13; // [esp-44h] [ebp-44h]. A) Z$ d: v& @+ g' u! E
  21.     HFONT v14; // [esp-14h] [ebp-14h]) m6 u+ \3 w0 S/ ?9 U5 J4 b
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    1 O8 R  _/ c$ y! h/ r
  23.     int v16; // [esp-Ch] [ebp-Ch]1 v$ V) @4 C3 U( o& D, c" z; M
  24.     int* i; // [esp-8h] [ebp-8h]' `, a. K6 J' o0 l
  25. " c, _$ {! {  ?/ s
  26.     __asm pushad;
    : J! N$ }. h0 s( a
  27.     FILE* trace = fopen("font_trace.txt", "at");
    - q/ M7 V. q! k) X5 w3 |2 n
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    ; i4 B  W3 d  H7 n* z- I4 k
  29.     fclose(trace);7 b3 t0 W/ v" J0 [
  30.     __asm popad;% s4 m1 O, J5 Q3 Y( d) l  {
  31.    
    7 {" t  E) e# u) _* t
  32.     //if (!a9)
    ( ~+ ^0 |, d' r' G
  33.     //{" W( e% i( b6 ^: {: W6 g* g
  34.     //    AddFontResourceA(lpFileName);
    , S" _% i" Z1 L) r* {. F: A
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))% ]9 A2 ~! ?; c6 J. `
  36.     //        ;$ F# q* i2 I+ C/ W
  37.     //    *(_BYTE*)i = 0;
    ; q8 b8 k3 E, h5 u2 B) N
  38.     //}
    ) \/ K! b" G1 H
  39.     //if (a4 == 1)
    $ i3 K) B0 z* y6 P' K/ X4 S! K
  40.     //{( a( \8 A6 J/ R; F# K; |
  41.     //    v16 = 100;
    8 W: c- u3 I3 v# H  l, E% ?. I
  42.     //}/ w, x4 w; C7 H0 L& ?. @
  43.     //else if (a4 == 4)% m  Q* [3 ~; \7 H$ r: u
  44.     //{
    ! a3 A# L% o' x6 E- Q
  45.     //    v16 = 700;0 d+ ~, m) h0 |0 [  y
  46.     //}, ^* ^% D$ V4 h( |4 l& C
  47.     //else; h) b, s" d1 C' Q. T5 ~4 a0 A
  48.     //{
    * a( r7 O+ j4 U/ c
  49.     //    v16 = 400;
    5 j! b! }! L, z: d* }+ l
  50.     //}5 {$ u+ t8 |( l: ?  z5 ]# w2 I
  51.     v10 = 1;7 _$ W! W8 L; J1 O4 v' ~- d  E5 A7 S
  52.     //switch (dword_4AA490)4 P) |, p/ F  R1 p
  53.     //{
    5 m: z$ D+ f0 k/ o2 @/ Q
  54.     //case 1250:
    . |, S9 H, H( V5 b  M. V
  55.     //    v10 = 238;2 N+ u' V6 l7 j7 H# _- |2 h
  56.     //    break;
    ( c2 q4 `0 g* I1 L7 N, ]& C! f
  57.     //case 1251:
    , Z9 ~- w8 S# [& D1 ]0 ?
  58.     //    v10 = 204;3 t6 {; K- @  D
  59.     //    break;
    ( T+ ^* k$ {5 `' j) j+ R% B
  60.     //case 1252:
    ( v( e' ]# T6 ~+ A, o; W: U+ w
  61.     //    v10 = 0;# N& v2 T7 W4 n+ f  d: u' E
  62.     //    break;
    ; }1 @- ]- C3 R
  63.     //}% w! g* C% z" Y2 w# e% S7 B6 K
  64.     v15 = glGenLists(256);
    / V2 |7 F& [% w( b
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");! {$ w8 l  l% ^& O  i
  66.     //if (!v14)* z2 b# D( @, G. t7 T
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);% ]* B! G0 ^  P! h1 {& l2 C
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    # l9 C! v& f4 r6 A
  69.     SelectObject(currentHdc, v14);3 _! l9 H; C: |2 [- G/ ^. b% A2 l
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
      I  O' X, R' u* l$ T
  71. # Z, T; o9 U! @' ~5 C* u9 f1 u
  72.     //v12 这次出错
    $ ]+ S/ `7 z& g" n; D! f0 G
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);, z# L$ N& V, a; m/ J8 n3 G( Q# ?
  74.       e$ P9 w, V; Y7 N; \  L
  75.     //*(_DWORD*)a2 = v12;
    8 V1 A' d1 @$ p! y9 B" \
  76.     //*(_DWORD*)a3 = v13;% h' l8 V4 @4 D0 @% p; \
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);$ \: x7 \% g  J8 t& m
  78.     //if (!a9)) r( x: g+ p1 k! C4 X
  79.     //    RemoveFontResourceA(lpFileName);1 M! S8 u8 V" o, r
  80.     return v15;7 ~2 Y* L: G% T! E
  81. }" Q1 a2 ]0 i1 q6 C% Z
  82. 0 _8 C$ X) w& ~1 a# j$ I7 C
  83. //使用到
    3 o6 @% U. ^6 ?& e
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    9 i6 A7 L; k: v& F4 Q3 L( m$ N
  85. {
    * v: U. v4 Y7 l* c2 L0 O1 }
  86.     HFONT h; // [esp+4h] [ebp-8h]! Y% t- }4 S% h7 R- `
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h], p! @) ?( q& N8 c
  88. % o8 V9 J8 `. p9 Z
  89. 2 E5 X. V2 c- q2 ?8 Z1 t4 {" r
  90.     __asm pushad;
    ' o& U  e- r2 P# E8 f. K
  91.     FILE* trace = fopen("font_trace.txt", "at");8 m" q  Y; M+ f+ H- m, v7 b4 c
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");6 K9 p$ R/ d# I9 @- B9 |
  93.     fclose(trace);3 T5 i, D' u$ k4 l6 x2 ^6 H
  94.     __asm popad;
    5 P: Y0 _$ w  s" f1 Y

  95. , Z7 ?* j: s$ G5 ^0 w, d+ V
  96.     currentHdc = hdc;
    7 M& o, }# F+ v- \2 z. h
  97.     iCharSet = 1;
    * C  E: q! x8 t. v
  98.     GLuint base = glGenLists(256);
    7 L5 `4 s0 y7 S
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");- x+ Y0 @0 t: }6 h7 x+ s# ?# a9 S
  100.     //if (!h)
    # W" f% d' b/ J* ^- k
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);! H" J# H* Q( H" X6 s! ]( D# X& p& g
  102.     SelectObject(hdc, h);
    : N. p! U- R5 j6 o$ i
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    ( C0 z( C9 a! Q# K6 ^* F) L( h8 P
  104. }
    0 l' n  s- [5 |) y' r

  105. 2 q% x* o) B4 l9 V5 O1 n* _
  106. void __cdecl7 h) ]* A4 C( W2 m2 D: I3 f
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)! z/ e. S2 v6 k* l3 {- ^
  108. {
    % S$ v( c! o* T! P, x4 R' }9 C
  109.     __asm pushad;
    & [. R% Y- b4 y3 L8 l( Q2 l
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    7 Y- o, D$ X; V/ ]/ b
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    7 `# i+ D( h0 P9 w
  112.     fclose(trace);  I, O9 ~  s2 C1 u; g. k
  113.     __asm popad;& W8 k* Y3 g( T- k

  114. $ X9 j2 j/ k( W/ I% [) q
  115.     //return a1;. |1 @% W- W, ~" i! U: ]- B
  116. }
    7 e, V9 l6 b# ?6 {2 f
  117. ( |2 J- T7 ~; {
  118. bool
    : l" ^5 E' [$ ~1 [2 `
  119. ApplyPatchNibiru()
    4 c' l/ G4 G7 r. z6 y5 G+ s
  120. {" p: l. b$ B, a( d3 p$ W1 {. }
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    6 G) |; V/ ?7 H  u4 x6 f
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
      @; R: J) C, J4 E8 Q: t
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    / z+ v; t$ h! J, u
  124. " T9 m- v9 E( K2 w0 r

  125. ! C3 A. \  {) v
  126. 5 v3 k+ ^$ R0 |( x* L% E. M
  127.   return true;
    % }. l" c% Y. z+ C7 R: l
  128. }& _* u& u9 n7 m$ `1 a/ _2 h. }
复制代码

0 e0 O# R- l1 p( H1 u. z/ }
3 n* ]* V* N3 H  \; _- n! u4 |
. `" j5 z6 ?1 ^/ r: X# F9 j
5 r9 w' i) ?  R8 O5 Q4 m9 @




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