本帖最后由 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- sub_451390_Font1_hk* [) [1 Y+ F& M8 Q {9 y
- sub_451390_Font1_hk/ B3 ^, ?8 X2 c! j3 c
- sub_451599_Font2_hk
1 M0 C& r* B$ F% {1 ]/ ?/ ]( S - sub_451390_Font1_hk' [, e7 _* \9 r& M9 i) ^3 X" V
- sub_451599_Font2_hk8 i- y$ }( g. m/ s
- sub_451599_Font2_hk( V. x6 a9 b4 b5 L: K+ x
- sub_451599_Font2_hk
+ c6 B5 m' Q8 x7 S, W# h - sub_451599_Font2_hk
) w8 P, y3 O* S" n: i* h. h) U8 ~ - sub_451599_Font2_hk
4 Q' v/ u Y4 R1 O; X/ Q - sub_451599_Font2_hk
" B& g5 F* a% \( P: S- k - sub_451599_Font2_hk
: p( {7 _+ y7 c5 ~9 [ - sub_451599_Font2_hk+ G) D1 N7 M) u# K8 N E
- sub_451599_Font2_hk
复制代码 8 F. Y/ D' v- n* |
代码
8 `/ [3 C8 A) S- x, R9 `" k- #include <windows.h>* b( a' i& k* a4 W8 U
- #include <stdio.h>) h/ j+ Z: Y% s9 M6 d. y" M
9 V8 Z y6 t; I) L5 [- #include "patch.h"
8 i. ~) f7 r V u' |' y* u - #include "patchNibiru.h"
9 b$ d- p* w" X- z9 r8 C! P F! q5 ] - #include <GL/gl.h>
, ?0 t" T8 d. |: _' ?* q& g - 3 |- C% @ g% i% {
- ~5 n2 h/ J8 z
- DWORD SUB_451810 = 0x00451810;
3 Y# o0 j( Q- V; _: j8 q - DWORD SUB_451390 = 0x00451390;
g' C9 u6 F: F' |& G( S - DWORD SUB_451599 = 0x00451599;
: G- L' A0 P P - ' L. h! g5 j: I, P; ^1 T
- HDC currentHdc;8 V/ B" E; b9 }- a1 O
- ( C! M( w9 c; L) y2 u* Q" M
- 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 - {
+ y& d) J( h' T9 i! C& y2 u - DWORD v10; // [esp-450h] [ebp-450h]$ m$ k) u( x+ B
- int v11; // [esp-44Ch] [ebp-44Ch]
! y$ W! r0 U7 V: @- D+ L - int v12; // [esp-4Ch] [ebp-4Ch]& ~7 @2 V/ K4 a0 l f5 D; q7 j Y
- int v13; // [esp-44h] [ebp-44h]/ z8 j5 o, Y, L6 u3 u3 x; f
- HFONT v14; // [esp-14h] [ebp-14h]8 M, ^- ], P3 l- a! t" h/ i
- DWORD v15; // [esp-10h] [ebp-10h]. I% X3 |9 i( n+ ?- X7 `. m! S
- int v16; // [esp-Ch] [ebp-Ch]
6 Q6 V! v/ J x - int* i; // [esp-8h] [ebp-8h]1 M5 t V$ e( m& Q0 M: |% I8 h
9 A( w: `$ O- c% |$ o3 V9 K- __asm pushad;
+ O& ]6 w1 x j- J0 ] - FILE* trace = fopen("font_trace.txt", "at");$ A& B/ R, a$ Q0 ~
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
- N2 o7 S& l5 M, Q& @, [ - fclose(trace);
. @& _" F/ Y& j - __asm popad;
2 L# x8 D5 l5 e& c' y7 { - 2 [, J- H7 r, x8 H
- //if (!a9)
8 B, ]7 Y- E+ J2 H6 Y - //{
& ]+ m' F; l, m3 l9 A. m - // AddFontResourceA(lpFileName);
/ P8 K/ c/ c! E - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))% }' J, H; P- [6 }/ c$ X1 F/ P
- // ;( s8 Y2 t, d, |6 ~; f6 m% S5 r
- // *(_BYTE*)i = 0;& g- ~: n! ]) {+ T6 _# Q" ?2 r
- //}! Z/ ^# v& k. C7 o
- //if (a4 == 1)
& l/ o3 \4 ~1 c3 \2 q5 o - //{+ @5 i$ R$ W5 H& H
- // v16 = 100;9 \) |1 @( ?4 v6 d+ Y- r7 J
- //}: |& M; b: r. h+ O2 `* E
- //else if (a4 == 4)! b9 \2 T, s; _
- //{, s- E8 m8 Y. W( V/ S' Y
- // v16 = 700;( E( B* x9 O# S4 S
- //}
2 h0 O, G" I1 `: n6 ~3 | - //else
& u, \1 q" o' T& O - //{
6 ?3 \9 ?9 X3 C S5 c5 Z - // v16 = 400;
$ _/ L) N& r0 N/ Y! a - //}
4 ] {: j1 g% h! E# g - v10 = 1;
$ O8 k+ Q. t) [2 ~& r- W( X - //switch (dword_4AA490)9 T) O) j* f" Z7 g4 ^) t8 |
- //{4 m& K" b6 w# Y" T! f9 `/ V7 j: M
- //case 1250:' R$ T& S: p' Z
- // v10 = 238;
6 ~2 Y1 L/ C: i - // break;
( n. W' L1 D& J - //case 1251:
; m7 x) V( B0 I; F- V; w. F, ^4 O - // v10 = 204;1 E+ H/ u0 d8 X4 {, B; Y. k- f* O8 H5 [
- // break;5 g8 p; m1 v3 w2 g6 ?; u+ _
- //case 1252: k) R5 l; `5 h. M- ]0 i/ n
- // v10 = 0;
) B) g \( i7 ^! K! I( l - // break;
* P5 o7 e( C' H" q - //}/ j+ D* }2 x5 Z
- v15 = glGenLists(256);
$ d) p8 o2 ?1 X0 A - 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 - //if (!v14)3 ^ \8 t6 X# E7 I
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);6 U$ M+ f/ @' _
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 2 b2 M6 B- E3 x
- SelectObject(currentHdc, v14); X% h" H7 r* i. g0 y* X2 _
- GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);5 v$ h: m2 l3 B3 D. l3 [ [& r" L
- : {' V/ A) @/ {% N# e
- //v12 这次出错
! [# B) v" o) _- p- f - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);' f: L. Q! [+ I, a! E2 X' X
-
" u; C! `9 t' r! v6 h4 D - //*(_DWORD*)a2 = v12;) I% B' m0 y8 q2 P& d6 S
- //*(_DWORD*)a3 = v13;* ?- u+ }" y0 R' v, [% e& T
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
: }$ p0 L: g3 z6 i0 X% _% C - //if (!a9)7 t% q2 f% I7 W& m
- // RemoveFontResourceA(lpFileName);9 u: b8 p% m [" `: u6 u
- return v15;5 x; s) {: ?% F9 u" c. Y
- }
8 O( e5 P; i5 Z5 l% J$ {$ F - * ^# J* M7 s: }. e4 | X1 }
- //使用到
+ k( A- ]& L* S - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
3 W5 M2 Y3 X* p# U3 L! j" q1 K - {" x8 k3 G0 N" q
- HFONT h; // [esp+4h] [ebp-8h]( K# u" i0 C6 a% z$ ?# m6 B- F7 a# E
- DWORD iCharSet; // [esp+8h] [ebp-4h]# E; n! R: |& B7 G% K
4 @ d" W8 ^* O( N( j; Q8 V$ _; Z! P
$ z$ n& i3 X- X, Z; Y& P9 ?$ T- __asm pushad;
8 \4 W7 W2 n8 A - FILE* trace = fopen("font_trace.txt", "at");
" ^$ G E3 l! K. X0 F+ V - fprintf(trace, "%s\n","sub_451390_Font1_hk");1 e6 h( r# C% ]" h4 [" O+ ~6 r1 ]
- fclose(trace);5 S5 `5 N& m: n3 K
- __asm popad;
( q( R# Z6 a8 \* S7 [+ z
5 ^+ `# z; p9 I U- k' \$ [' i- currentHdc = hdc;/ A& ` z4 |+ u# Q/ A$ g8 `2 ^& g
- iCharSet = 1;4 E" I0 }. X% B, l7 c4 A
- GLuint base = glGenLists(256);0 Z! G' z& r0 c, q* ^% O
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");9 O9 ?4 \* [4 T. z
- //if (!h)
6 G" q& \$ a$ u% | - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);& B2 y$ R% x( k# x6 A- B; z
- SelectObject(hdc, h);
" ^$ n/ }1 v [ g9 Y* } - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);9 d2 M1 E9 s4 W$ t" a. o
- }. y9 @9 n- t, ]/ v
4 u1 Y) h, _9 _ R0 @% r3 I6 O; Q- void __cdecl0 Z3 S5 s. Y6 Y- m/ M2 O
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)% s5 }8 q+ V- J |; {
- {. b$ Q$ M+ b5 p, i8 _8 C6 ?7 \
- __asm pushad;
8 {) U4 a& I: |' l# ?* I. D - FILE* trace = fopen("sub_trace.txt", "at");4 k2 @% Y6 C5 o& Z
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
0 |" p- \% K/ R - fclose(trace);
* _/ g, Z9 P4 |; r; I( ^7 I - __asm popad;2 f1 E. @+ a8 w! B+ u7 D% @
- 6 g/ G; }$ q, @1 i. Q% p
- //return a1;1 o% j- W! b' b& }. i
- }
# G: E" E8 [. G ^1 x& f
/ B7 w; {8 [3 ?7 V$ k- bool
3 I$ a: @4 P4 @" `: i( D+ Y+ b - ApplyPatchNibiru()" A. T3 |0 J" S9 G0 _# t
- {
9 V6 m* p0 A: ?+ e5 E- B - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);" h- U* }( d- b& t5 U
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);# N& a ^6 c/ k* z" d" u; o
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);- t# B' l6 ~3 O5 Y
- ! [# V8 \+ u% H; f3 E. P
: R4 v3 D* a }8 e3 H' j- h
, c0 m0 u L: ]& E( a- return true;9 ?: E4 X" q" U3 J2 y7 T
- }
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
|