本帖最后由 shane007 于 2023-9-6 11:03 编辑 + Z& R% x4 b+ O, d+ f; K! _: W
0 _' n+ S9 i2 { x(nibiru.exe 772 KB (790,528 字节))% y j% U$ e6 f' s: P7 _
3 B, P: }' _8 v8 N将sub_451390,sub_451599 这2个显示函数进行了hook.
/ L. F" a) z) d( U8 T! b; H; Z确认这2个显示函数都被调用了。
8 J. B' x6 E; k; m第1个可能显示的是调试字符串,第2个显示游戏字幕。9 g$ o3 R) t2 L0 ^
( a0 n9 V; l1 Z$ c% i% \, f以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。 N: ?. r% D( l; `5 n
5 T1 a$ [" _' U, f* t //v12 这里出错
5 B ~1 Y9 P' e0 [# c" { //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);* c+ X/ D% t: i) g+ p0 ~
# G0 K& S* i- B5 q, e9 j
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
; Z; U% D. \# ^+ t ~+ a这种方式显然是有问题的,会影响性能。& Y0 x6 ]9 [6 \4 r t$ N9 G
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。4 A# j5 d$ J3 R. N5 R$ D
* q) b* y8 F' q4 |! P; g1 J
- sub_451390_Font1_hk' B& Z, d1 |: y4 q& G
- sub_451390_Font1_hk
, W7 N9 ?/ d% L) P* c - sub_451599_Font2_hk6 _: a9 r, }, C6 b9 R- q6 A2 a
- sub_451390_Font1_hk
R5 ~% R: o+ y4 l Y6 E6 _% [ - sub_451599_Font2_hk
- N7 Q: l6 N2 w6 T& L - sub_451599_Font2_hk
2 n. P/ J) D' B' t# s1 S - sub_451599_Font2_hk4 T" l* m" p/ C
- sub_451599_Font2_hk
5 u! x& i+ S" u9 J$ {1 | - sub_451599_Font2_hk
4 n: `( A4 H) S* G - sub_451599_Font2_hk! g% g) t0 P, Y! z4 i6 }4 `
- sub_451599_Font2_hk
$ c( h, d4 f+ O! @! r* k F3 W/ ^3 W - sub_451599_Font2_hk& h5 n1 }9 K `6 V
- sub_451599_Font2_hk
复制代码 l( m6 L5 E7 h V/ k4 I6 n: K
代码; _/ R# u6 W/ ?' L
- #include <windows.h>
7 a5 B* W# S' L" i+ O - #include <stdio.h>+ r* n+ \: m0 M" `7 d9 x1 G
- 4 P2 A; r$ f `
- #include "patch.h"
4 f2 [4 J8 A& P3 L. d - #include "patchNibiru.h" M* |6 E/ n y# q8 K1 Z* c0 N# B4 @
- #include <GL/gl.h>
( ?( x0 [ c0 E U - ) X7 {' l' q6 \; o& ^8 O) X
- $ B2 X3 ]9 r% J& I0 A
- DWORD SUB_451810 = 0x00451810;
6 U9 }; j, K( O. S4 l: y - DWORD SUB_451390 = 0x00451390;
5 }" X1 Q! G8 R/ Q" ?& g - DWORD SUB_451599 = 0x00451599;
1 L7 T* e3 s9 w& ~ - + C. Z2 h& f# Z: v5 q
- HDC currentHdc;& ~5 X- I4 a+ @2 Z6 N
- + M0 p7 B: T" p4 C
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
8 }) I) L0 S; B, I) x) L# {2 v - {) R- |2 P, ?+ C4 _% P8 d
- DWORD v10; // [esp-450h] [ebp-450h] Z+ O8 W% j. `) p+ Z
- int v11; // [esp-44Ch] [ebp-44Ch]
1 }* R- f6 C- ]" x6 } - int v12; // [esp-4Ch] [ebp-4Ch]
: b+ m- Y* a1 y8 z K - int v13; // [esp-44h] [ebp-44h]
5 H% q4 M4 P! v1 m s1 h, `2 ? - HFONT v14; // [esp-14h] [ebp-14h]* `* x; ]( l5 V2 [- j; g" P( e! i+ @
- DWORD v15; // [esp-10h] [ebp-10h]; W; K3 j0 x8 w; x% o7 [
- int v16; // [esp-Ch] [ebp-Ch]; B0 |1 z; j5 o# G& ?2 }
- int* i; // [esp-8h] [ebp-8h]- _4 o' k2 {; Q8 V" d3 e4 |
- : W+ W) q5 |. Y; R, t$ O" k
- __asm pushad;: G* Q% u n, A
- FILE* trace = fopen("font_trace.txt", "at");6 P: M9 g7 Z2 a, l# j2 z! }( A; p+ A1 V, z
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
; ]) d& V/ O7 o3 \1 d - fclose(trace);. V+ V; h7 q; m1 l% N: p' p
- __asm popad;
9 S% w# \( N4 m3 O+ b) M' _ -
& \& `, l/ c' ]2 M% o3 t2 g, R U - //if (!a9)
g2 ]+ k! b: \$ \+ J6 N/ j - //{
3 J# y6 @& g: H" z3 m% F - // AddFontResourceA(lpFileName);# c! x& C1 c4 J; o3 |
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
. K- ?2 K% e0 \0 t: ~ - // ;
3 \4 e1 c2 G3 |+ L: y( a - // *(_BYTE*)i = 0;+ x& T* \$ T( ~/ G$ `
- //}+ ?* V/ q, E+ n7 j1 M
- //if (a4 == 1)
/ k8 P2 g2 k; E0 ^: r+ j7 G0 ^ - //{& r. T/ k! K/ \9 q9 c" L
- // v16 = 100;
. r0 [1 s5 y2 P: S% ~6 @ _4 m - //}
; }' F* ?2 z' n, Z3 }3 \: ^ - //else if (a4 == 4)& T4 j* t8 Y% X/ x5 Y4 r" l- f
- //{! e# [8 y; X$ l! e7 H
- // v16 = 700;' I. t9 b( p+ q8 u) v! Y
- //}% K1 X+ W Z) _# \7 \, p& |
- //else
( s( w* I ~% Z& T: E - //{* n5 G6 w- O0 W* G; l0 R
- // v16 = 400;/ Z% b1 J, F8 Y; M9 ^
- //}
2 C( e+ K% P; E& _5 _# g7 ?* }* O - v10 = 1;* \$ p" A5 y: K7 d
- //switch (dword_4AA490)9 r+ R/ `# h' a% H+ j
- //{" p4 x- w X, p
- //case 1250:8 v! Y. H# o. {7 Y9 @( }! {; V
- // v10 = 238;
6 q k$ R9 ~. a6 ?( q - // break;
& E3 y7 }9 J2 A; t- [* W7 X - //case 1251:
z7 K; `) v9 m6 R3 V" C3 y - // v10 = 204;
$ S5 e: ~( g$ r6 o F0 {- y/ k - // break;. G: U( n" \0 P
- //case 1252:
( V' C) {6 o2 q# M7 Q; ? - // v10 = 0;
7 u8 i! W% e( Q+ b' ? - // break;
1 y5 m3 a/ a$ a$ P# E - //}
/ j; t6 j4 j ]+ V( p* [" a, a - v15 = glGenLists(256);
* S: }* t3 Z! G+ C; y - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
: I4 _# k& t) p( U: p - //if (!v14)
3 k& B& J$ Z; d, ^8 J; h - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
5 b O5 v, r$ p% q - //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 3 ^9 c& w/ s1 o7 Y" d$ Z
- SelectObject(currentHdc, v14);
+ J( ]5 \, U% r3 n9 J" h6 h5 e0 Y - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);2 G" ?9 a% E1 C
- 2 x! T, Z( t9 f
- //v12 这次出错
. q1 f! ?* b* @& t6 T) i - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
! Z" ^/ J+ u4 A/ u- j -
# Q Q2 `; b% I; i3 g6 J - //*(_DWORD*)a2 = v12;* n% B, r4 m9 e. C# z+ F H
- //*(_DWORD*)a3 = v13;
! ~3 f; Q0 i- d% j; L2 z9 C) } - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);+ |8 Z7 M, f- {( ^6 y, k% o
- //if (!a9)
" [& p6 C5 ~1 b+ p' b - // RemoveFontResourceA(lpFileName);
* T% j1 i; b1 S3 Z5 I - return v15;
0 }8 \( H$ T& I - }7 u' y& C7 Z0 z) s' B2 Q+ X
# t' o9 w' k+ ?, F+ [% e9 Q3 S- //使用到
$ _) b, t! C. ?5 }0 q+ W& B/ v - BOOL __cdecl sub_451390_Font1_hk(HDC hdc). H+ J1 K+ z/ D; B: L
- {
$ R+ j5 X+ T8 ~, } - HFONT h; // [esp+4h] [ebp-8h], B: e7 s H2 a ]: r+ c! V
- DWORD iCharSet; // [esp+8h] [ebp-4h]) ?6 x& Y$ Q5 D6 E* ?1 M
4 {; {: H1 F# C5 a( D- : X. U5 k8 F9 u0 B* |/ _
- __asm pushad;, T, m9 h3 f$ ]6 h2 p; b4 Q4 `! U1 `( Q! n
- FILE* trace = fopen("font_trace.txt", "at");
' x) O) t5 U( s# S. K' ?2 `. { - fprintf(trace, "%s\n","sub_451390_Font1_hk");
4 Y( D3 D0 D* X" S - fclose(trace);
8 p0 m+ G5 Z; q- r- w* m - __asm popad;! I8 o1 h) P4 G" P z+ ?
; a1 _9 v: z8 |* D B- currentHdc = hdc;
2 b- p' q. i0 {/ @/ n6 } - iCharSet = 1;
1 W8 T- t6 B8 ]$ R" \" `, @, ^ - GLuint base = glGenLists(256);
1 C. c/ Y/ r% o* K4 g6 R - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
0 O5 A2 W: f! }/ G - //if (!h)
& [" ]& R; e0 K - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);1 ?7 u5 h/ U" T! u1 o8 M" H( `
- SelectObject(hdc, h);
$ y- ? A3 y8 P5 n( Q8 n7 O8 m - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);; f n" q; g" P: ~) q; e o- Z" e1 @
- }4 B: ^4 J; q0 h. `+ j+ x e: Y
; U5 F2 [7 ]$ \- K: @" m. B3 c- void __cdecl
4 `8 @4 E) y. d0 z1 F. E1 t - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
+ X/ q" S- a { |! ?" \5 A6 F - {) n2 g# n3 N+ {$ A* M
- __asm pushad;: N, z7 c( I7 }# w4 h5 a4 Y5 v2 o
- FILE* trace = fopen("sub_trace.txt", "at");: e7 x; x. ~1 C4 Y; Y. ?
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);3 S1 n. I* E0 P( V- V
- fclose(trace);1 L1 ^, J8 | P4 x! A) Y3 X& a
- __asm popad;
' }5 e; [5 Q/ x+ n8 P3 l# p4 B
3 }: k, N3 A/ \6 g$ G+ r0 c- //return a1;
- S5 ^) W4 ]. k% B T1 p% ?' A5 ^6 ` - }
( f4 ?7 e6 g# m+ H C0 u8 B8 n - 4 a7 f2 D3 \: S2 i3 ?1 ^- \
- bool
( j4 t6 G2 {& j) V - ApplyPatchNibiru()
) x7 B& w1 u! f3 W% U - {4 }0 b' r6 e( w1 f
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);" T8 N u/ W* X" M" H
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
& [$ ]4 W& E/ C - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
* O/ E* m2 c- j F
0 ^9 L5 D+ S% c* E7 [- 8 \7 t( |& t3 R9 ?/ \8 }7 D( P
. y" @; E3 |8 o! q+ `* i- return true;
0 _% m( D+ n) s1 H( Y+ l9 T - }
4 u# X4 @7 P# p2 Y' O! y! o
复制代码 " D( ]! ~: |$ N# L$ h5 _
( ]: R1 e* w" }: P
2 a9 ~0 \$ ?+ @( [
l% [6 X( Y+ z8 W; q |