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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
: @; `7 [1 L% W  x2 D1 z* x. R6 O+ J- @3 J# b1 p/ t1 ^" d0 x
(nibiru.exe 772 KB (790,528 字节))
' m6 Z0 j' U: V
; A1 k" @) L  o- b将sub_451390,sub_451599 这2个显示函数进行了hook.- H6 s* i! x1 w4 O" ?, v2 W! h
确认这2个显示函数都被调用了。
( i* `7 |( x0 {8 G& e5 J  @8 O第1个可能显示的是调试字符串,第2个显示游戏字幕。
# C4 p( C! b1 p# j0 U3 W: O1 e& ?: E: b: @. C9 t
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。! T+ {* R0 x* I! \- ~

; l& f3 \* c$ d    //v12 这里出错
0 N# J$ `8 u, [" o' x, c    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);' P* ^' [% A- b, H
: H  `# T) g! e5 `3 d/ A: F8 I. W
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
5 k5 j( z3 D- K0 F3 B这种方式显然是有问题的,会影响性能。
% Q/ Z+ o1 d) v3 ?2 x6 v在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。. Z+ a7 C. n& |/ {; \4 R6 n& Z& p1 u

; ]& U: |5 u# q
  1. sub_451390_Font1_hk
    + c# F/ o5 k7 O& O- o# m* \
  2. sub_451390_Font1_hk/ Q4 F. B1 `3 c! O* W
  3. sub_451599_Font2_hk
    * i9 A! O! R5 k, m4 W& l
  4. sub_451390_Font1_hk& b5 b8 O  X/ o' \
  5. sub_451599_Font2_hk
    2 v/ t4 O- U) ?4 ?0 _8 e0 x
  6. sub_451599_Font2_hk; o) ^! L3 w" N" m! J
  7. sub_451599_Font2_hk
    , j. \7 p- T1 s2 U
  8. sub_451599_Font2_hk4 |& |+ {% r% L8 p. {; _
  9. sub_451599_Font2_hk3 K: u% f6 H+ d) y; N6 ~
  10. sub_451599_Font2_hk; _, s8 a# Z* {9 d" X. O) `
  11. sub_451599_Font2_hk
    . F/ D5 i" {3 b; ?. A+ |( j
  12. sub_451599_Font2_hk, D" K7 o; u9 f8 n
  13. sub_451599_Font2_hk
复制代码
" M# u9 M3 ^3 P7 J! {3 w2 w
代码. m! e7 \( H( s# o6 U5 r
  1. #include <windows.h>) _2 t9 i  M, z3 l. Z3 M
  2. #include <stdio.h>. ~4 W1 D0 K/ Q. i+ N

  3. , ~. Z: p" ^  k6 j! F
  4. #include "patch.h"% g( i1 z( T9 J; p3 G( e5 i! Y
  5. #include "patchNibiru.h"
    ' S; a5 p6 E, `2 {' F+ j  F
  6. #include <GL/gl.h>, K7 e) z  o, S9 D2 I7 x
  7. 3 `, r4 w- ]9 u* u

  8. , W4 D" V7 Z4 r4 h, g' w1 G
  9. DWORD SUB_451810 = 0x00451810;
    / K4 D) t4 C% @2 W
  10. DWORD SUB_451390 = 0x00451390;3 h9 h: T* R. C
  11. DWORD SUB_451599 = 0x00451599;
    8 A8 K1 M- k9 d! h# }
  12. 7 I1 ?6 d* }/ F) D; m* A& l; h( c
  13. HDC currentHdc;4 P8 U* d; I( w- o7 u( ~" x

  14. - T; s, V, k! Q1 Z; I
  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)% I& G# ~' ^( _, `8 _
  16. {  D+ s6 V, H5 q- ^+ o
  17.     DWORD v10; // [esp-450h] [ebp-450h]$ \4 I2 A/ W& X7 N* f+ w/ f7 I. g3 t, P
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    . c0 ^4 M0 k! M) I2 R: o  Z
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    0 |( u- R" n, G- `
  20.     int v13; // [esp-44h] [ebp-44h]
    - v% J$ @3 S) M& k
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    . M# x3 [2 }7 h: `
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    3 K2 j1 T/ n) D, Z$ u
  23.     int v16; // [esp-Ch] [ebp-Ch]
    : T$ f& D; \1 G% ?9 `
  24.     int* i; // [esp-8h] [ebp-8h]
    . C5 O1 d3 U6 {: [9 N3 X" \

  25. ; Q2 x/ M# j8 X6 O' ~
  26.     __asm pushad;
    : K- Q( A/ d' y9 O5 O, r; v
  27.     FILE* trace = fopen("font_trace.txt", "at");% N+ h6 N+ K) f: b% B: @/ @3 w3 F
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");* n' i; w' Z. I$ l) K0 f7 P: k
  29.     fclose(trace);# d5 y, ~8 H" K) R0 O5 M" u
  30.     __asm popad;8 [& X. N+ W( c/ R/ }" h
  31.     ( Q! P* a3 I5 `* ?
  32.     //if (!a9)
    9 F) f7 d% Z9 F8 _
  33.     //{
    & O- Q) M8 o$ [3 g+ Z: N& T
  34.     //    AddFontResourceA(lpFileName);
      `. S8 y7 F* v- e( p
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    ) |' _) O8 U; F4 S; w
  36.     //        ;
    ( e2 n5 M* d9 E1 ~! _/ L! l: |7 e
  37.     //    *(_BYTE*)i = 0;! M2 J( @4 w" A
  38.     //}
    - |4 e+ l. b  a. _& C* z; U
  39.     //if (a4 == 1)
    1 F0 L: H  f# P
  40.     //{+ L  _" |! _& V/ c- R
  41.     //    v16 = 100;! R. R9 D- w# C2 q
  42.     //}
    / u: M7 E, M, T% G0 r* k
  43.     //else if (a4 == 4)
    ! |6 ?8 v$ G/ [: D2 J; E
  44.     //{/ D  s! \- M/ q: W
  45.     //    v16 = 700;
    : v; R6 [+ K/ C5 H, Q; N* G
  46.     //}
    * d" {: Q+ ]3 V: ]: k
  47.     //else
    * }( M; a/ J; f) R
  48.     //{
    6 K' _$ u) A. m+ ?1 n: r, r6 r
  49.     //    v16 = 400;' V' q- n) y. t& p' r
  50.     //}
      r. J8 b, z# T( B5 \6 Q: L/ s* a
  51.     v10 = 1;
    8 X6 p4 o1 V  R* z2 i3 e
  52.     //switch (dword_4AA490), ]' i9 e9 b, ]! u" G5 Z
  53.     //{& n; ~: C1 d% r
  54.     //case 1250:
    3 |4 W, m: X& T. K- C( e. ?
  55.     //    v10 = 238;( y: `* X, x! j: F& H. l6 J( S8 v
  56.     //    break;0 J; R7 U9 _4 P8 s$ _
  57.     //case 1251:/ Q8 Y; F: ~# V$ s
  58.     //    v10 = 204;
    ) [6 Q  P( q, J6 J" y
  59.     //    break;- b, P' H# J, K( F; b" k& s4 Z" i
  60.     //case 1252:
    ; \& R7 k" \# d/ N0 a
  61.     //    v10 = 0;' L1 Y8 j9 |$ p7 K! [- @
  62.     //    break;8 p: N9 G$ W6 G& x
  63.     //}6 p8 E  ^* y' O
  64.     v15 = glGenLists(256);
    6 R% t: d+ @" ]" E
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");6 \* A4 o6 ?. H  n
  66.     //if (!v14)
    6 n$ }0 I: L' O* G" e& Y
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    : q& B& ^$ N! K0 b! W- l5 a, w) d) _
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 6 K3 b, C6 y1 L/ z+ ?
  69.     SelectObject(currentHdc, v14);
    : n# x& ^$ W( \% g0 f
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    9 T' p' l3 z0 A5 N  @- x
  71.   q9 r; t8 U6 [# {! H/ G' @
  72.     //v12 这次出错
    ! m$ R  G8 w3 Z; q/ h( f/ V8 {
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    + @2 L/ ^* r4 x; z+ s
  74.    
    ( o- ?5 o( N/ h/ ~% B
  75.     //*(_DWORD*)a2 = v12;7 b  ^. b1 J; x, d+ ?  x. C: y
  76.     //*(_DWORD*)a3 = v13;
    1 ^4 S1 h  o" c
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);! P" f0 L! w) a3 i1 f/ k
  78.     //if (!a9)
    - c3 \1 }' F: ?
  79.     //    RemoveFontResourceA(lpFileName);
    ; r! R) X; m% L/ Q
  80.     return v15;) P" g6 n4 Y7 w! I
  81. }% B0 a7 k* B( k0 O( V4 v

  82. " a2 M" W* K7 T( V- r+ b
  83. //使用到4 M2 B6 V! D3 C6 Q
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    0 M# s/ D# l8 A' ]% x8 v) Q. Z
  85. {" U9 b9 ]% d" B) m  t
  86.     HFONT h; // [esp+4h] [ebp-8h]
    0 V. @# A* _* Q4 N# J
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]! m& P: z8 c, x  z6 c- U/ s- P! T

  88. / c) Z/ B$ K3 I+ ]; r

  89. 0 U5 }2 W; J& N0 L
  90.     __asm pushad;
    ! G7 q) Z8 j% m: w9 u; S
  91.     FILE* trace = fopen("font_trace.txt", "at");
    + f' g, A9 Y: c8 z& X
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    ' w: R3 v1 d" g. j- d- Y
  93.     fclose(trace);
    & e0 X2 c+ h% e2 ?
  94.     __asm popad;; u! t" M1 ^5 T
  95. ( n, G3 _/ E! x: `
  96.     currentHdc = hdc;
    ) I# S$ [6 ]# o
  97.     iCharSet = 1;
    2 o6 j% Y3 |( Q8 ^, i% E) i
  98.     GLuint base = glGenLists(256);9 @. T2 ?$ X" \, e' x1 q6 z
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");, t/ z, S) j3 G4 i
  100.     //if (!h)8 u' p% Z4 _6 b- N3 w) w* s7 q0 r5 a
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    5 @0 B4 j5 q/ M8 I
  102.     SelectObject(hdc, h);
    9 w2 F6 k% L9 t0 e; d* w# I! {' d
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);  H8 T2 e/ s6 I# f8 C0 |/ @
  104. }
    % {% }# e2 U( J) S* |  X+ l

  105. 0 t+ w5 R; Z" y0 Q
  106. void __cdecl
    0 V! E5 ]2 _( I7 [
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)8 w! X% D/ u% l9 }, e  X7 C! S
  108. {0 f# C- y3 J7 l1 q
  109.     __asm pushad;% l' X/ m8 N! u) E
  110.     FILE* trace = fopen("sub_trace.txt", "at");! o' R; i, X8 I+ n5 B! f0 K
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);7 [  _  a; f& m6 [% v: Y
  112.     fclose(trace);
    5 c0 `% ~% L& }0 c% U0 `& p+ Q
  113.     __asm popad;5 r8 Z/ O2 v8 H
  114. & ^& b( X5 a& |5 v
  115.     //return a1;% r! m0 A" R$ O7 O
  116. }
    6 }( c5 v# k- y( j3 c
  117. 2 G$ t; j- {7 U* F9 E5 l; N
  118. bool; r% J. s! V3 q1 u3 `( J2 I" I! p1 P2 h
  119. ApplyPatchNibiru()9 E& U- [, p4 A' R
  120. {
    : S9 a( [* }) J
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    6 T; z/ o2 P9 a9 D( n
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);9 S- {. }) J( i5 M
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);" {" @5 ?  V, |

  124. ; W2 B' [- a0 l! A- t4 A0 D6 _
  125. ; R. H; k4 m. ^
  126. ( x* Z8 G2 ?, ~9 y' Z- }
  127.   return true;
    9 {4 ]0 q: s- g3 R5 l2 b
  128. }& ^2 t- i) B- {6 ?) z) {$ w2 }
复制代码

: W- h7 w& n$ a( r1 l* Q
: c- a9 `0 ?% j4 s3 j0 S. B. R5 H: j3 p0 Y/ |: k1 p+ C0 Q
+ v- {! Z# ^7 X6 W3 q4 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2025-4-12 16:40 | 只看该作者
学习学习一下
回复 支持 反对

使用道具 举报

高级模式
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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