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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 5 v. K2 V5 s- i. r
3 d( U- z# r0 P1 A5 R" ]0 p
(nibiru.exe 772 KB (790,528 字节)): W5 H5 y0 \1 n8 ?6 y

# _; Z& ^* x7 |0 o! l将sub_451390,sub_451599 这2个显示函数进行了hook.
; m8 Y  {/ ^& D& ]3 j确认这2个显示函数都被调用了。5 H5 j% E4 g2 k5 H
第1个可能显示的是调试字符串,第2个显示游戏字幕。3 w5 X( F- L! s. l! O

" X; o' h8 p/ c) u+ A5 P9 B5 c以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
- o6 x8 o- z$ d: f0 b& n
2 g( [$ Q+ N* T' V    //v12 这里出错
( F+ a  Z. |7 M+ ?    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);: O. S) X( @5 w) x4 s7 m% q. i
, y$ T6 e0 l# z, n) @5 b
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。6 y6 n+ A& g* F. d/ G+ a
这种方式显然是有问题的,会影响性能。, ^2 m0 I4 S( N
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。0 V( A$ |8 \+ r! B
8 \1 o- D- w4 [& A
  1. sub_451390_Font1_hk
    3 C0 T$ u6 o9 R
  2. sub_451390_Font1_hk5 I: l2 V6 f/ X' O/ N
  3. sub_451599_Font2_hk
    ! D& G7 m) q" s
  4. sub_451390_Font1_hk
    ( B: i# f  J; i, Y( y
  5. sub_451599_Font2_hk
    9 i) a& Q/ Y  j  D' C4 Y
  6. sub_451599_Font2_hk- W, K, z6 w* [8 g# \" I1 @
  7. sub_451599_Font2_hk2 {; _9 Q  l% i) E& ?0 X
  8. sub_451599_Font2_hk
    % b$ r8 g" `/ K
  9. sub_451599_Font2_hk
    4 [  Q/ C3 V, i: L
  10. sub_451599_Font2_hk
    2 v) r. d" c# Q' P
  11. sub_451599_Font2_hk0 A% w( a+ j! l- V
  12. sub_451599_Font2_hk
    1 W- P2 Q8 d. N
  13. sub_451599_Font2_hk
复制代码
) i7 v: R; q% `2 V' t( G0 b
代码, b* t! c% S' K2 x: K9 c
  1. #include <windows.h>  Q1 c4 K1 G7 I/ J6 n' W
  2. #include <stdio.h>
    ( B" V) L1 W  B- e- G
  3. ; k6 l2 j1 m' e, q' q" B- C
  4. #include "patch.h"' {1 P$ n/ I0 C1 C3 {* E1 L% N  p1 N
  5. #include "patchNibiru.h"
      {0 A0 v& f( _1 z6 T9 T1 m
  6. #include <GL/gl.h>7 u% g3 |8 R; u) L+ u1 ?+ q

  7. 8 u: ?, r7 B' y! V3 [" N

  8.   W" d' E: Y3 ?2 N( V; a
  9. DWORD SUB_451810 = 0x00451810;
    + D5 A9 {4 ?3 Q
  10. DWORD SUB_451390 = 0x00451390;
    2 N* E6 F4 z' ^$ x) |+ ]# |0 P$ g
  11. DWORD SUB_451599 = 0x00451599;; ?$ O7 L3 Z$ S) e
  12. 7 ~" G. Z) v* R3 p
  13. HDC currentHdc;
    + _' ?$ U+ J, p

  14. ; M: V) U) ~# e
  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)
    : x; \, u0 ]0 D2 u; D4 ]: d' D
  16. {5 A2 ?+ h6 C4 ?; O4 F( D/ @
  17.     DWORD v10; // [esp-450h] [ebp-450h]
      m2 E* j) c9 J4 ^! t8 n& T
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    $ h7 a6 ?& S) M/ b- @
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    % I6 i0 H3 c0 w# j. @; I
  20.     int v13; // [esp-44h] [ebp-44h]
    3 @" O% H0 \/ B( O$ v8 w6 A2 g* a
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    ; a1 s; L  `; u' `' t& u4 G
  22.     DWORD v15; // [esp-10h] [ebp-10h]1 B+ @" k% U) e) ^' U
  23.     int v16; // [esp-Ch] [ebp-Ch]
    $ C1 W# I& V3 B. d" L9 H/ E" U
  24.     int* i; // [esp-8h] [ebp-8h]! U- ?+ W, d1 M- {0 B0 I' O

  25. - k/ a# Q8 R: o: N6 _  k
  26.     __asm pushad;5 {+ Y- j8 r/ C# E; g4 d/ o) j
  27.     FILE* trace = fopen("font_trace.txt", "at");4 b. K" N) C* ?- \* V3 q# `* U
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");) I8 o9 I1 E' z% j; S" j8 M
  29.     fclose(trace);
    - _2 D$ m7 U* j9 F3 N1 k
  30.     __asm popad;
    / c' W5 K  C4 M# o) v5 j9 d9 B& A
  31.     ! z6 ?( w+ U1 l7 V$ k1 l
  32.     //if (!a9)9 E6 \) f( L) n9 I. Y% V: B( S
  33.     //{3 h: n: @: [; `
  34.     //    AddFontResourceA(lpFileName);
    : H1 C  l6 U7 V" ]/ u8 _: l0 f1 q
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))0 B* Y* q# S0 [. A
  36.     //        ;( e2 b$ h9 @( C" }+ y/ w  I
  37.     //    *(_BYTE*)i = 0;
    2 E9 n# l$ a4 d. z. g4 \* k
  38.     //}5 y* k8 A) L  c# `+ O
  39.     //if (a4 == 1)
    - {. N7 p; f9 O' V
  40.     //{
    + K: h. N/ H/ Q( Y
  41.     //    v16 = 100;2 b/ _4 f9 d2 z! N, Q9 Q2 O& U
  42.     //}8 T/ b/ R; w. A! T7 s/ l3 p5 N% O0 O
  43.     //else if (a4 == 4)
    ) x$ K+ B- R/ \9 W& p
  44.     //{' A, ~* v9 C- L  V& J; ^
  45.     //    v16 = 700;/ b& i! v3 o8 M2 s
  46.     //}
    / N! U9 _1 u% ?8 \
  47.     //else' O: q  B# N! O5 N! A
  48.     //{
    . t% E" c7 x( g" a7 {: b
  49.     //    v16 = 400;" h8 l" E% D$ R) h! E
  50.     //}4 e0 `: @0 y5 X; R: f* p, [
  51.     v10 = 1;9 f2 i! ]; T2 H
  52.     //switch (dword_4AA490)
    9 }0 k% q7 [6 C. X
  53.     //{+ u3 N4 G0 \* r) [
  54.     //case 1250:2 H9 u' x. c( s9 A
  55.     //    v10 = 238;1 i! ]" k  u' x# p  ?& ?3 p
  56.     //    break;
    7 t# U% Y" t* l  z
  57.     //case 1251:! x' |6 j& g7 b: f+ d
  58.     //    v10 = 204;& J; i1 m- [& Y0 c; y
  59.     //    break;
    7 n2 T" X& }: K9 o0 P; m
  60.     //case 1252:
    ; E  B1 `" W# R! N  F. a8 W: c5 I
  61.     //    v10 = 0;$ i. n: @$ _2 B8 _/ P
  62.     //    break;# k( \5 m9 J# [1 b
  63.     //}
    ' k( ^5 o3 O+ ~1 j% U
  64.     v15 = glGenLists(256);% m/ q3 [# n7 b8 a) i3 }
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    ) O( y2 O. B* D& n! P# P
  66.     //if (!v14)! D5 B3 G* {7 B$ W& e
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    3 b" d3 p4 t$ W  T( S# w# P: K
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    / Q5 h0 C2 [: E2 R  b
  69.     SelectObject(currentHdc, v14);
    : T5 t" m7 ~: m9 d# A
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    - l5 P( }) F" B- m5 }) [) X
  71. % |% S# q) E9 G4 t. H
  72.     //v12 这次出错' ]- B( G) D' v( ]4 k
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);: y; \" Y. ?$ y$ m* `
  74.     4 \' T* `1 B( ]* d
  75.     //*(_DWORD*)a2 = v12;0 b, o4 [' d4 j
  76.     //*(_DWORD*)a3 = v13;5 s, F0 }2 t/ ?& g; d
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);: X4 E4 b$ M7 z% k; g# _: ?3 ^
  78.     //if (!a9)
    4 L: G) p% L; f0 ]: a& q) ?! Z9 r) K
  79.     //    RemoveFontResourceA(lpFileName);$ ~  Z% r5 f# r- _) @: }8 \- i
  80.     return v15;+ d. H2 q9 X/ }0 Z8 n
  81. }" U: K! q0 s& [

  82. ) M3 k- k, {5 s. k: Y6 M  Z8 D
  83. //使用到- }6 ], j* z( S! H* A- k
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)4 N+ ^: `/ T# t8 a' ~5 Q
  85. {, G# Z+ @$ y* i$ X& T1 U0 x
  86.     HFONT h; // [esp+4h] [ebp-8h]' A! y# R) N4 u# m- r
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]: n. o  [3 \/ t+ U7 K3 Y

  88. 5 R# O# i6 Y9 n0 j

  89. 2 R  O5 `  l. k5 \
  90.     __asm pushad;
    ) z2 A8 ?: E- ?2 E5 X
  91.     FILE* trace = fopen("font_trace.txt", "at");
      a2 R3 |" F7 P. B! A& f$ Q
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    8 [& n& E+ P& Y5 u+ T: Z3 {
  93.     fclose(trace);
    8 y7 p3 g2 G  O' a. h$ k+ t
  94.     __asm popad;, E, @+ l% T' y/ W7 k
  95. * ?+ b! n6 V( ^
  96.     currentHdc = hdc;2 Q# x+ q2 q, ^
  97.     iCharSet = 1;
    9 T2 b" W' B8 Z7 Z
  98.     GLuint base = glGenLists(256);% I4 I: N$ S1 A' F. w
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    3 ]/ f% F8 l6 E$ j
  100.     //if (!h)8 F* I- _3 b+ q$ {) y
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);% v+ V1 L! S+ o; a# k% L
  102.     SelectObject(hdc, h);: R) n- Y6 ?; U, _
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    4 F0 C, s, ]2 u/ k+ A
  104. }3 C9 }  k( G3 ?4 g

  105. # a- v/ W5 J9 d
  106. void __cdecl1 V, S7 a2 p7 g: P) e. d
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)3 Y( A2 v6 n4 g+ Q+ }6 j
  108. {
    4 O) O+ R, S% f+ ~5 t* L3 X/ K
  109.     __asm pushad;
    % s0 b7 U6 j" W
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    9 O4 t4 c2 O  S+ u" F, k
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);  R, J  C' l8 B1 [+ H; u
  112.     fclose(trace);
    6 ]$ S6 R9 _3 f- I% C% d8 l2 w
  113.     __asm popad;: k6 H8 r# y2 ~

  114. 7 ]5 K) a6 Z1 @
  115.     //return a1;3 M5 J' l- G+ K) I+ B& ?
  116. }7 V8 f8 Q( B  Q, {8 Z5 P, J/ g+ m5 v
  117. ) s0 j) z& Y4 h+ E, g! X" i  {
  118. bool. y; H3 V: t9 s+ F( M! C: z
  119. ApplyPatchNibiru()
    0 F/ s/ ~7 v# Q) m% q
  120. {, l" }5 q# D- Q- h( m0 E
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);/ l( Y( I2 r. s4 p, K) I9 [
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);+ s# t# w# h" P5 `2 T  m
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    * S$ S5 f$ a$ |2 t
  124. 6 W. k( p7 X% r) k8 a: |/ O
  125. ! L/ J$ p+ ^. u2 r$ ?
  126. 6 z5 b$ `3 L& V5 D5 e- C
  127.   return true;* Z) f) _7 x) v, i
  128. }
    8 @& W  J2 Q, F
复制代码

' A' P  c' p/ W( R9 P4 P7 L) R2 W) ?- q- F7 {+ q
% [3 w+ g1 f5 W4 k

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

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