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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
, D! Q! A+ N3 h; [+ o$ J: i
  i1 d3 n2 c* a$ t/ F(nibiru.exe 772 KB (790,528 字节))
/ u4 a  G! c7 G# K+ Q  |
* `% L7 Y5 @6 f/ \3 J+ ?' A) W3 ~将sub_451390,sub_451599 这2个显示函数进行了hook.
5 M5 |: m# A3 y' V" P! \: w; p4 V确认这2个显示函数都被调用了。: g1 \' g6 t( m( p
第1个可能显示的是调试字符串,第2个显示游戏字幕。
; Q, b& i( f( u8 [! K
3 O+ d9 \0 u( z/ u7 v以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
$ Z: `8 I& C: O  [
6 u! c' D# g/ ~: Y/ h) I& s) c    //v12 这里出错( p1 [4 f! G/ q( `( H0 z
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
5 y0 N) F9 S2 j9 L# ~5 `% q$ A% }5 x8 V5 q! e3 A
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
. L, h, c8 m- k/ k, I/ ?" s这种方式显然是有问题的,会影响性能。
1 h- T/ Z  j  Y7 `在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
/ v" u6 J. o3 M2 s- |( W. _: N# b
( m! _" L; Z* J
  1. sub_451390_Font1_hk
    5 v/ r2 {! |( }1 J  x
  2. sub_451390_Font1_hk
    , i; _3 V+ t) a4 h8 f! t3 W
  3. sub_451599_Font2_hk2 S/ S6 m1 c2 C
  4. sub_451390_Font1_hk
    & m! f( w- ~' X+ e$ y
  5. sub_451599_Font2_hk% d4 ]6 q, L% L6 [1 C* M1 Y
  6. sub_451599_Font2_hk3 D- T- s4 l* W0 [! D
  7. sub_451599_Font2_hk
      e& t2 k$ P" ^3 u( _! D9 D( P
  8. sub_451599_Font2_hk. v+ i( q3 o9 J# h0 J6 z5 P
  9. sub_451599_Font2_hk
    0 s  d$ T8 N0 q' ]" {# B% C# P% p
  10. sub_451599_Font2_hk
    ' g% J5 ^: f( f1 x* B# @
  11. sub_451599_Font2_hk
    2 N/ ?* i, e6 k7 [  I
  12. sub_451599_Font2_hk
    * n( n) o% i* ?; n$ @, |
  13. sub_451599_Font2_hk
复制代码
9 r" Y1 Z8 e% `! a% p, V
代码/ ]. I* {- i( d- J" z0 F
  1. #include <windows.h>; l% Y# K! E! a. y$ V) g! l
  2. #include <stdio.h>6 _& H5 v6 z/ O3 x* y$ }

  3. 4 h9 J- I: r/ v- ~: t$ S+ V
  4. #include "patch.h"
    . X. [" g5 K% |( i# T7 r
  5. #include "patchNibiru.h"
    0 w% q# p4 c$ Z, Q
  6. #include <GL/gl.h>
    1 f- m5 k6 z- t8 A) p

  7. & [$ K+ p' l- W7 [- H9 ?9 a" N' |

  8. * I+ t2 y/ R  k  g2 c$ X+ a6 [
  9. DWORD SUB_451810 = 0x00451810;
    $ _& _3 a+ U  t! x, {( c
  10. DWORD SUB_451390 = 0x00451390;( Z$ }7 z0 P8 b5 A* N
  11. DWORD SUB_451599 = 0x00451599;
    - d: p0 f" J! y* m$ M
  12. * t. F' k  M. P
  13. HDC currentHdc;! E* P# c( [( e
  14. 6 i. P1 Y- b8 s( R
  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)! H8 J- y# u3 u. L: f' s" m' g& J
  16. {4 k% H9 Y: B# D. I7 }/ ]
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    1 s% L5 d: I; R# p
  18.     int v11; // [esp-44Ch] [ebp-44Ch]: [$ ?+ h7 i) S& ?: S$ r& s, E
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    4 }7 Z, L( E; z/ y0 h
  20.     int v13; // [esp-44h] [ebp-44h]5 u& ?: F6 w# m0 _- d# s
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    7 H: ?/ }  R3 w, s9 N% R, C) s
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    9 J/ t5 n% w3 [+ N2 ~* v
  23.     int v16; // [esp-Ch] [ebp-Ch]6 \9 _$ A# M6 b, U
  24.     int* i; // [esp-8h] [ebp-8h]
    * V+ r. \2 u# h/ g! S  B
  25. 9 B; }* F4 u! P) H! m) ~) h# P% X
  26.     __asm pushad;4 z" [$ _: h4 L7 X" {% ?, B, K
  27.     FILE* trace = fopen("font_trace.txt", "at");- b4 l/ j% Y# q2 Q5 f9 |
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");& _) M* k2 T! F) L  ^' O2 P" C
  29.     fclose(trace);
    5 i& H7 Y" B2 C3 @" s& O3 B3 J; D
  30.     __asm popad;. |6 N1 r- J) L% s  f7 G0 K& q& R
  31.    
    , T% t( O; i+ N" w, a
  32.     //if (!a9)8 `" N$ x, L7 I( i2 ~# j
  33.     //{
    7 R2 m* o5 }3 `0 Z: {% ]/ ~6 e
  34.     //    AddFontResourceA(lpFileName);& o1 t% J# b* B6 U# P
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    , ]* l( b& ^0 J5 }; k
  36.     //        ;
    ' @: \! Y, X6 o6 v+ z: V7 u
  37.     //    *(_BYTE*)i = 0;+ l( o8 u( {! Y3 @
  38.     //}8 h8 r/ Y6 G8 Z/ a0 y
  39.     //if (a4 == 1)
    : v1 Z7 |% L# r' h3 L4 _
  40.     //{0 {  }( `; _  Z6 X" ^% @. f
  41.     //    v16 = 100;# P" y) l) W5 {" i. k
  42.     //}
    ; U" [4 N1 |# }/ D, g0 P
  43.     //else if (a4 == 4)
    3 o9 l% m( o3 C% W% O3 t6 X' m
  44.     //{
    ( W" L* z; s* B4 E9 Q' m
  45.     //    v16 = 700;- `6 M2 ^/ O5 c9 \: ]: x3 N6 U
  46.     //}
    1 P3 ~/ S8 Y8 r
  47.     //else) e- o& g0 ]2 ~; M! `6 A/ }/ q
  48.     //{. `0 ], p& P" e5 n* i, X" Q
  49.     //    v16 = 400;" |3 o$ G! C$ h0 z& s+ [! a
  50.     //}
    1 k, U4 ]" O, ~" y9 A4 E
  51.     v10 = 1;/ D' h2 f. {0 r: X0 D5 c
  52.     //switch (dword_4AA490)
    $ h) w- m. w$ y- P/ c0 ^
  53.     //{$ }+ [% Y& c3 e6 B* S3 L2 i3 R
  54.     //case 1250:
    + K6 W* }5 T' M
  55.     //    v10 = 238;
    & J% ?) R! H  |9 g- `4 d
  56.     //    break;
    - b% Y$ N7 [% Q) M
  57.     //case 1251:* x$ s! ^; ~- Y$ P
  58.     //    v10 = 204;
    - Z2 z+ g4 g. @& K% x2 \
  59.     //    break;
    5 M6 o9 Q& V$ u. i( ^% u! Z2 ^9 }
  60.     //case 1252:
      W$ O9 h3 {/ i- v
  61.     //    v10 = 0;
    3 i; W+ g1 z1 u6 o  s# L# j6 b
  62.     //    break;7 T" E; `" `) r
  63.     //}8 b! {, I. ~' R; g4 ?: R
  64.     v15 = glGenLists(256);
    9 M4 d/ y7 M% F) @$ Q5 t
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");9 Q/ S- t2 S6 r9 D$ |! h
  66.     //if (!v14)" R9 l9 |  Y2 a! S$ b- b7 _, P$ P
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    * r! `- |2 b- X; i0 M
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ( o1 w* o' O9 v/ D8 L7 F1 l
  69.     SelectObject(currentHdc, v14);
    ( W% A' f2 P# C/ E; h2 X
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    2 @) C8 F+ ?! T6 K4 ?# ]5 `8 K& _

  71. $ Y5 |; Z* c6 _# G
  72.     //v12 这次出错! F! N  s# l6 p! G9 r
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    2 u6 Q4 B4 T7 j. f
  74.     % D1 A/ \" E" h: N. F/ ^
  75.     //*(_DWORD*)a2 = v12;# o* [6 Q$ O* j6 I. X' s/ r
  76.     //*(_DWORD*)a3 = v13;
    ; t2 J* l* J7 \' W8 M  u
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    ; B6 C. F( s; Q6 L
  78.     //if (!a9)
    * g+ r2 v8 @  M: F
  79.     //    RemoveFontResourceA(lpFileName);
    . [5 X! ?. m7 s2 v/ N/ `- O7 ~
  80.     return v15;% x% P+ j! c8 j) S0 g/ w4 L2 s& m
  81. }
    ) F: ^, A3 s, w# m* d
  82. ! X- E2 V, E' W3 _  J  \
  83. //使用到
    8 I6 B4 g' [; I5 I$ i/ X; n
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    ' T) c/ C) g6 B9 Y6 Y! l
  85. {
      d3 G$ o8 H' w' e9 q) n' g3 l: i+ I
  86.     HFONT h; // [esp+4h] [ebp-8h]
    / @7 @2 I3 p0 @$ s, y2 p
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    . D) S+ c. y2 r+ b

  88. : |8 g; r- ?7 }5 i
  89. 6 |( v& ^6 b( I
  90.     __asm pushad;0 U- V1 _% U3 _. D9 ]$ d
  91.     FILE* trace = fopen("font_trace.txt", "at");0 g" A  a8 N% M7 Y1 ?' b
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    ) H" [# M# e1 \9 T
  93.     fclose(trace);
    0 K" ]2 E, ?: Y4 [2 i# T* R6 b1 O; `
  94.     __asm popad;
    ; ?1 W, D8 v4 _& R( E
  95. ( G' H* ]7 y5 E, H
  96.     currentHdc = hdc;8 Z3 o6 U$ {$ B5 g/ |
  97.     iCharSet = 1;
    " l5 G* l6 }* X$ s1 Y& X; ^8 y9 r
  98.     GLuint base = glGenLists(256);9 J: b- k( n! F, X
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");! S$ h; w/ q: n4 G+ w! J
  100.     //if (!h)
    $ u5 m6 I5 [' B7 `- Q7 I( E
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
      I0 W2 [5 P0 y% F6 o
  102.     SelectObject(hdc, h);
      d0 i- q& l' X; ]
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);+ }  B  D/ a% h5 D
  104. }5 T/ h! Z$ t7 E$ b; I0 m$ K0 c
  105. ! [& b! Y, c5 h: W5 ?! l; G
  106. void __cdecl+ M3 Z: V4 R* j! f$ ~" h
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)* n7 f5 s$ b7 k, M- [
  108. {$ |( \! V& p9 ~& _& u- N% l
  109.     __asm pushad;1 h' @# o8 r6 v* `% i9 ?. C* k( d1 B
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    " N" w- d# x8 b: B  j, j' ?9 Y
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);/ d) P& v* ]2 ?" _& h1 I
  112.     fclose(trace);
    . ~$ C% J; j) N: {
  113.     __asm popad;8 L, T/ m) F7 Z8 ]

  114. ! J6 S1 {; V/ Z1 X
  115.     //return a1;
    ) {. P3 H# ~/ C6 y. ]! t9 g
  116. }1 `1 H& \0 F3 B( W+ }: j5 [
  117. % a( x" T' ~# Y6 S8 G
  118. bool
    $ v0 b: {6 P% ~! A  c
  119. ApplyPatchNibiru(), j# I" c; p2 i
  120. {
    5 c0 ]( N" H/ P
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);! c6 i& J7 B* \- h9 h- S
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    4 W7 M# o  U+ q& @: O$ l. {4 z  f
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);4 k8 u2 X4 v1 T

  124. 3 O3 @* y/ Y3 K6 ^: @1 H9 P  P8 [9 N
  125. ' p+ |, o4 p* R  o* G1 X( o
  126. 3 `. a* z5 k5 g$ g4 X# P
  127.   return true;( i+ K5 `# F) b/ b: M! d
  128. }3 h" ^( m. W3 i% Y3 p
复制代码

3 a4 d( t) |8 F2 {
" i* _; h5 e6 Y0 d
, Q# A1 K  s- J; I1 K" \! S
# b) O8 Y- _; j9 j- M$ v8 S
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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