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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 ( r& i$ h) j" O+ ^
- G; }/ ?5 m; S+ `3 ]5 |
(nibiru.exe 772 KB (790,528 字节))
! a' Z0 u5 i2 ?+ K
' j& n1 y2 u( J+ e7 O! M2 u将sub_451390,sub_451599 这2个显示函数进行了hook.
1 i% A; _( B4 v2 {* o7 J8 _确认这2个显示函数都被调用了。
0 w& e. u( x' K: O. C: S9 n第1个可能显示的是调试字符串,第2个显示游戏字幕。) a! U0 N. Q1 ~7 j; \" m  R% m
  A0 [3 ~/ [) f  |2 }+ I- O
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。. M2 U8 {; x2 S+ V" ?
; ^6 k' M- C# L5 p' e
    //v12 这里出错
: X" F# Y# C: F6 |+ J" R    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);$ i& g- W5 R" O. c8 }2 P" p
# X2 L/ l0 _, c: S6 n2 I
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。; ?- Y8 L6 {& P0 ~5 h" R! z. D
这种方式显然是有问题的,会影响性能。
! K7 O+ K) @+ q7 N  U在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
% w1 K! W) t* M$ U/ ^, N" d2 G8 {
  1. sub_451390_Font1_hk5 c1 F+ l* S& n! I
  2. sub_451390_Font1_hk
    ' [( R/ y& x" _2 n# p3 R" J
  3. sub_451599_Font2_hk* T% _4 S2 @% M: ?, ]& `
  4. sub_451390_Font1_hk' H: e4 b1 T) t/ x* o# o# X
  5. sub_451599_Font2_hk
    ' l# U5 z$ K- s3 V( F
  6. sub_451599_Font2_hk( s0 ^& k+ M. S7 c  E% R# u
  7. sub_451599_Font2_hk
    4 Y( a4 u- _: W
  8. sub_451599_Font2_hk
    * J( |8 Q- N: ]
  9. sub_451599_Font2_hk6 k# o% A( ?  j% {
  10. sub_451599_Font2_hk
    . _, M; d( C# C$ X, e$ t, ~
  11. sub_451599_Font2_hk
    2 a6 [+ q' y8 D1 x7 L& k
  12. sub_451599_Font2_hk
    - l' l8 V, U4 m' W
  13. sub_451599_Font2_hk
复制代码
+ `$ Y- S$ Y( n1 g$ C. s) Q7 ?
代码
: p( {9 Z' K0 k  R
  1. #include <windows.h>
    ( T: L, B" E7 g* C! b& z7 f
  2. #include <stdio.h>
    1 [( d  M9 l" t+ y. s+ X8 j
  3. 5 ?2 V$ {* }0 F) k& k  Y2 ]# S) P5 b) C
  4. #include "patch.h"
    8 x/ \9 B+ C( `7 N5 P0 a1 ]; s: W$ [8 ^
  5. #include "patchNibiru.h"3 O1 L/ j+ _. V2 E4 ^  E) e
  6. #include <GL/gl.h>
    5 }( ~& Q: u( P8 ]
  7. 5 d# r; V' ?# _( Y  e

  8. 4 j8 k' R4 n# [
  9. DWORD SUB_451810 = 0x00451810;
    $ [* v1 N+ g% d4 a. U
  10. DWORD SUB_451390 = 0x00451390;
    6 v  M+ G! Q4 v# P4 V2 F& W5 c& P
  11. DWORD SUB_451599 = 0x00451599;  [% H1 j6 S$ z- h; h% {1 j
  12. 4 {0 e& G1 z1 ^/ ~) \
  13. HDC currentHdc;. E3 K( x$ @" h: t, N: ?) D9 p9 \7 x

  14. 8 a4 _  R, Q: n! u% z& }
  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)
    * i8 Q2 M/ {5 m# e& c
  16. {
    " J6 K7 \1 i/ K3 J# I/ ^. o
  17.     DWORD v10; // [esp-450h] [ebp-450h]4 |7 {6 {" B$ q7 H# V
  18.     int v11; // [esp-44Ch] [ebp-44Ch]7 |! o9 c3 G" f; a4 g5 `
  19.     int v12; // [esp-4Ch] [ebp-4Ch]( j, [8 h8 k6 i+ M6 p7 R
  20.     int v13; // [esp-44h] [ebp-44h]5 {$ p3 n( h% |
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    ' n0 ?( `* W. [4 q
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    " a, F0 `& U7 o. b  `
  23.     int v16; // [esp-Ch] [ebp-Ch]
    ' q" i: d* x/ j6 [! S! f% x
  24.     int* i; // [esp-8h] [ebp-8h]# L% d/ F) }  _# U
  25. : ]1 q( \2 I3 n: C0 m
  26.     __asm pushad;. u+ q: B: O' d! J$ `# Y: Z
  27.     FILE* trace = fopen("font_trace.txt", "at");
    % e) B5 J" A* `9 Z3 Z
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    - E0 `" k- S1 v. O% z$ Z7 w
  29.     fclose(trace);
    ) i4 }! n" m& _' n  w0 M3 c
  30.     __asm popad;' n+ C- R3 L7 }+ w/ U
  31.     6 V( i  J6 u+ A7 S9 M% Z) }
  32.     //if (!a9); [0 ~) K/ |# a- _
  33.     //{
    , D5 l) v/ a- _) O  f/ B
  34.     //    AddFontResourceA(lpFileName);
    - o0 d9 s: G4 Y- Q
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))# l+ r3 C0 y+ e: r1 @
  36.     //        ;
    1 A: i3 M# Y$ j: X
  37.     //    *(_BYTE*)i = 0;
    3 X$ d9 _+ ~, L/ b2 _# x& a+ V( L
  38.     //}$ o% s# |& F0 X# B! h: V
  39.     //if (a4 == 1)
    , Y+ @. j  I1 S( J: _2 O% a
  40.     //{+ e$ O) I5 y8 E$ S& y, a( I, y1 I
  41.     //    v16 = 100;
    : {. D. j6 {" b6 y- j' M1 |; v
  42.     //}. t  ]4 D$ U9 G# l  m, k
  43.     //else if (a4 == 4)! K6 [( c& C! V9 @0 X" `" R+ P' z
  44.     //{
    ( j% d2 h6 o& F
  45.     //    v16 = 700;
    8 t, ~6 i/ }/ v
  46.     //}; x2 C: b8 P+ N4 e1 p
  47.     //else
    : V& J5 l) U) @" T, w/ R
  48.     //{
    ) _9 c: c% D- ]& g
  49.     //    v16 = 400;
    ' K, ]" Z! O! m, l* J% o
  50.     //}, C1 ?. L# D# c, R) {. m2 h% n
  51.     v10 = 1;
    1 D! k+ D9 _) m
  52.     //switch (dword_4AA490)
    2 h* g! |7 G2 n
  53.     //{0 b1 v8 ~! F0 `- a  h
  54.     //case 1250:
    7 w' l) a! [) c! j& h
  55.     //    v10 = 238;& [4 B9 Z$ o, L2 q8 a, i, g) E
  56.     //    break;
    " H6 p% l0 v5 X
  57.     //case 1251:
    6 y* o/ o" V8 n! E3 g8 S4 _
  58.     //    v10 = 204;
    $ }5 }* ^  p* M7 K# H+ N, b- r
  59.     //    break;
    * z/ N9 E: b. O( D) a9 G
  60.     //case 1252:
    ! j* x. E! ?1 c% o
  61.     //    v10 = 0;. D% F, ^  N8 G9 L3 I+ q4 E
  62.     //    break;3 X- ~5 U/ F, P; P3 `" {  a
  63.     //}% i" m" L8 |( L- S2 H7 v
  64.     v15 = glGenLists(256);
    . M- S& p4 j! @2 ]6 S$ s
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    & ^3 ^, _* ^+ a; Q& u) {9 s3 v" k
  66.     //if (!v14)5 l# C9 }8 f4 v1 {6 o7 ~4 E
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);/ L5 T9 E, \$ Z
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; % }4 }$ }' B1 b
  69.     SelectObject(currentHdc, v14);) F$ {( [. T$ e; b' L! {
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);- q: \! |; z8 A0 ~7 z. P

  71. & X6 f9 h" S8 Q$ G+ J8 D
  72.     //v12 这次出错+ V8 F; P# C1 T9 z0 Y
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);, w' j2 {# |' p) V" M6 i7 q/ ~
  74.    
    ( E3 [$ r3 Q8 p+ Z) g8 |
  75.     //*(_DWORD*)a2 = v12;
    6 I1 N! s* U' q/ J" [
  76.     //*(_DWORD*)a3 = v13;
    ) b2 D- V+ s1 g2 ~. a, u1 m
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    9 r4 q3 S8 E! k
  78.     //if (!a9)
    7 }  D' b) Y  V; s. X# N: B- ^
  79.     //    RemoveFontResourceA(lpFileName);
      V# c* D1 ]# F8 u/ N3 F3 S4 ^
  80.     return v15;
    & R- v& Y# @6 G* J  G
  81. }4 X0 q7 M7 X1 N( l4 }$ |7 G
  82. 1 p# v6 y1 x- A" ?# e
  83. //使用到
    ) T4 [( i2 h) C& `2 p  T
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)3 l9 d' @- a: }
  85. {
    8 Y6 ?* b+ l- w" [& X1 d/ P& c
  86.     HFONT h; // [esp+4h] [ebp-8h]4 y8 C  t3 X9 N4 e
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]% _2 e% i+ I# W1 ~/ o2 H* S
  88. % t' u. R) j: H1 h! c
  89. ; K# P3 g; T  |" h$ b
  90.     __asm pushad;! t/ }3 ]5 C% V8 ], J
  91.     FILE* trace = fopen("font_trace.txt", "at");6 C8 e& h8 @5 n$ h) C" h! i4 p
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    : w4 N1 p9 ~8 M  `  C& |
  93.     fclose(trace);
    7 r* t8 W: V3 w0 B6 ~8 ]! V
  94.     __asm popad;7 a2 Z1 A2 S9 H& p2 m+ d
  95. ( Q' N8 `, i% u6 C4 m/ E
  96.     currentHdc = hdc;, ~; J; v0 d3 Q0 f9 X
  97.     iCharSet = 1;
    ! F' T/ r1 [* q7 V: [
  98.     GLuint base = glGenLists(256);; [0 _4 c  Z, L) w  A
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");1 T0 v# q  z  \$ V0 w
  100.     //if (!h)
    2 |  P% q' C) u! U
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    + Z3 M) Q  ?4 E' _
  102.     SelectObject(hdc, h);% K& s1 Q- z9 r9 @
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);/ M" _! D; G- i. D, E  O
  104. }
    $ x1 n2 W# D, M$ W* g! G3 l
  105. 3 T# C! }! X/ j1 j6 b& n* V6 |
  106. void __cdecl
    2 k7 h/ x8 }6 A6 h! n# ]
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)& K; f! @3 q) o3 _( S. X
  108. {: ]: l9 D' \8 I2 C+ N
  109.     __asm pushad;  i" A3 T9 B  T2 B1 D2 N
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    ' V. Z) i1 }8 s! _) ?" e2 H! P
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    - X( T, s& |* W. T5 S
  112.     fclose(trace);: ]2 d# A+ a) s. p! G- _
  113.     __asm popad;2 y2 u. U/ v0 a& ^& ?& o
  114. 1 H8 S4 v. W0 Q
  115.     //return a1;
    0 C: @/ s9 w8 |- l
  116. }
    , E  H: j: f8 D3 q) _
  117. 4 Q0 {% E1 Q- n4 x3 X
  118. bool7 x) k0 [1 h. w& l5 n9 ^7 O
  119. ApplyPatchNibiru()# u8 d; w9 D% i; W- F, ^$ S/ D2 x
  120. {
    ! x: E! p7 H* Y" V9 F
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);( o$ J, ^4 \8 H7 o+ b& l- B- d1 B0 V
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    8 K8 v' q; k+ Y$ O
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);. `4 c* h7 G  J( Z+ u. `! V2 J
  124. 9 R4 v0 m: p; Q7 Z. j; _$ ]

  125. 4 d& I, g! d" E& |
  126. 4 @3 n) A+ t( b% m$ f
  127.   return true;
    3 y7 W# Z" f# H  n4 L
  128. }
    5 O3 v8 F& v( N$ k8 j; X6 y
复制代码

9 M- N. S3 s+ t6 \% T8 e0 O1 `: A& P0 \
, w" ~# H( }" e: N( v* J
/ O6 O* q8 i+ n  W- Y
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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