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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
8 `# J$ O0 f0 H% d6 X+ U  C- f& c6 ?& h) `
(nibiru.exe 772 KB (790,528 字节))
& c3 O# Y+ E2 G4 G" K0 r1 u% ?" c0 h, `
将sub_451390,sub_451599 这2个显示函数进行了hook.
% x/ S# e; x, c* P1 H4 n. V- D确认这2个显示函数都被调用了。! `+ Y4 W! ~1 M! p$ L* _& Q
第1个可能显示的是调试字符串,第2个显示游戏字幕。: z; L% u; F' w$ x& F: A

7 I; b( W6 A( I" I7 R以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
6 G: b% B1 ]/ q( d# I6 X6 C- I6 R3 T4 t: U5 E' `& z3 u# N
    //v12 这里出错
: y/ H! J8 K2 Q* ?( l$ O+ q1 _' M    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
( \/ L( t- _  b9 |3 I# F# M  X& p' k  e( X- f
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。/ E* q8 S( v, @; N
这种方式显然是有问题的,会影响性能。
- O; i8 D9 Y0 A/ p7 U. G在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
- A+ n* I$ C0 u0 I1 k* O5 m' F) p  g  D
  1. sub_451390_Font1_hk
    3 E1 O( l& y1 R" ?' `
  2. sub_451390_Font1_hk9 @4 L4 q/ j: R5 e
  3. sub_451599_Font2_hk$ e# ~3 n) g# X4 a' [
  4. sub_451390_Font1_hk
    8 F# @* n7 s  y+ f; v
  5. sub_451599_Font2_hk0 J, r. C  F, e- q% a
  6. sub_451599_Font2_hk
    ) ^  Z8 Z8 Z4 F" `7 V
  7. sub_451599_Font2_hk
    ) s% g8 W% {# ?1 ]& z# L9 I2 V
  8. sub_451599_Font2_hk
    9 L5 Y' T/ G* g( r
  9. sub_451599_Font2_hk
    6 e$ K; d6 p" a% [, Y
  10. sub_451599_Font2_hk
    4 w0 u9 c  V3 h  x' T  F
  11. sub_451599_Font2_hk& }. H- _% W* k/ L7 \# W- f$ A; q
  12. sub_451599_Font2_hk1 I- G# G3 ^/ P7 L) _: y, a8 P
  13. sub_451599_Font2_hk
复制代码
4 i8 ^! _4 N' [" w* [
代码
5 d" A/ C* ~3 `/ G
  1. #include <windows.h>8 h6 h  g4 U2 V
  2. #include <stdio.h>
    2 u) \; l' ?/ z9 Y- g  s

  3. . ^4 V. P- ^, G
  4. #include "patch.h"
    # |( J, q8 d5 [
  5. #include "patchNibiru.h"
    ) f+ b! r/ R8 w% T7 V  L
  6. #include <GL/gl.h>
    ( f% y4 @5 s. Z/ A1 `
  7. , @* T2 g/ L& s2 ]3 e; ~

  8. & B# E) Q* S0 \% x! _1 D) F; `
  9. DWORD SUB_451810 = 0x00451810;
      B+ E0 U  |' v  d$ }
  10. DWORD SUB_451390 = 0x00451390;$ ?- r- }3 e  r, D( i
  11. DWORD SUB_451599 = 0x00451599;
    # D& I8 O- B  Z
  12. 7 r2 C% U- o+ g
  13. HDC currentHdc;
    2 f7 Y& T8 ^% G8 ^
  14.   T- g9 A7 }" 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)
    % Z, Y1 ]8 I3 _3 o' S+ I0 }4 Z
  16. {
    $ q5 V7 N( o; r" b( O2 q
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    ; m3 a  I! o. N* e3 |/ c& B
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    3 Q- Z. I! L- L6 f! u# h: T
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    + u6 f; E3 Y/ Y+ M& k4 M
  20.     int v13; // [esp-44h] [ebp-44h]
    " `6 d8 g$ p8 @$ m, \
  21.     HFONT v14; // [esp-14h] [ebp-14h]4 n- E1 J, a1 I, ]" E$ K" C
  22.     DWORD v15; // [esp-10h] [ebp-10h]5 [3 E1 k6 @2 A1 \1 f) i
  23.     int v16; // [esp-Ch] [ebp-Ch]4 [0 o) ^( @) A
  24.     int* i; // [esp-8h] [ebp-8h], R" b; L) X7 b" L
  25. 4 W, N. P, o# r' n; r
  26.     __asm pushad;
    / y* j4 |, z2 U: T7 c. L5 c' a3 V
  27.     FILE* trace = fopen("font_trace.txt", "at");
    + D- V9 A( a+ v
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");* D6 {: b% @% D8 m" Z
  29.     fclose(trace);
    8 z/ u4 U/ Z# ?. F4 r; h
  30.     __asm popad;6 H; H1 c2 s* {; ]& ]
  31.    
    2 G: C6 _, i' d* F% L0 ^  x
  32.     //if (!a9)3 i$ x: W7 h( S% M( R, t
  33.     //{7 v0 q4 E# }+ _3 |4 ]) V
  34.     //    AddFontResourceA(lpFileName);* [5 T  A; [% V5 A
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    4 u+ d. J% F) I! @
  36.     //        ;
    # r; R0 v2 T$ U# s8 |% d% J# ~/ `
  37.     //    *(_BYTE*)i = 0;
    9 O8 [# T6 U9 K
  38.     //}
    , R! S! k' W6 C  V2 W7 D* C
  39.     //if (a4 == 1)5 c5 c% [  j; M9 X
  40.     //{
    ' L& Z* w8 D" ]3 F% P
  41.     //    v16 = 100;0 B0 c- i1 D8 u" L! [1 }* Q) \6 f
  42.     //}
    5 e" u9 j) j2 ~8 V0 T
  43.     //else if (a4 == 4)* @' x$ n7 |/ v! \( D+ @
  44.     //{
    3 D' |0 j/ Y- l" ~4 E
  45.     //    v16 = 700;! O4 P$ d1 a0 B
  46.     //}
    9 O. u6 b5 m! e( R* d+ O' H7 I/ ^
  47.     //else
    . a% C4 h) J( s9 Z( j  A8 B
  48.     //{
    : J' M- l" f) M& P4 Q1 o! J. s0 @
  49.     //    v16 = 400;4 I+ i7 S5 k6 V8 u$ L, N3 [
  50.     //}6 H/ a0 K6 H; H' P/ ~% n+ s0 o
  51.     v10 = 1;
    ! ^" u! A$ K  G7 ]7 v
  52.     //switch (dword_4AA490)
    ) Y5 s; m6 Z' T6 R
  53.     //{( Q- d) I( Q. M3 r
  54.     //case 1250:
    + `' @8 ?4 `( P5 B6 o4 L$ `0 ?
  55.     //    v10 = 238;! B5 l4 M2 F7 L1 ~1 P
  56.     //    break;
    % M6 s7 c' f  S& j! g9 J1 I
  57.     //case 1251:
    * B' z: k/ Q( R* X( r# T* X# i
  58.     //    v10 = 204;
    ; d9 S, f& b% S! b3 X
  59.     //    break;
    ; H, e( n. ]6 \
  60.     //case 1252:: u, _$ O* s' e8 d" H
  61.     //    v10 = 0;
    & O7 y/ j7 p2 M0 Y2 ]! O
  62.     //    break;4 B) F( s4 t5 `' p  P
  63.     //}6 E  k3 P, t" e# f7 `
  64.     v15 = glGenLists(256);
    " O9 x. `* K2 K2 t2 L6 b  ?
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");* u' x7 z6 n; T
  66.     //if (!v14)* E7 \2 d0 X, b3 ~9 N5 n
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    9 G: L: \9 C/ v8 n0 E8 H! Q6 n
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ( Y( ?* B: C1 l& ]" o; m
  69.     SelectObject(currentHdc, v14);
    ( s% s& Z/ [. l1 j/ V. Q2 z
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    ; p% c; W% B- m6 I; {$ b( x
  71. 1 G8 R+ z: m1 b; G
  72.     //v12 这次出错8 S& g# Y/ ~4 ^# `4 J' r- z
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    3 W' ~0 Z9 J2 B. X7 `
  74.     $ H' d# |, G0 h: `
  75.     //*(_DWORD*)a2 = v12;
    5 N1 w8 p( C$ [; a# L! n
  76.     //*(_DWORD*)a3 = v13;
    ( ?7 z3 K7 R5 ^
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
      x8 l, o' y* S8 F6 F8 p  B" u
  78.     //if (!a9)
    - k% W0 P. c. A1 ~- a9 c' ^) x
  79.     //    RemoveFontResourceA(lpFileName);; C' G8 G: g. j
  80.     return v15;
    ! ^6 O8 ]6 v) v5 F; L- _/ [* `
  81. }
    - v( B8 s7 `, U* A8 y: I

  82. $ c6 Y8 q; o" ?: @
  83. //使用到
    8 |, z* B" {& I- G* C+ W$ x
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)9 o+ {/ j, u, I5 [
  85. {
    ( B/ R9 i4 C: d
  86.     HFONT h; // [esp+4h] [ebp-8h]
    8 D- M; j+ B6 S
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]8 _3 B5 L9 F9 s8 f/ V+ u
  88. & G. M0 @7 B4 w1 f" o' ^6 z* }
  89. : b$ |/ p9 z7 L  d7 K
  90.     __asm pushad;, r) v* Z8 `2 T; g4 ~( D) s
  91.     FILE* trace = fopen("font_trace.txt", "at");
    3 J2 M8 M2 w5 @: G
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    3 \' P+ W' |: O* N9 d
  93.     fclose(trace);
    # D6 O! }- k% r1 H& [/ ^1 z
  94.     __asm popad;
    ( N% e: u2 w& B: P# n' S+ p( P
  95. 2 C/ g& I# l* S. v2 |; \! t
  96.     currentHdc = hdc;- j: }4 p: d; I- m+ |6 j
  97.     iCharSet = 1;
    $ J' x% [/ a+ T# S% H9 s2 L9 M
  98.     GLuint base = glGenLists(256);
    $ L5 ^- [* _3 @3 k
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");1 F( x; t& K6 o) i4 Z
  100.     //if (!h)% X0 Q' s' q3 ^: K9 g1 |
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    0 w( R3 [8 F% z4 @
  102.     SelectObject(hdc, h);
    ) B! W+ e8 u, t  e# Q# ]3 ~
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);& `2 ^2 l1 R9 y4 b6 V, A+ [
  104. }* t% [  }* I, L* @- d
  105. ( p% E) _' U* O  Y# d- `
  106. void __cdecl/ V% w! Y8 r) y
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)" T2 u9 D7 `1 U3 Y, L
  108. {
    0 C, d' w$ |2 F5 Y
  109.     __asm pushad;! I  |" G! }) h0 c$ ?# k
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    0 T% ^$ k0 \! r6 u+ x& K2 x
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    - h* ]4 m% E8 m$ a2 j
  112.     fclose(trace);
    # u3 O: x4 v- j
  113.     __asm popad;" `' R, U5 Y5 C6 T7 [7 x  l
  114. . Q1 r3 G8 T1 b7 L
  115.     //return a1;0 _& _2 Q, I% e/ r
  116. }
    2 J! q1 `* F+ V6 S4 e4 |, Y. h

  117.   y2 C5 P: Y/ S1 W  i
  118. bool
    2 N) \& {, [+ u4 U( c4 G/ f' H# L
  119. ApplyPatchNibiru()
    ( z3 Z0 h; F# |. q3 S" U7 |
  120. {/ w$ K( ?( u! e' d2 }
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    $ p1 _0 }- Z. z7 C( C, J( V
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    - C$ d$ J' X6 v% s* G
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);" S. b$ {2 `( f' U

  124. 0 c% T* S) H3 X+ L
  125. 9 G6 H" k. L6 ?3 t
  126. 2 w" W5 I. ^0 t
  127.   return true;0 [1 s$ @. }' C* \' o0 d
  128. }2 a. d. y6 x& w. @
复制代码
% u8 c! m3 l$ z

: A0 \2 b, v  h# q, D, I* X3 X' Q$ |* G! L2 Y. b

- ]5 t! y) u+ M/ x" I( k
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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