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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 : j9 m" b6 z# h

- l: b4 \) h) s: @9 a(nibiru.exe 772 KB (790,528 字节))+ {- Y: `* E3 Z. j) Y; N  d& [

; o0 A$ c2 R) E1 s1 r6 [将sub_451390,sub_451599 这2个显示函数进行了hook.
8 y. i0 C, W( l+ j确认这2个显示函数都被调用了。
. g5 y1 j/ }" U. z/ Q2 o1 D第1个可能显示的是调试字符串,第2个显示游戏字幕。
! i+ P1 S! c5 @: e% t. S0 N+ j4 `5 G, [0 ]! ^( @# @3 C& O; C  i$ z7 ~
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。* l$ E, \1 o: s

! T+ j8 l5 F* b. n  M+ p    //v12 这里出错
7 f9 r6 H3 n/ p, S7 w& Z+ p$ t    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);7 Y8 {+ i  u2 i5 ^! z6 T

" Y+ z- s( d! {' Q" ^8 E  ]( S输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。+ a/ i. i* l3 l
这种方式显然是有问题的,会影响性能。8 Z7 n9 H8 e$ }3 Z
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
; |! a3 g6 ]! h/ {' a+ R$ b# u9 l: c2 d- M) N
  1. sub_451390_Font1_hk
    # E( q5 w9 o0 x
  2. sub_451390_Font1_hk0 Z; w  X7 E- ~/ G  ]6 a
  3. sub_451599_Font2_hk1 x$ S+ }* q2 q3 H7 {. m0 r7 {
  4. sub_451390_Font1_hk
    ) N2 P2 ?0 _5 L1 y( [
  5. sub_451599_Font2_hk
    , T( r" O9 k: M1 x! L: _  y
  6. sub_451599_Font2_hk4 X# h, A5 g, i4 _3 H
  7. sub_451599_Font2_hk
    % E; N0 ^& N5 J! j/ e
  8. sub_451599_Font2_hk
    8 h$ T5 o( a$ ], `9 T8 B( U: n, k
  9. sub_451599_Font2_hk- j( J2 H8 `3 w) A# ^
  10. sub_451599_Font2_hk
    ; J" e# B+ ^! W1 s- y
  11. sub_451599_Font2_hk& z5 Z- F+ e( O% n
  12. sub_451599_Font2_hk4 f9 l8 p* p- o3 k1 _2 c( U( P8 L/ P' q
  13. sub_451599_Font2_hk
复制代码

% s0 Z, D" _4 ]# C代码5 X; ~9 C! g& O7 V( j
  1. #include <windows.h>
    ; _' P$ ^6 `/ G! T+ |
  2. #include <stdio.h>
    3 G+ i3 z2 u) o* Y- E9 V
  3. 6 F  s# y$ v% m( j1 j+ C4 y
  4. #include "patch.h"0 j$ ?! a5 F; ]/ X% s
  5. #include "patchNibiru.h"! Y4 h8 ~5 c# |4 A0 c, X
  6. #include <GL/gl.h>
    + f6 [$ \- ^$ ^( l, S

  7.   d( X* X" v, A( Z
  8. 6 I1 {$ @) O9 ~9 y8 u
  9. DWORD SUB_451810 = 0x00451810;0 }% q' L% _( K9 x8 }; _
  10. DWORD SUB_451390 = 0x00451390;
    0 b/ Q  i0 h# X
  11. DWORD SUB_451599 = 0x00451599;. a+ f& d$ p$ H% K
  12. 8 g# P" A& t( ^5 h2 X  x9 L: L
  13. HDC currentHdc;
    . z9 `* ]% N2 v/ ^: T

  14. / ]( m4 q8 W+ ~- s
  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)" j6 d, M7 M; G0 r. N( e4 E/ O
  16. {7 o* p! m8 F0 H/ ?6 U* F9 U. a
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    * r6 E) y. X7 C6 f& ~4 G! K4 x
  18.     int v11; // [esp-44Ch] [ebp-44Ch]' ?# B! T0 N+ E" p2 O  e# O0 e7 y
  19.     int v12; // [esp-4Ch] [ebp-4Ch]# [" ~% d. d: j1 [& X3 a
  20.     int v13; // [esp-44h] [ebp-44h]
      `1 U1 p# N- A9 j$ ^
  21.     HFONT v14; // [esp-14h] [ebp-14h]9 V; d8 c4 h7 {
  22.     DWORD v15; // [esp-10h] [ebp-10h]7 c9 X* x5 W5 Z' B) x6 ]1 N* I# j
  23.     int v16; // [esp-Ch] [ebp-Ch]4 T, j( N  j; w  F0 `
  24.     int* i; // [esp-8h] [ebp-8h]4 Y+ i& Y2 [8 d% t/ x5 T$ m

  25. 2 N6 _4 d8 i" U$ [5 ~
  26.     __asm pushad;9 w" s  h7 L* S8 F8 {, v( S2 W" e
  27.     FILE* trace = fopen("font_trace.txt", "at");( ?" Z( x  O% u; Y& Q0 k
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");' c1 t7 x/ u, I3 ^
  29.     fclose(trace);
    : ~- h: M4 y' w( X8 u
  30.     __asm popad;
    ! Q! }  t& O5 @% n4 A6 ?
  31.    
      n' v3 |+ B" `9 O# o  e
  32.     //if (!a9)
    * }' W) s7 S. H
  33.     //{
    " v/ X0 F% L- N2 X" Y
  34.     //    AddFontResourceA(lpFileName);: ^) b3 u% x8 u  B% V
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))& y2 M- A) m' u: w( L
  36.     //        ;! v+ t( v, t; n8 v
  37.     //    *(_BYTE*)i = 0;
    ) J9 X9 [0 S1 c1 t
  38.     //}# X$ J9 L! R$ E5 n
  39.     //if (a4 == 1)
    7 M; A3 J9 r2 S$ ?- e
  40.     //{
    : L. J' Y6 \6 T2 d7 @8 A
  41.     //    v16 = 100;+ s. b- i' X; X" t" s( x
  42.     //}
    8 j9 h% V. O: L1 \) L4 n1 ^. j
  43.     //else if (a4 == 4)
    # \1 V( P( O; i: E- {% V: U4 c
  44.     //{
      }& u- M6 W/ J
  45.     //    v16 = 700;
    1 G+ \# A8 k( _7 F# B( M' p
  46.     //}
    ( F4 J8 H* b( B; p0 i5 t
  47.     //else
    / _* W% V5 S1 p* {5 r1 r
  48.     //{  S( V: y5 _* c6 Q
  49.     //    v16 = 400;' l, M4 l+ \  J5 _) K& h! v
  50.     //}
    ( e4 q; A  R4 ]1 L9 f
  51.     v10 = 1;2 x  W; O  v8 \' G$ w* e- Z5 ^( \
  52.     //switch (dword_4AA490)% ^2 M8 @7 ]! Y; Z, `
  53.     //{$ ]2 n% X8 x* T7 G
  54.     //case 1250:
    * E  J: C' J2 g, a  @4 }, F
  55.     //    v10 = 238;. G% v3 ~* I# ?% N% w. x! E
  56.     //    break;; C- w+ z  A, u$ X
  57.     //case 1251:0 J7 m2 k6 N/ j; e2 d' |/ x1 d( G
  58.     //    v10 = 204;
    - x! J1 y- F0 [$ i6 f
  59.     //    break;
    ; Y/ M. g' N! w0 h
  60.     //case 1252:5 b) c* w, V: ^% k
  61.     //    v10 = 0;* O) G+ y! `9 i$ {/ Z; _
  62.     //    break;1 k8 T+ e! M5 V& n' c
  63.     //}, k* C7 }/ m- N7 \- |
  64.     v15 = glGenLists(256);" E+ h4 H+ L: f
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");8 e+ L7 c. q  [$ B0 Z: G/ [: K) i
  66.     //if (!v14)
    5 o( P9 ~- ?; A, x) v
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);4 I3 E* z' r0 A+ Q; r- o4 X0 p$ ?
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 7 \# T. W/ e, O) }$ K& r+ e
  69.     SelectObject(currentHdc, v14);
    ; [% |7 B/ c# n- G
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);# I9 ~4 x! G/ p

  71. % t, ]# _/ s( ]
  72.     //v12 这次出错0 Q2 ^/ X8 p" v2 e. H9 w% s- h
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    , a( }  J/ R3 K7 Y
  74.    
    $ }+ ~/ K7 T5 R6 b. D9 G
  75.     //*(_DWORD*)a2 = v12;
    5 c  p* G7 m! Q  s7 _) \
  76.     //*(_DWORD*)a3 = v13;
    & }4 B7 z! U2 _" k4 Z
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    7 r; n9 _& V6 F+ n5 d* _: K
  78.     //if (!a9)5 q) @9 e+ ]/ j! D
  79.     //    RemoveFontResourceA(lpFileName);
    # j1 }4 l8 A% B5 q, ?2 o( b
  80.     return v15;
    5 B3 _) ]  C" K" R! ]
  81. }& R) H# e  s% ^) ?# n# P* i
  82. # t. O- B7 C# K$ C8 R$ x, B
  83. //使用到
    " h" y" k/ q% ^4 }4 v% Z/ s( s
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    # @' X( B9 v( b, A' f! B
  85. {, i& C. }( x- v+ L* @6 T# q
  86.     HFONT h; // [esp+4h] [ebp-8h]
    ) s( H* S1 Q6 q; n1 _5 P0 P5 g
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
      b/ M* k: J: b% F/ T
  88. ) S& {8 \! P1 ^& m* F  V

  89. 8 d# h7 l$ m" A) B) |% k
  90.     __asm pushad;  J2 i& |" ]& c, N" t( V. n. x. P
  91.     FILE* trace = fopen("font_trace.txt", "at");
    : W. i' E7 a5 T" P2 o4 }
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");% }% U2 ]( l9 q9 c( X3 K& g
  93.     fclose(trace);3 S- G5 `! _( q/ ]1 W1 b$ L
  94.     __asm popad;
    " e& M% ], ?" k' P: |# o# R: w4 L

  95. 6 ~/ n8 r  g& @" `: R
  96.     currentHdc = hdc;1 }  b6 v2 ?+ A# A& |% O8 @) |0 E1 D
  97.     iCharSet = 1;. z, f& @9 X4 w" g
  98.     GLuint base = glGenLists(256);
    & Q% G) {/ w  A; e: p- A4 N
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");2 f/ i; ^  Z* q
  100.     //if (!h)% a6 H( R. m) V1 w/ j3 m
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);+ S, H4 }! j  S% f8 O
  102.     SelectObject(hdc, h);
    2 F8 ^* z0 v0 G- s. S
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    . ?7 ?, W% j7 }% V- e
  104. }
    ( [3 D+ f+ [) G2 T" X. ]8 {
  105. ( I- S) T. {1 d% b% ?
  106. void __cdecl6 F4 ~2 g  o0 Q$ _0 L
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    6 V$ q! h' ^. r+ b3 ^
  108. {  Q; v* q9 z. y" w  P4 m& g* x
  109.     __asm pushad;  o, F' K$ b7 G: C7 j; V  p  w# N* \4 _
  110.     FILE* trace = fopen("sub_trace.txt", "at");: z5 O: A6 j8 Y2 I; g
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);& S7 t4 F  b- l1 j* B7 Y
  112.     fclose(trace);
    - A' H6 \4 b( d$ K) F" {4 d# Q8 m
  113.     __asm popad;
    2 M/ b$ P, J+ B' @
  114. " S% |! {) i9 K4 S  H3 E* y' Q! U
  115.     //return a1;
      j: q+ j  y( Z. y5 B9 m/ B
  116. }
    * R, S( v' ~+ d7 i7 L6 r

  117. 0 g8 E8 P( t/ t: @. B* h
  118. bool" @+ j' U7 E: A$ |9 T$ ?) I+ s
  119. ApplyPatchNibiru()5 ]: M8 \. d: L# K- Y- m
  120. {
    & v6 M$ _0 p+ s4 `4 ~9 b  D) r% \
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);# v; T8 u* X, N+ G+ q9 c7 Y
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);, `* ?9 `/ U& W% G; Z( |
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    8 D( Q8 N4 N3 T! V% ~6 `! @* D3 H

  124. 2 @3 R9 s* ]5 u, i8 q

  125. 4 W) A% h+ J6 C" y
  126. $ `* N, q3 i0 n3 `% F
  127.   return true;
    - B1 E" r' j; ]. v3 _! n
  128. }
    & b  A! r5 F% d9 Q  ^9 [
复制代码
/ X) {! ~' u* u, K
7 {. ~  @" x; u
( _. u3 r9 u% F" \; _8 \

. o' c0 B9 A8 A* n
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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