设为首页收藏本站官方微博

建议 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

[复制链接]
查看: 485|回复: 0
打印 上一主题 下一主题

[建议] 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

跳转到指定楼层
楼主
发表于 2023-9-6 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

本帖最后由 shane007 于 2023-9-6 11:03 编辑 ' J5 }8 r: S2 V% L, Q1 P( l2 m& W

2 V/ |& |% r, F# K: h* @(nibiru.exe 772 KB (790,528 字节))7 t0 s" l( d4 z3 Z' o& ~
0 F9 D1 q: i3 @; x, O2 M# k5 ?
将sub_451390,sub_451599 这2个显示函数进行了hook.# ^3 |- t! z" O3 S1 l) S3 g5 d5 S
确认这2个显示函数都被调用了。
& I; x, e  T5 J8 B# a$ H' Q9 }第1个可能显示的是调试字符串,第2个显示游戏字幕。  j8 C7 L6 a+ ^+ [$ A' l" S

4 T1 P6 N' _* W) r以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
6 z# L! m4 ]. c0 l
; n7 H/ f8 ^" X. T! W4 g' ]9 c9 F7 a    //v12 这里出错
, A0 g6 \+ k4 [* l8 h+ |; _$ s    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
4 e) }/ ^7 v3 w& ~7 W
  r0 l# ~0 C0 V. g/ E输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
