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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 # R8 s) x4 K8 ~, z6 @5 O

, l5 N9 [& R  M(nibiru.exe 772 KB (790,528 字节))! {, o8 {$ h2 T6 H9 K

5 b7 j% V3 d7 w4 _1 [) @将sub_451390,sub_451599 这2个显示函数进行了hook.
0 }5 Z, F! q2 }9 _$ K% e2 r1 U6 C确认这2个显示函数都被调用了。
+ `# W1 \8 a( x- j, N第1个可能显示的是调试字符串,第2个显示游戏字幕。
( Y0 U  {$ B. y. ^( P* `& S$ k
5 h" n8 ~0 A, i3 j/ F2 f5 H以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。/ y  g* s( ^5 K; F: t, U- N. R

7 k3 ?% h. O3 l: K6 X% @    //v12 这里出错) A) c: Z) r. {- J+ h
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);0 o/ |- d$ Q5 ~) z+ o
" A! s! w4 N2 a/ D  p
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
9 h2 n! m  t9 h( Q" ?( V7 v4 i这种方式显然是有问题的,会影响性能。4 J) s& ^! F4 b( J5 h
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。& V- D, a) D7 j$ O2 {

5 n8 O  D3 X& s/ A! X( t% l/ M
  1. sub_451390_Font1_hk
    & H) X2 }! @2 y8 L0 Z
  2. sub_451390_Font1_hk
    8 I& W  @" G2 A  r. ~4 ~$ b8 Q
  3. sub_451599_Font2_hk' S$ V( \, t1 ?( {
  4. sub_451390_Font1_hk
    0 u' R5 O. k' N7 T% z1 ^( \
  5. sub_451599_Font2_hk
    / o* }: J0 Z! U& d1 y1 n1 }( ^
  6. sub_451599_Font2_hk: ^7 Q8 h0 w9 ], h
  7. sub_451599_Font2_hk4 O$ W) [% b, A2 ]" v
  8. sub_451599_Font2_hk2 }" Z* t* m8 ]/ K5 k% q; K- U
  9. sub_451599_Font2_hk" h3 T. G8 i! S* V' \
  10. sub_451599_Font2_hk" {1 f; H1 _; D$ D/ L2 W
  11. sub_451599_Font2_hk0 |: a2 Y: V( p1 Y' w; e5 G
  12. sub_451599_Font2_hk  |3 l! a; y1 b4 w! T' i
  13. sub_451599_Font2_hk
复制代码
6 a; P3 b7 S7 I* l4 _: l; e& I
代码
# N0 W! i1 v! B& ?% M
  1. #include <windows.h>4 S" T  w8 c  S7 i( H1 C
  2. #include <stdio.h>) d! J7 Y" J  q* x4 G$ l

  3. ) f) ^+ ~/ v  v& N* B2 A/ Q6 e0 U
  4. #include "patch.h", \' C" W' l; Y( j, ~9 V4 P
  5. #include "patchNibiru.h"
    , z) N0 h9 \7 j! F) D
  6. #include <GL/gl.h>6 O# ]% b  \2 _9 \1 n

  7. " q: O2 M, _8 J. i( t7 O1 E! W$ `
  8. - c' g1 U% g0 u$ W
  9. DWORD SUB_451810 = 0x00451810;: [+ m# e5 M& A" D0 r
  10. DWORD SUB_451390 = 0x00451390;- I# C6 e, m' W: s3 _
  11. DWORD SUB_451599 = 0x00451599;# C4 Q  T7 {  U; ~, O
  12. . N4 u/ L; y0 l" R) V+ y/ i1 P
  13. HDC currentHdc;6 Z0 ~1 c- a7 |& [% P6 l
  14. * T- O) V  C2 i7 G/ [8 i5 c; T
  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)
    & H/ c' I2 n: a. T9 `
  16. {3 Y9 C6 W. P6 j8 M4 `& p3 c
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    + `/ R6 N" @- r( g
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    + C+ t& s8 i/ _  ?' W+ v
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    / e3 g% {  B; S- M6 {7 n
  20.     int v13; // [esp-44h] [ebp-44h]
    ( E6 ~; P4 j) K$ @3 c2 w7 F. g
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    ( C1 O: r9 j% B0 m& ^0 ?, T
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    / o- E$ k/ e5 R  \6 R8 @
  23.     int v16; // [esp-Ch] [ebp-Ch]7 {0 g( V" X5 F7 C' t+ {/ c% t+ s
  24.     int* i; // [esp-8h] [ebp-8h]
    3 g: w+ h& w$ T" J6 |
  25. / j+ R- k2 j4 X1 X
  26.     __asm pushad;
    # Z! D1 ~( H4 K4 a6 r
  27.     FILE* trace = fopen("font_trace.txt", "at");
    2 }$ v$ [* }$ z9 h  H- p/ u
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");( ~) e$ V+ g& }8 v+ B
  29.     fclose(trace);% y# p/ g2 J- C. q9 O
  30.     __asm popad;" m4 q% `; r, H- Z
  31.     " d9 Q. q* t9 d9 ~+ ]% B. Z7 l" T
  32.     //if (!a9)
    6 Q. g3 G# n2 e$ t8 [7 D; E3 Z2 q
  33.     //{6 E1 s7 z- `% R+ K' t! u8 V
  34.     //    AddFontResourceA(lpFileName);! u$ s8 L5 I! p& r
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    % N% R6 o9 N, `' `7 x3 O+ m& V1 W
  36.     //        ;
    + [# }# H! i6 ?. Z: d2 |  o& s8 W
  37.     //    *(_BYTE*)i = 0;$ f# Q2 l6 n8 w2 A. r) U- n/ }
  38.     //}3 ?: S+ x2 k5 x. j" L
  39.     //if (a4 == 1)% L" z* a' d( C
  40.     //{% l. y* }& d3 O/ R  X: o# k2 |
  41.     //    v16 = 100;
    ( G8 B% y. v' k4 H: d0 D
  42.     //}2 s2 [9 Q1 O* O8 J
  43.     //else if (a4 == 4)" T, b7 Q' A2 M$ ]5 O$ L; H: g
  44.     //{' E# T4 h2 ~, h. Y  ^( z
  45.     //    v16 = 700;3 |4 o2 `  \0 K6 m) M0 ]
  46.     //}4 g6 k: _# r6 q& U
  47.     //else
    ( M3 w4 y+ h4 H" y0 c( I6 c, h" }4 P
  48.     //{
    7 m3 d0 U$ h5 [0 a2 r0 I
  49.     //    v16 = 400;. o/ R- y  |) e, B
  50.     //}
    $ k+ ^; h: S  L; r# S% o. `
  51.     v10 = 1;
    3 C+ ]! ]1 n. o: ^& e) ~7 v
  52.     //switch (dword_4AA490)
    - [5 y: L. [. K! Y* p+ x- H
  53.     //{
    ' N, o. }+ k, U/ ]: s5 F
  54.     //case 1250:1 E+ Q0 U( n' _" H8 `
  55.     //    v10 = 238;( ]; K& m" a! g7 R5 C2 |
  56.     //    break;: ~" t6 Y+ s( }2 o* E# c1 T; g0 N
  57.     //case 1251:
    * N' i* I: d/ F# f
  58.     //    v10 = 204;
    8 u, v" g) O8 D6 k' w
  59.     //    break;
    & B1 o3 T8 w5 _* ~  x9 E
  60.     //case 1252:  F+ q$ Q. h4 R3 Z- d: e
  61.     //    v10 = 0;" [9 o  s/ r. Y4 z! o' U  J$ k
  62.     //    break;3 t" V6 t# r" O+ U, b! e1 h4 ]
  63.     //}
    ) V2 T6 O4 O( b# D9 F1 N1 _* k
  64.     v15 = glGenLists(256);
    / Y* }0 k  }9 n+ X1 F* T$ o
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    : O1 D+ P0 P5 b- m8 X
  66.     //if (!v14), J+ X; T; o5 R& W+ d6 s
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);2 Y' y$ e& {6 A0 n3 G$ R
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    * T  @2 D& J# A, \2 U6 c9 D, f
  69.     SelectObject(currentHdc, v14);
    6 H8 P! o" s4 A# E) K+ X
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);& s  z% S' \  C" ~1 \+ D/ \

  71. 9 C- Z4 L- l  Z- }/ U  |$ I
  72.     //v12 这次出错( K. p% K/ P4 F  Q% R9 }
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    6 a3 q2 g! \/ [" M9 C
  74.     4 g& r3 y) K  [3 i8 b  ]1 z& e
  75.     //*(_DWORD*)a2 = v12;
    . x; \# n# M+ u) f5 o6 X! u
  76.     //*(_DWORD*)a3 = v13;& v# k3 ^! S$ }- g$ x. p3 \0 V
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);6 |* ]6 e5 |  b$ A
  78.     //if (!a9)1 Y% @7 c) o4 U6 w8 V# M
  79.     //    RemoveFontResourceA(lpFileName);( Y" ~9 o' p  W2 e/ d" C: f
  80.     return v15;
    ; J2 s5 T. u8 a5 d9 J) n
  81. }7 J9 B# F2 |5 s$ e4 ~
  82. & v% q+ h2 A- ?$ m
  83. //使用到9 A. I# x$ N" H5 ?; \
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    * r! w9 W$ `# Z  H. k# @& q4 o, G
  85. {
    9 w* k! H+ \2 p# v- X& _6 y
  86.     HFONT h; // [esp+4h] [ebp-8h]5 Z: i: H, ]8 B3 n8 C( }
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]3 o( g! S5 |1 [$ C
  88. 1 X$ J. s8 A8 k' m
  89. % X. u) O% ]* t0 d) B' m+ x
  90.     __asm pushad;
    7 f# _# ?: ^* ]4 {, _) ^
  91.     FILE* trace = fopen("font_trace.txt", "at");; U; V, x4 ]7 @1 Z
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    # _4 \! i! N* ~) o& O! C7 k1 C$ y
  93.     fclose(trace);
    - ]0 q& c' I; @2 l
  94.     __asm popad;6 {7 m* y1 o6 k. ?. U& v+ y
  95. ) j' P+ M* x. X; f2 [
  96.     currentHdc = hdc;1 Y. c$ w6 F( Y8 J* Q
  97.     iCharSet = 1;4 i2 c' ^* P, o4 F4 p! Y
  98.     GLuint base = glGenLists(256);
    & e8 o4 ~5 ~3 r* D/ r% b
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    6 K0 m, a7 P- o$ a' E
  100.     //if (!h)
    2 O8 R5 L4 a2 a7 @6 Q
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    7 q% M1 T6 F4 V, d( g
  102.     SelectObject(hdc, h);
    ' B& ^# W& V4 q' S: h& }
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);9 V6 P2 ]* b0 R$ }
  104. }
    , y; n7 f4 C; s1 Q/ K

  105. 7 w# j6 S. _0 U7 x, G% f- f
  106. void __cdecl
    ) A5 j" [# r! {' R
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    ) A9 T/ d/ k3 ?! a( p
  108. {
    * e4 k! B; w/ A6 B
  109.     __asm pushad;" h- l: Y$ i+ _
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    ; p0 E1 f% V! _8 r: s" |
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    ) B# V5 N2 Z: a. U" U' q
  112.     fclose(trace);
    ) j5 e) i  k0 Y  R' N7 k$ k
  113.     __asm popad;
    , d( m/ W$ c6 p7 N
  114. # Q* l- K0 g" V$ Z$ y5 u( ~9 N
  115.     //return a1;
    ' k" X6 H$ @+ N: R1 q# e5 m
  116. }
    1 B: _' b* n: L" m* R

  117. / D  V$ T2 h" g  n! D4 I
  118. bool. t$ m2 p- T5 G0 ^
  119. ApplyPatchNibiru()/ A0 @6 E( d1 Q7 |5 \) ^* O$ N
  120. {
    & Q0 r& {3 {6 ]" f
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);8 ]- V7 K! x: l+ A
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    ! y# ?. S; L) d% {
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    0 Q! L/ o: i$ B3 G' N$ w8 X

  124. % O+ b# c7 k' S; L6 ]$ n
  125. ! b" }% P* f* _  M8 P2 v6 ^- A8 v
  126. 9 G% @% \  [' U
  127.   return true;
    ( c% A: f0 Z" r- ?
  128. }3 ^0 ~3 K' f& Y" h  U  z
复制代码
' D/ g8 _* Y& O

# w& E9 j# k- k5 x9 n9 u: A, M/ Z9 N7 I0 u' H8 `; I

5 s" l( K( B0 I/ n, j
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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