冒险解谜游戏中文网 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
sub_451390_Font1_hk
& l2 W4 |8 ~2 z. k7 u; r
sub_451390_Font1_hk
& R2 d1 ^+ t# F4 q3 f, F6 F; x
sub_451599_Font2_hk
; @% c( U/ Z) E- u3 p' d. F+ z4 P/ d: d
sub_451390_Font1_hk
2 N$ ]1 x: P* ]
sub_451599_Font2_hk
' c- u( {) V2 w |
sub_451599_Font2_hk
4 A( [: `- Y2 w8 B( C2 P
sub_451599_Font2_hk
1 p$ W% t; B5 T% ~. L1 w4 J4 R7 B
sub_451599_Font2_hk
* @) ?- a+ [* Y' B% P
sub_451599_Font2_hk
C3 x) `5 ^! G; c& X/ }& w# S
sub_451599_Font2_hk
3 n& e# C% e6 H8 B( g. n, z
sub_451599_Font2_hk
) F+ a& ^8 r5 T2 z5 l" L' p
sub_451599_Font2_hk
5 ~. N3 D4 i- O. p2 i( p/ O
sub_451599_Font2_hk
复制代码
3 v" ?& L [ z8 H- K& s4 ]% \( g
代码
* J1 q/ q" E- s" C
#include <windows.h>
/ ?" {9 N& _+ q
#include <stdio.h>
& o: U0 a/ K8 H, z; m' \
6 N/ s8 f+ f( _+ t: F8 U. W( `
#include "patch.h"
; M* ^3 K4 i: g: I# _0 u
#include "patchNibiru.h"
' x6 Q. E4 x) h& \) x2 ?' w
#include <GL/gl.h>
" n/ |" T, o. ~+ H
, j6 u7 X" i x
2 \7 d6 d- m& e3 ~5 u
DWORD SUB_451810 = 0x00451810;
9 M4 j( P1 ?2 ~$ @5 q4 Y9 `& ]' U5 w
DWORD SUB_451390 = 0x00451390;
3 P5 T5 `* _5 v0 I# V) p; t
DWORD SUB_451599 = 0x00451599;
3 V5 X6 S( @$ @* ?
* L9 p5 K( @6 b7 S+ @
HDC currentHdc;
9 Q* t: A& K l8 n* [: ~
, `. A* v& _! I( |1 {4 u
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 \
{
- d$ l7 b; J5 J' t
DWORD v10; // [esp-450h] [ebp-450h]
, ]' q! B' b1 Y2 Y; p4 g
int v11; // [esp-44Ch] [ebp-44Ch]
: d3 o( W. R0 ~
int v12; // [esp-4Ch] [ebp-4Ch]
1 _, E' i/ u: v$ R) X0 L9 t
int v13; // [esp-44h] [ebp-44h]
& J4 r( m# }& s: ^7 D0 K
HFONT v14; // [esp-14h] [ebp-14h]
% B1 ~- [: o; {
DWORD v15; // [esp-10h] [ebp-10h]
u9 E3 v8 z! J2 p7 S
int v16; // [esp-Ch] [ebp-Ch]
) P2 J% W4 y% W- V$ A
int* i; // [esp-8h] [ebp-8h]
. u: g9 X( W' u0 P
" c; e. p0 W6 b, K* @. B" ?4 q" Y
__asm pushad;
; K0 W/ m) s, w0 h. H# t
FILE* trace = fopen("font_trace.txt", "at");
( h9 W+ l# O5 C) f5 y. z6 e* N
fprintf(trace, "%s\n", "sub_451599_Font2_hk");
w9 Q; k) q! v/ q' I& p
fclose(trace);
; J6 H; `! r1 x3 \9 @( w1 p
__asm popad;
1 ]/ ?- i8 G! i, f- f! L
6 t/ |! @/ w g% H
//if (!a9)
5 A* {4 a0 S! ~; k9 |
//{
3 b- Y! W! p& m! G: S
// AddFontResourceA(lpFileName);
" M! E/ B% e, ~1 R% v
// for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
# D5 [/ Q0 ]2 F
// ;
% f, }1 l$ i [9 F
// *(_BYTE*)i = 0;
) r& ?+ o2 L: f0 c7 U, ?+ T3 o
//}
3 I& c z+ p1 N$ u
//if (a4 == 1)
3 y; L# `3 o0 r4 g% e; e/ G$ L
//{
$ E3 I9 C7 E2 g% L) H8 H
// v16 = 100;
5 z- ^) B9 P' d2 a6 Z
//}
& y5 Y0 t+ [6 K+ }
//else if (a4 == 4)
2 f* B- E& y3 p# ^- O! `
//{
( V+ D% S- e! n
// v16 = 700;
( G$ e% @/ h& l
//}
0 l3 S5 P3 r' R" W: N
//else
4 {3 O$ O) s+ l( Q6 k5 z8 q( ?
//{
?$ Y# F! W- t& }
// v16 = 400;
! _# ^9 V$ ~& b! T
//}
) o, N" B" g1 o* F
v10 = 1;
7 h" _# @) V* f$ x& [* F! ?& [
//switch (dword_4AA490)
+ L* z: p" W d% e
//{
4 G9 ^2 u( K9 F- s: a
//case 1250:
7 _) M8 C+ W. `% l1 u7 y
// v10 = 238;
2 V7 i) Z# ]" r* B( I
// break;
O* t; {- p1 k. `3 B
//case 1251:
4 W% v7 g: N" U9 X0 _0 D
// v10 = 204;
! ^+ c+ C6 ^3 j0 c+ p) J7 v' u- |+ ]
// break;
' K8 L7 @$ s7 R. h2 r8 j% L0 z
//case 1252:
5 Q$ ]! p6 |* S; d! z7 Z
// v10 = 0;
' H7 U3 n" F! w3 V& `: N% Z; B
// break;
8 R. h5 |0 Z/ ]( ~, a
//}
& B/ F3 j! `/ g/ y- |4 p; a
v15 = glGenLists(256);
) ^1 z9 p: o% t' p4 J5 Y
v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
, |' `, @: l4 m
//if (!v14)
. e+ O7 }. {/ `$ Z4 y
// MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
& o: K7 C% ^* f, b7 B* X" Q
//HDC hdc = GetDC(NULL); // 获取当前设备上下文;
3 p7 {# l7 x \4 H t
SelectObject(currentHdc, v14);
* J0 r8 i) ~0 q6 [8 o3 k' a* `' X+ D
GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
+ z, N3 Y# T. k' g% m0 ~" I
2 U, @0 I. l" E: O9 S: i* Y2 y6 z
//v12 这次出错
& W' x$ `: x' ~, l8 Y
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
5 E- u7 z& U7 P5 |* M
) f' X6 F1 d0 K6 f: L+ ]' ]* Q* a
//*(_DWORD*)a2 = v12;
$ }6 B( U3 V2 N9 K
//*(_DWORD*)a3 = v13;
; R* X9 s: d( j' I; u/ j
wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
% n+ \3 E1 c% l* t, G& n' d
//if (!a9)
7 K7 N7 {4 u4 S
// RemoveFontResourceA(lpFileName);
1 {3 ?# ~( h( L8 B# }9 F
return v15;
' ]. T1 B! c$ a) p6 S6 P
}
. c4 w# b; F5 O8 `2 L% X
; ?& h6 |$ U* Z- l a- z9 f: J
//使用到
! b- s x; e1 B5 a
BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
) T4 Q$ |% B1 v8 [) X7 ~: p
{
1 n* X( Z7 R6 q7 S- F, U# E% T. B
HFONT h; // [esp+4h] [ebp-8h]
1 Q, R: `) A$ }# Y
DWORD iCharSet; // [esp+8h] [ebp-4h]
2 ~% I& g- h' J$ o( H" V% ^
, c x+ I5 I# A) C
5 m+ U/ P( m, I& g8 {, c) b7 u
__asm pushad;
, P3 V9 z- ^- v7 p1 k. {* r
FILE* trace = fopen("font_trace.txt", "at");
% D4 }0 S5 j; S! [- W @: L
fprintf(trace, "%s\n","sub_451390_Font1_hk");
- A0 s+ k g1 u7 j" f- Z- e$ M
fclose(trace);
7 K' ]% d1 o# }
__asm popad;
- @- H; G; [' B; Z- r% r
* S& `% x m7 ]( a' w
currentHdc = hdc;
( d5 j- R# B/ `; u8 ?
iCharSet = 1;
, l$ M- Q! a4 |- ^7 [
GLuint base = glGenLists(256);
3 Z, g! z! y/ X0 j' e! R
h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
* ?+ q: a8 l1 g- `
//if (!h)
4 Y( P# y% v; ?: Y1 E: A* |
// MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
. h' j, O! U5 j$ V
SelectObject(hdc, h);
( [! ?" p% R+ y% p9 @' u
return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
0 k1 p$ ~3 N0 t: Y
}
$ {% A5 X- {& ]0 g
+ @ ^- O" u A* ]0 B$ m' r
void __cdecl
; e2 X' ?, Q1 ]& a% o0 P- E
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
{
( b: Q8 _% C% o V7 r
__asm pushad;
+ h4 ]/ ~2 t1 c1 E4 j' Y0 F
FILE* trace = fopen("sub_trace.txt", "at");
( c0 p6 R0 n- ~" i/ v7 ?1 o
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/ ?
fclose(trace);
, _ C% v, ]0 W8 h* N0 Y1 a) f
__asm popad;
/ R0 y# @& w& _! z) G2 e
7 i) X! f& o% n4 Q' s
//return a1;
/ E( V8 ~4 H* D$ h# q
}
) n9 E" s0 s6 M
* a% J3 q; i5 o2 f7 v
bool
: Q& b- t. K. N( I
ApplyPatchNibiru()
2 M" q' F! B x4 M+ Z' ]
{
! ~9 [/ u( }7 ^, O/ }: b* C: Z' z8 G
//JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
0 L. k/ V( N$ n- X S
JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
* Y! }6 h) b( l0 _' v3 R
JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
3 R4 }2 \/ r5 }4 T
# L8 V9 ^8 F+ w; c
2 N, R1 ~6 }5 h( m
/ }( c6 C* D$ s& j* r, W/ ^$ m
return true;
' k' S+ C7 _4 x
}
( \' ^# 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 N
0 V0 _. N5 U$ v+ ?& ^1 v, M+ R
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2