* v2 y9 Z' V% \8 ?这种方式显然是有问题的,会影响性能。" ?. x6 f  B0 d0 Y9 v
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。- Q) q$ o0 Z2 E( B1 U' [2 r

5 Y6 y2 @# o: M0 X: P# r5 D' K
  1. sub_451390_Font1_hk
    ; J$ S0 Y9 V( K/ S! n1 J1 D9 [
  2. sub_451390_Font1_hk
    - O) S6 d. l0 ^& W# K0 o
  3. sub_451599_Font2_hk
    : _0 P0 J1 P, J6 E# @8 t$ j
  4. sub_451390_Font1_hk% M6 ]5 k9 q4 K; D
  5. sub_451599_Font2_hk; X9 c) _# e1 N5 F
  6. sub_451599_Font2_hk3 ]  v- d9 d+ f& _4 i: n/ z
  7. sub_451599_Font2_hk; v# h* G: q8 L8 D: _
  8. sub_451599_Font2_hk
    5 f- {! D# Q% a: I  N& Q
  9. sub_451599_Font2_hk
    # H5 @' |& u& h0 ^1 K" \
  10. sub_451599_Font2_hk7 _! k( K6 g1 W7 e: K
  11. sub_451599_Font2_hk9 _. ~1 j; r$ Q9 r5 _
  12. sub_451599_Font2_hk
    4 i, `# Q/ o' v% `, Y
  13. sub_451599_Font2_hk
复制代码
) c- X" C# [" P- ?. i5 z! Y) C
代码3 j* E* q. ^. Q
  1. #include <windows.h>
    % s" i, m. }4 ^+ W5 ?5 X
  2. #include <stdio.h>$ x0 f" A; c  S
  3. * a! l& O4 W6 u: X- L
  4. #include "patch.h"& m4 X3 g# }( G$ Q1 k
  5. #include "patchNibiru.h": C$ n' q* q1 a% x5 f! G
  6. #include <GL/gl.h>! F" _9 C" S3 Q6 c) C2 |0 g4 E
  7. * ~  _. a% ~- j& p- e- j

  8. ! C/ O% T7 C' z6 g
  9. DWORD SUB_451810 = 0x00451810;
    : S; T& \3 T7 T1 F1 t% P/ P
  10. DWORD SUB_451390 = 0x00451390;9 P; D" r. K% N! {( k
  11. DWORD SUB_451599 = 0x00451599;9 @% M) h# d8 ?% a" q

  12. & P; B+ W# ?# A* F. @9 D
  13. HDC currentHdc;4 b4 q8 `$ u3 t3 ?8 @0 m+ F

  14. ( I! @3 r0 ?# t* m" V
  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)  D: I8 S# F- D6 U$ k2 v
  16. {
    / r* {- T# P! K# f, V
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    0 }/ \. I% d2 m7 ~
  18.     int v11; // [esp-44Ch] [ebp-44Ch]' l% {$ t7 U# |
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    / E# {& w' w: i
  20.     int v13; // [esp-44h] [ebp-44h]
    8 K4 I% B3 b! B* K
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    / S" s' {5 Z/ m# [
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    ; k4 ]( z- U. b7 y* }4 c6 p" [
  23.     int v16; // [esp-Ch] [ebp-Ch]% X% B- W6 j' V" ?
  24.     int* i; // [esp-8h] [ebp-8h]' P, R: m- G4 `0 L5 x
  25. 8 G9 Z* u% O/ G1 k& y& B& B0 `
  26.     __asm pushad;
    & a) U6 J" w4 [# }
  27.     FILE* trace = fopen("font_trace.txt", "at");$ f7 R  D9 Q# u3 `* \) J
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    1 i) ]$ D; X% N' U6 R3 I2 W
  29.     fclose(trace);3 [% n1 j$ ]5 x% h
  30.     __asm popad;: f$ M) T. g$ ]& o3 c. t( M
  31.    
    / R* {, d& w$ {, E1 }. X: E
  32.     //if (!a9)$ r5 \+ q2 i" E, J/ y# d
  33.     //{4 T5 Z) w+ Y2 P! Z8 N( r; t7 G& y
  34.     //    AddFontResourceA(lpFileName);1 C5 p( a8 y* D1 _- r! T3 v- N
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    8 r0 ^$ I( v4 `& Q- u
  36.     //        ;
    ! ~" Y1 g' W: U% K
  37.     //    *(_BYTE*)i = 0;7 l" C0 \) P) e5 W1 S+ w
  38.     //}. Y6 [7 S3 t2 G# i) H* O
  39.     //if (a4 == 1)0 {/ y4 [( D5 u7 X2 y4 {
  40.     //{. s( Y0 ~* v9 ?. a( U) ^
  41.     //    v16 = 100;
    7 _- J7 |' K8 a0 j
  42.     //}
    . d) z$ }: k7 j% e5 w
  43.     //else if (a4 == 4)3 `! v0 \% F: u  N
  44.     //{
    : ^) J5 W$ y" _8 G" \7 v8 S
  45.     //    v16 = 700;
    : |. B, `5 _/ C0 {  \& e
  46.     //}
    ) g; M/ }' z5 V  e
  47.     //else
    / ~, r9 d" h$ \& ^! v
  48.     //{
    ' q6 c, e" k7 \0 X0 T: I2 x( T( ~1 F
  49.     //    v16 = 400;
    0 ?/ x$ v; e# E" ?% H7 F* [
  50.     //}
      ?; Y# r! G' i% w5 v
  51.     v10 = 1;
    8 i' `% m7 G8 N" e! M0 z
  52.     //switch (dword_4AA490)
    - S, m8 k5 G0 q
  53.     //{
    # i6 p5 W6 m5 ^  l+ k" r0 r
  54.     //case 1250:1 c: u4 D; G  _  i# u! `
  55.     //    v10 = 238;
    : J& G: x6 t9 O5 d
  56.     //    break;" r5 }& q7 j3 i' N! k  q7 }
  57.     //case 1251:
    4 {8 Y: H( i2 b
  58.     //    v10 = 204;
    0 O+ e* W+ q  b1 V" O# R
  59.     //    break;
    & {! O5 ^/ e' x+ J( ~4 A
  60.     //case 1252:
    3 E, v6 m% I3 _( O! J: }. J% X
  61.     //    v10 = 0;
    : I: E* t3 Q  u4 J$ }% ?
  62.     //    break;
    $ F  O% p& V% E0 e( j, h
  63.     //}+ Q8 x! f. k1 m" v; Z6 p
  64.     v15 = glGenLists(256);
    " A& `* n5 D$ N) ]  W+ h
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    ) C6 J& `- B  x$ n3 K+ E
  66.     //if (!v14), p% S5 p  c/ `8 @7 g
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);9 \3 S) g6 L- s) ^+ ?
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; . ?" F/ M$ p& v1 n- G
  69.     SelectObject(currentHdc, v14);
    ( a% y9 ?% F( q1 @
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    2 W5 H1 `1 N* p
  71. ( z. i) ~; F% Z' P1 {$ I
  72.     //v12 这次出错
    7 z1 h2 \# J( r$ }. r' N4 u9 Q
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);2 K3 s. j+ x+ N0 [3 |' a
  74.     - ]5 O. ]' C- V7 e
  75.     //*(_DWORD*)a2 = v12;
    # j3 r4 @4 P; F1 q/ X4 u8 c% B7 L8 U
  76.     //*(_DWORD*)a3 = v13;
      Q0 M7 l5 A8 r4 ~% _$ Y& ^
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    ' k3 }- Q6 H, }/ m/ ~4 `. I6 z, c
  78.     //if (!a9)% u  d2 m% \: b0 C
  79.     //    RemoveFontResourceA(lpFileName);+ y6 u3 w0 I7 k3 U
  80.     return v15;( A5 l+ h/ }6 N0 }
  81. }% X8 o6 D4 G. x* n" U

  82. 5 ~5 ?9 B0 e; O" t! X$ f2 r: `: @1 @! ?/ r
  83. //使用到5 ^5 W) a7 `0 S% c  A8 j
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    # N) h* {4 H/ N; u/ y- |- d  o
  85. {! n6 A' C) \# ]1 z
  86.     HFONT h; // [esp+4h] [ebp-8h]3 d( j9 R" P7 J" F3 G! P" x
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]! t  v" Q! e; u  B

  88. + X% `0 f- G# S+ ~' L) O' t

  89. - Z0 q! C% N8 n) e
  90.     __asm pushad;/ x" S9 q$ S8 b0 j* Y
  91.     FILE* trace = fopen("font_trace.txt", "at");
    # X; e; y2 q) k1 f* }
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");2 G% g5 b: ^9 ?. v* R: G2 T% y6 q
  93.     fclose(trace);
    ! s+ C$ h3 X4 {5 M2 C) d# q# m
  94.     __asm popad;* C6 `! n1 x( s/ r: U$ D& Z, G
  95. - `2 `* ?. L6 C* W3 \$ U% t4 _5 n
  96.     currentHdc = hdc;( h$ n" s. o% ?
  97.     iCharSet = 1;
    1 v1 R7 B3 P; {* b3 I: o5 R
  98.     GLuint base = glGenLists(256);
    9 v- O5 B1 u+ D2 a
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
      a+ n7 O6 ~. j% z: \" C! P
  100.     //if (!h)
    5 s2 O, A1 J/ B9 G" O9 g  U+ h$ M
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);& h" [* J8 Y& M* R, c4 t' H
  102.     SelectObject(hdc, h);
    : D; C! j+ u4 w& ^
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    , F* T* U" z4 |" \$ }- v
  104. }4 C+ V+ H3 R. C$ y
  105. : H1 s1 {; ^3 a
  106. void __cdecl/ ~6 E$ x# I5 W5 H: R
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)9 i  s1 z4 J  V
  108. {
    * _# Y' E- a# B5 U0 ~8 {
  109.     __asm pushad;/ A# G) }5 j. U- [; u" E
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    , j1 C- J0 {. T
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    ( f: k$ ]- t- h: ^: S8 s
  112.     fclose(trace);: X+ o/ {* {$ y$ S; x+ u- O
  113.     __asm popad;, D  x2 s: r* H; K
  114. - b1 s! k# X8 j* J
  115.     //return a1;
    - G! E1 K9 S+ M# Z
  116. }: Q( Y! G0 V: `$ R9 x: ?
  117. . c. f; {9 X( ^% q
  118. bool
    0 P' N/ O+ w/ E# w& S9 l% ]6 M
  119. ApplyPatchNibiru()% J2 v# H& h/ ~" Y8 m$ A
  120. {, z. L2 [4 s, |: k  [
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);1 q2 |& p$ v$ E; q4 d1 K
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);* x% |5 i+ X3 Q1 n
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    3 x: N. c$ o$ q% N3 X& B; `
  124. * u% f0 L& ^& n8 Z% Y9 s1 ^

  125. 5 U5 t8 H9 @! \; _6 E

  126. ) |# I+ {. ~9 Y
  127.   return true;
    ( K# V% y- S( ]0 G* V$ }; d& Q
  128. }4 W9 P. ^  z$ Y
复制代码

9 r: M- Q. t9 s0 o/ j/ l
& C7 v4 D9 g+ g* w7 R/ _$ {; ]  E

+ `7 |8 L& M7 M; O3 U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表