冒险解谜游戏中文网 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& s
0 X* V, z! b- Q) Q* H I" M
sub_451390_Font1_hk
6 \6 P q% }8 ?4 ?
sub_451390_Font1_hk
0 } v2 e4 j9 D+ B
sub_451599_Font2_hk
. g/ u- C o$ A, x
sub_451390_Font1_hk
0 t1 ]; b5 n2 x, J0 | e+ J
sub_451599_Font2_hk
' d* j$ B6 M: M1 M8 }7 Q0 S
sub_451599_Font2_hk
. o Q# y; v, ?: [# I3 a3 ^2 o
sub_451599_Font2_hk
o/ w! S) N- S8 J9 s, G2 z3 o
sub_451599_Font2_hk
% L3 ^' K; Y3 L- y2 Q1 x
sub_451599_Font2_hk
. l2 K- p( w$ w& d
sub_451599_Font2_hk
' l$ e/ s% ~9 S+ W, g% D
sub_451599_Font2_hk
6 u; j9 ?7 {$ I
sub_451599_Font2_hk
, n, q; Z) d8 u' x) R
sub_451599_Font2_hk
复制代码
p/ K- j. e! j& i
代码
! V6 _% c4 Q+ k/ [# F2 V
#include <windows.h>
, z7 }5 M/ m( V S, D& n4 s" |) y! m5 P
#include <stdio.h>
: [( W: c* P$ [4 j& t
+ I7 D' x2 ^4 Z. H
#include "patch.h"
& {5 i4 j6 V( F8 s$ I' O. A
#include "patchNibiru.h"
8 Z9 X* p# j0 [4 T8 ~4 O
#include <GL/gl.h>
3 \) U9 j0 e0 n0 n5 e
$ z2 r4 w1 Z! H3 F7 L
& P7 r% D8 q! z2 H+ N) }
DWORD SUB_451810 = 0x00451810;
9 g) o+ m) {6 [# r
DWORD SUB_451390 = 0x00451390;
/ ~4 @: g* k' L% b" \1 f4 g
DWORD SUB_451599 = 0x00451599;
' [- g6 U. e" D8 | I: j
- S- }" j6 Y. A! n3 ?
HDC currentHdc;
3 v5 g, `- e( O; w, T% E6 r
! ^8 y* L( N/ e- b- g
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
{
) J9 L* q/ q( x
DWORD v10; // [esp-450h] [ebp-450h]
; P- z9 }6 r) C8 d) s( M; D
int v11; // [esp-44Ch] [ebp-44Ch]
+ Q( W5 m2 }5 o5 N$ d$ Z( r
int v12; // [esp-4Ch] [ebp-4Ch]
2 T0 C4 a' m+ b/ I
int v13; // [esp-44h] [ebp-44h]
. A) Z$ d: v& @+ g' u! E
HFONT v14; // [esp-14h] [ebp-14h]
) m6 u+ \3 w0 S/ ?9 U5 J4 b
DWORD v15; // [esp-10h] [ebp-10h]
1 O8 R _/ c$ y! h/ r
int v16; // [esp-Ch] [ebp-Ch]
1 v$ V) @4 C3 U( o& D, c" z; M
int* i; // [esp-8h] [ebp-8h]
' `, a. K6 J' o0 l
" c, _$ {! { ?/ s
__asm pushad;
: J! N$ }. h0 s( a
FILE* trace = fopen("font_trace.txt", "at");
- q/ M7 V. q! k) X5 w3 |2 n
fprintf(trace, "%s\n", "sub_451599_Font2_hk");
; i4 B W3 d H7 n* z- I4 k
fclose(trace);
7 b3 t0 W/ v" J0 [
__asm popad;
% s4 m1 O, J5 Q3 Y( d) l {
7 {" t E) e# u) _* t
//if (!a9)
( ~+ ^0 |, d' r' G
//{
" W( e% i( b6 ^: {: W6 g* g
// AddFontResourceA(lpFileName);
, S" _% i" Z1 L) r* {. F: A
// for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
% ]9 A2 ~! ?; c6 J. `
// ;
$ F# q* i2 I+ C/ W
// *(_BYTE*)i = 0;
; q8 b8 k3 E, h5 u2 B) N
//}
) \/ K! b" G1 H
//if (a4 == 1)
$ i3 K) B0 z* y6 P' K/ X4 S! K
//{
( a( \8 A6 J/ R; F# K; |
// v16 = 100;
8 W: c- u3 I3 v# H l, E% ?. I
//}
/ w, x4 w; C7 H0 L& ?. @
//else if (a4 == 4)
% m Q* [3 ~; \7 H$ r: u
//{
! a3 A# L% o' x6 E- Q
// v16 = 700;
0 d+ ~, m) h0 |0 [ y
//}
, ^* ^% D$ V4 h( |4 l& C
//else
; h) b, s" d1 C' Q. T5 ~4 a0 A
//{
* a( r7 O+ j4 U/ c
// v16 = 400;
5 j! b! }! L, z: d* }+ l
//}
5 {$ u+ t8 |( l: ? z5 ]# w2 I
v10 = 1;
7 _$ W! W8 L; J1 O4 v' ~- d E5 A7 S
//switch (dword_4AA490)
4 P) |, p/ F R1 p
//{
5 m: z$ D+ f0 k/ o2 @/ Q
//case 1250:
. |, S9 H, H( V5 b M. V
// v10 = 238;
2 N+ u' V6 l7 j7 H# _- |2 h
// break;
( c2 q4 `0 g* I1 L7 N, ]& C! f
//case 1251:
, Z9 ~- w8 S# [& D1 ]0 ?
// v10 = 204;
3 t6 {; K- @ D
// break;
( T+ ^* k$ {5 `' j) j+ R% B
//case 1252:
( v( e' ]# T6 ~+ A, o; W: U+ w
// v10 = 0;
# N& v2 T7 W4 n+ f d: u' E
// break;
; }1 @- ]- C3 R
//}
% w! g* C% z" Y2 w# e% S7 B6 K
v15 = glGenLists(256);
/ V2 |7 F& [% w( b
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
//if (!v14)
* z2 b# D( @, G. t7 T
// MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
% ]* B! G0 ^ P! h1 {& l2 C
//HDC hdc = GetDC(NULL); // 获取当前设备上下文;
# l9 C! v& f4 r6 A
SelectObject(currentHdc, v14);
3 _! l9 H; C: |2 [- G/ ^. b% A2 l
GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
I O' X, R' u* l$ T
# Z, T; o9 U! @' ~5 C* u9 f1 u
//v12 这次出错
$ ]+ S/ `7 z& g" n; D! f0 G
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
, z# L$ N& V, a; m/ J8 n3 G( Q# ?
e$ P9 w, V; Y7 N; \ L
//*(_DWORD*)a2 = v12;
8 V1 A' d1 @$ p! y9 B" \
//*(_DWORD*)a3 = v13;
% h' l8 V4 @4 D0 @% p; \
wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
$ \: x7 \% g J8 t& m
//if (!a9)
) r( x: g+ p1 k! C4 X
// RemoveFontResourceA(lpFileName);
1 M! S8 u8 V" o, r
return v15;
7 ~2 Y* L: G% T! E
}
" Q1 a2 ]0 i1 q6 C% Z
0 _8 C$ X) w& ~1 a# j$ I7 C
//使用到
3 o6 @% U. ^6 ?& e
BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
9 i6 A7 L; k: v& F4 Q3 L( m$ N
{
* v: U. v4 Y7 l* c2 L0 O1 }
HFONT h; // [esp+4h] [ebp-8h]
! Y% t- }4 S% h7 R- `
DWORD iCharSet; // [esp+8h] [ebp-4h]
, p! @) ?( q& N8 c
% o8 V9 J8 `. p9 Z
2 E5 X. V2 c- q2 ?8 Z1 t4 {" r
__asm pushad;
' o& U e- r2 P# E8 f. K
FILE* trace = fopen("font_trace.txt", "at");
8 m" q Y; M+ f+ H- m, v7 b4 c
fprintf(trace, "%s\n","sub_451390_Font1_hk");
6 K9 p$ R/ d# I9 @- B9 |
fclose(trace);
3 T5 i, D' u$ k4 l6 x2 ^6 H
__asm popad;
5 P: Y0 _$ w s" f1 Y
, Z7 ?* j: s$ G5 ^0 w, d+ V
currentHdc = hdc;
7 M& o, }# F+ v- \2 z. h
iCharSet = 1;
* C E: q! x8 t. v
GLuint base = glGenLists(256);
7 L5 `4 s0 y7 S
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
//if (!h)
# W" f% d' b/ J* ^- k
// MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
! H" J# H* Q( H" X6 s! ]( D# X& p& g
SelectObject(hdc, h);
: N. p! U- R5 j6 o$ i
return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
( C0 z( C9 a! Q# K6 ^* F) L( h8 P
}
0 l' n s- [5 |) y' r
2 q% x* o) B4 l9 V5 O1 n* _
void __cdecl
7 h) ]* A4 C( W2 m2 D: I3 f
sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
! z/ e. S2 v6 k* l3 {- ^
{
% S$ v( c! o* T! P, x4 R' }9 C
__asm pushad;
& [. R% Y- b4 y3 L8 l( Q2 l
FILE* trace = fopen("sub_trace.txt", "at");
7 Y- o, D$ X; V/ ]/ b
fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
7 `# i+ D( h0 P9 w
fclose(trace);
I, O9 ~ s2 C1 u; g. k
__asm popad;
& W8 k* Y3 g( T- k
$ X9 j2 j/ k( W/ I% [) q
//return a1;
. |1 @% W- W, ~" i! U: ]- B
}
7 e, V9 l6 b# ?6 {2 f
( |2 J- T7 ~; {
bool
: l" ^5 E' [$ ~1 [2 `
ApplyPatchNibiru()
4 c' l/ G4 G7 r. z6 y5 G+ s
{
" p: l. b$ B, a( d3 p$ W1 {. }
//JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
6 G) |; V/ ?7 H u4 x6 f
JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
@; R: J) C, J4 E8 Q: t
JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
/ z+ v; t$ h! J, u
" T9 m- v9 E( K2 w0 r
! C3 A. \ {) v
5 v3 k+ ^$ R0 |( x* L% E. M
return true;
% }. l" c% Y. z+ C7 R: l
}
& _* 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