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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
0 u3 G. k2 l3 ~0 b- u# x
* M6 u, I. Y5 D+ ^(nibiru.exe 772 KB (790,528 字节))/ {- |4 e& f! v' }- d* f

: [" v* N# u0 {' [3 L将sub_451390,sub_451599 这2个显示函数进行了hook.. Y$ h+ D6 l7 d( l9 m' G5 G# R
确认这2个显示函数都被调用了。3 m) @4 t9 B* w, K
第1个可能显示的是调试字符串,第2个显示游戏字幕。
  z1 q8 q. z! ~$ ]$ e  @3 X# k8 p1 a
$ Y6 B# Q, g0 D+ f3 s以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
/ D0 R4 {* q5 ^/ O
) e, D7 [6 W1 k7 c    //v12 这里出错
3 `1 u: X$ u5 M, a$ U/ e    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
+ T# g) m% a  m8 Q3 L2 ~) x$ d, w& g* t  f
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
; U1 h& t5 S: S: X# x这种方式显然是有问题的,会影响性能。, |" o, u4 O* n. d% x0 {0 h
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
* M# Y7 }! q% |1 {/ \0 I0 g3 ?* _' K- D: H! \) W. }% r6 ^! \
  1. sub_451390_Font1_hk
      ?+ K' [& s& T  U7 B  g
  2. sub_451390_Font1_hk
    + W& u+ ^7 W  b4 ~' [( X5 S* H
  3. sub_451599_Font2_hk
    0 ~3 L" `, z7 o
  4. sub_451390_Font1_hk
    9 u, v& }2 \1 S
  5. sub_451599_Font2_hk5 \! N/ }1 i* H4 \
  6. sub_451599_Font2_hk
    ! ]; ?+ s5 K6 c3 z
  7. sub_451599_Font2_hk
    / h% `( L$ J0 }' ?5 E& f2 x
  8. sub_451599_Font2_hk) `3 F% u0 {1 W: o+ V
  9. sub_451599_Font2_hk
    " k  r+ @) b0 ]. @8 `
  10. sub_451599_Font2_hk9 [' `! l2 P2 x
  11. sub_451599_Font2_hk
    - L# W1 o( S6 @( Z) I
  12. sub_451599_Font2_hk+ E; [) A2 g( [
  13. sub_451599_Font2_hk
复制代码
! ?* G/ F1 o# i  `8 n
代码
, U" k7 B: ^* e2 L0 x3 o  f+ M% N
  1. #include <windows.h>9 U9 y4 K4 `1 v$ S- _9 K' l. c5 U4 ^
  2. #include <stdio.h>
    0 C* K* K* }. ^( K
  3. % {5 I9 N, \' ]' v
  4. #include "patch.h"# z8 c) W0 Z2 o; p2 S' r& i( O
  5. #include "patchNibiru.h"% B, T! B/ m7 w+ d
  6. #include <GL/gl.h>0 Z, ?  a" I6 p$ [

  7. 6 N' o  q1 V% y8 j5 r4 _  u+ M

  8. 1 D1 a9 P/ X* U( Z( I, ?" ?
  9. DWORD SUB_451810 = 0x00451810;
    4 w! T/ B5 e) I
  10. DWORD SUB_451390 = 0x00451390;
      E. h3 P0 w+ l. R% x' Z! [1 k* j
  11. DWORD SUB_451599 = 0x00451599;6 Q7 C$ ?- X, M# m! ]! @
  12. % s" E& X% E  L9 K1 H7 Q$ i
  13. HDC currentHdc;
    ( [0 q' A0 z8 K
  14. # ?" S9 ~$ }) K- K
  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)5 Y! @- M( A4 l0 i
  16. {% v: O7 m# j5 H; R$ w/ ?/ U1 \* r
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    $ W9 @6 |0 t, g' m6 `# K$ \5 G
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    1 q$ G: N) b& ^9 b! g- b8 B% J3 J& _
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    5 {/ {0 ^' T. ]1 J
  20.     int v13; // [esp-44h] [ebp-44h]
    1 e+ L& \1 s( A" p
  21.     HFONT v14; // [esp-14h] [ebp-14h]
      J7 l, }, L4 |$ ~  ~* @" m
  22.     DWORD v15; // [esp-10h] [ebp-10h]) Q' K" a7 O; |; d& g; k
  23.     int v16; // [esp-Ch] [ebp-Ch]5 p% S; z. Y# D: [. q7 }
  24.     int* i; // [esp-8h] [ebp-8h]; S2 l, {) B& m) c

  25. 8 K- `/ R2 R, f
  26.     __asm pushad;
    1 j( N1 \  w( e
  27.     FILE* trace = fopen("font_trace.txt", "at");. |0 R# D( s9 S% F, v- l
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");2 D9 L' l- [: ]  s
  29.     fclose(trace);2 S2 V- ~% a# f6 R4 e  `+ z
  30.     __asm popad;  t) Y. o/ V4 }4 E
  31.    
    ! B* ~9 Q- S- e2 Q" e" E8 w  ~
  32.     //if (!a9)$ {, H, j7 w2 K5 a. _+ g
  33.     //{
    : R' y1 P& }4 A. I" W! B7 R& S
  34.     //    AddFontResourceA(lpFileName);  v. b7 Y+ W" V7 ^. L) q3 U
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))$ P5 W+ m/ k( v7 ~9 v4 P, y
  36.     //        ;8 b9 p% ^: r3 C* B
  37.     //    *(_BYTE*)i = 0;
    4 b: b% l; j1 x6 @' @6 _: ~* c
  38.     //}6 J/ U$ o& W( |! b; @5 T/ b
  39.     //if (a4 == 1): u$ A3 d* R+ U- n* Q; n" e% x7 j
  40.     //{9 P, Y$ S: ^8 L: b6 l8 G  |2 t" t
  41.     //    v16 = 100;% y9 a, S& a. F- D6 c1 ?$ v, Y, k
  42.     //}. D! m* N. S3 ?! _' ~
  43.     //else if (a4 == 4)# v6 g9 R8 `2 K, \1 ~7 f9 u
  44.     //{& I- }$ F+ P" W0 D
  45.     //    v16 = 700;
    # J$ n: O, D' O! f$ A
  46.     //}
    ( z7 s7 K6 e0 _! D
  47.     //else! O/ ~. V6 o0 }
  48.     //{( z1 g1 ^7 j+ |, B1 K$ m
  49.     //    v16 = 400;/ O: i* B  S# W- [" h; r
  50.     //}
    6 O  S' S8 @% V/ [5 |$ W. S( l8 T. p
  51.     v10 = 1;
    7 @* k) d5 Z; d/ U8 A# H
  52.     //switch (dword_4AA490)
    . `* ~1 b; E% V2 W; [
  53.     //{
    2 E; O# C; {, E6 J) y+ \9 E7 l" r& r
  54.     //case 1250:
    , [0 [7 C5 b5 g, o! z* J" M
  55.     //    v10 = 238;
    1 _/ O: L$ v# @; C2 e! f4 N
  56.     //    break;, T: X! M3 Y7 i3 s2 Q) P* Z
  57.     //case 1251:1 d/ t3 M4 t9 Q9 G: E$ p
  58.     //    v10 = 204;
    - I% u0 `5 X) X0 }/ i' ^" T
  59.     //    break;
    . A' Y) T+ \. g4 e6 }2 }5 l; M
  60.     //case 1252:1 Y4 ~& s/ m! T
  61.     //    v10 = 0;
      W! y; M5 p- `5 ]% G+ X
  62.     //    break;
    4 a/ m( n& X3 U  R9 s% L1 Q
  63.     //}0 n! v3 [4 \  K2 j  z
  64.     v15 = glGenLists(256);( K7 q- b9 D# ?2 P/ n& {
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");5 U5 j/ ?3 e1 j: y$ p7 R
  66.     //if (!v14)
    5 ]6 W! F# Q* Q  v: L9 i! _
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    4 n' O# X9 p- u+ L% y
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    ; t5 d: W/ s) U/ |% t  i9 p
  69.     SelectObject(currentHdc, v14);) l; Z. U4 F! A- j6 p
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    - m$ |! f1 j( Z. Q

  71. " F0 C5 |# U" k3 C' b8 j: J  P; p
  72.     //v12 这次出错4 l5 u- u% m' k% f6 w6 d5 m
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);& t6 \4 l9 p0 Z+ ?% B8 P1 r
  74.    
    . {0 r& J" X% K
  75.     //*(_DWORD*)a2 = v12;
    + \% m: c! D( R) U2 {" Q+ `  D
  76.     //*(_DWORD*)a3 = v13;( h& C% _- T2 K0 {' [3 w+ Q4 n- W
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    2 j" y; x" c. ^" p6 m; R
  78.     //if (!a9)
    ( K8 N$ U4 l3 c: k7 J
  79.     //    RemoveFontResourceA(lpFileName);$ s$ {4 L8 n* k" j4 V$ N- {
  80.     return v15;, E' x$ k2 C' G
  81. }. ?9 _, V( }7 v( |, _; [$ f; R0 l

  82. 5 ?( E0 U5 Y" W$ \4 B% G  v. I2 c# ]' A
  83. //使用到
    " y4 o' Z& H1 e1 m+ P
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    # @1 K/ j; m1 m6 `
  85. {* D" H! f  m- y4 P& \6 i
  86.     HFONT h; // [esp+4h] [ebp-8h]7 X* M: i  e5 S
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]- Y( V4 i% y, V' q7 N* K1 B9 q$ ]3 l, p
  88. 2 N1 ]: Z, j0 m5 h0 k
  89. ) {& }. i9 B* O$ Y3 J- I
  90.     __asm pushad;/ w, T  n" v7 G
  91.     FILE* trace = fopen("font_trace.txt", "at");
    2 b. P4 [+ g9 H! m% }5 D* z. O' b
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    9 s$ F- a- m. n+ H% h! O
  93.     fclose(trace);& T# B  F) \* ~  E
  94.     __asm popad;
    $ I. j7 b0 ]2 r  A1 m8 P" m5 J
  95. 4 ^2 g- \+ ^: R4 u
  96.     currentHdc = hdc;
    ! [' ~. ~4 g+ d1 h1 H
  97.     iCharSet = 1;
    1 ^$ A/ r5 }% \; A" v5 J
  98.     GLuint base = glGenLists(256);
    + K. J# c0 s  y* i! m
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    * l- |+ W9 i! O% `
  100.     //if (!h)
    + I( G: H* z  p, p
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    6 i1 ~/ M* t* y4 H- b4 L$ f! M
  102.     SelectObject(hdc, h);
    / _5 B$ s# L0 C1 r" Z
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    " {4 k6 h5 H' k5 w6 J5 y6 U
  104. }
    ! o. G1 k. ]2 c& a8 U
  105. " C! r2 l  H6 D+ |
  106. void __cdecl2 |; N3 p1 n+ B: S& h. h
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    8 [7 s9 X+ R' a, p
  108. {% k4 B0 i" c$ u" Z8 ?/ F! z% z
  109.     __asm pushad;$ L. H% E% o6 ], M  x; l: J
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    - s3 G0 e% C- h! ^# G& s
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);5 p2 [2 n3 n! O4 q2 K
  112.     fclose(trace);
    % a' z  O8 x2 g0 q# A# H! Q
  113.     __asm popad;
    % E! P+ d0 R( E
  114. & b& z9 Q  f, R- k, B/ Q) K( x3 l
  115.     //return a1;( {+ h0 r* c! a' v6 h0 H) K3 H
  116. }
    8 S( V" S2 X  o& a
  117. / @1 Z  o$ f8 q$ L( l
  118. bool
    + U9 I2 `$ a! Q9 K
  119. ApplyPatchNibiru()
    # g- X; [1 j# k: }
  120. {" q' c5 p) g% u" S
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);! r+ ]% j0 n: C' W2 D( W' \4 R
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    ( O0 }* [/ ]8 p
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);- E$ b5 U1 V; I7 a4 H
  124. . i0 D! J5 C; T0 \' X6 D

  125.   ^2 k! p# Y) g( B; H% r2 ^& q

  126. * [: Y, l8 B$ i! r1 p8 d( S
  127.   return true;
    * E/ }3 Z5 X% \8 ?+ r
  128. }
    ' y; F) U2 ]5 |- S/ |
复制代码

6 e& J" H  s8 ^6 h( P5 q( @
8 y+ \3 X0 |- g2 m7 {$ v, A. c0 x; f0 T' s2 z) i8 d
- V2 N5 a: h( g) Y; N  D
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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