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

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

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

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

跳转到指定楼层
楼主
发表于 2023-9-6 11:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
5 V7 `8 L7 s+ [: x& y* `3 O2 E7 P% d- Y
(nibiru.exe 772 KB (790,528 字节))) P, Y2 ~9 r0 O, |& j
. s2 e8 N, c0 P. L' P  s
将sub_451390,sub_451599 这2个显示函数进行了hook.6 f2 a) v( \$ L5 b! ?. v
确认这2个显示函数都被调用了。, ~! o* @. p5 f9 G, U
第1个可能显示的是调试字符串,第2个显示游戏字幕。
: P5 O* r$ l. i
" Z& ~2 c$ {, @( K) P以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。, R1 v" @. \1 g
$ u6 l9 C& l$ }7 v. f* C$ O
    //v12 这里出错
2 L9 O$ P7 r* D7 i7 F8 w1 G8 M    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
; x4 \6 M' @  V2 ~4 F1 ]: N0 ?; L: L: u) G: ?. }; u7 B1 Q
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
% {; s! f; l6 i  m0 Q0 H这种方式显然是有问题的,会影响性能。/ }/ ?! z, ]' v0 j5 r3 X7 y
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
* p& R* B; n, @& w  D, s* v$ z) P+ s+ L) N' m# O
  1. sub_451390_Font1_hk. M3 A: g. J6 F0 c* v* Q
  2. sub_451390_Font1_hk& E, N; [1 G$ @% l
  3. sub_451599_Font2_hk3 i* [- _: ^8 M
  4. sub_451390_Font1_hk
    6 a, b6 R* u: @" \3 P: @# b/ I
  5. sub_451599_Font2_hk
    ) i. ~' p0 R9 `( Q% j2 y/ T9 v0 r
  6. sub_451599_Font2_hk& Z0 a$ Y8 i# n9 r
  7. sub_451599_Font2_hk
    - r: L# R) l: }+ G3 b
  8. sub_451599_Font2_hk
    # C6 P- t7 R- d4 j7 @& e0 |
  9. sub_451599_Font2_hk/ g- W6 B' N: q4 \2 z% N
  10. sub_451599_Font2_hk( |, B2 I! q2 E
  11. sub_451599_Font2_hk
    9 g3 A( B  b1 Y' X
  12. sub_451599_Font2_hk* R6 D( i1 L+ E; A& X  t% F' R6 a
  13. sub_451599_Font2_hk
复制代码

* |" E/ l8 X/ B# N代码
. s& V& ^0 \( v" I6 K/ {
  1. #include <windows.h>
    / L6 r$ [  M3 {! E
  2. #include <stdio.h>
      [# j1 e5 @+ L( M; }

  3. # U7 q& v) i& n0 U2 V
  4. #include "patch.h"
    4 Z# j0 F6 i6 k. R5 ~1 J
  5. #include "patchNibiru.h"- w' z1 ~6 u6 Z& e1 m/ i
  6. #include <GL/gl.h>1 s% u) X5 H3 r. N$ z* g+ d
  7. $ p! @* S9 B% k/ |( x' o

  8. & T7 Y" I6 }) T' z; c
  9. DWORD SUB_451810 = 0x00451810;
    * g7 }* Q4 I. o2 j$ t# p
  10. DWORD SUB_451390 = 0x00451390;( z$ K) e; G$ }8 i- g, ?; h+ A
  11. DWORD SUB_451599 = 0x00451599;# e, ^, ~* H& ]  k# o( c: G( B
  12. 0 k7 q6 R. X; ]4 e, q7 `: {
  13. HDC currentHdc;
    " I% L8 B3 _  Y  D  y6 O

  14. 7 I) `3 c9 I- I: O
  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)
    # y+ P7 Q, B1 b' C9 J
  16. {' B* P) d3 c/ c5 E
  17.     DWORD v10; // [esp-450h] [ebp-450h]) v) I5 I& N; Y0 A
  18.     int v11; // [esp-44Ch] [ebp-44Ch]" O5 k1 H* h& ^, Y% V- K. n' t; `+ u
  19.     int v12; // [esp-4Ch] [ebp-4Ch]' f7 l9 [8 C7 X9 S
  20.     int v13; // [esp-44h] [ebp-44h]
    9 t  a. y% \6 j- M0 u- V
  21.     HFONT v14; // [esp-14h] [ebp-14h]$ P! i  C: ]$ z8 u6 z
  22.     DWORD v15; // [esp-10h] [ebp-10h]. ?' ^" @* t' U! J: {& {
  23.     int v16; // [esp-Ch] [ebp-Ch]8 A; x  `6 V: i
  24.     int* i; // [esp-8h] [ebp-8h]
    : ?, b6 G! ~" e1 g
  25. * J& [8 N) W% ]4 @7 ~
  26.     __asm pushad;' w; L+ t, N8 Z
  27.     FILE* trace = fopen("font_trace.txt", "at");
    % w( s: N1 }/ H' M
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    3 r7 |: V2 w, L* n
  29.     fclose(trace);0 f& @3 @% D# L
  30.     __asm popad;/ e9 b8 v* v, v# W- P9 T0 ]
  31.    
    + s+ |8 ^  O$ @& j' ]: r2 N
  32.     //if (!a9)
    # ?; s! E. k& C0 w  x/ P4 b1 t
  33.     //{( m/ K1 a% @" H( a8 L$ E
  34.     //    AddFontResourceA(lpFileName);
    * \4 E  F& t/ ]: W" s
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))* {9 h" M( ?+ h% l+ [+ T+ B5 e
  36.     //        ;5 M, e1 g1 @' c- S" W
  37.     //    *(_BYTE*)i = 0;; l5 e  W. g! [  V4 j' M
  38.     //}
    5 B5 W# e' N/ Z+ }6 |( M- m
  39.     //if (a4 == 1)3 L6 w" [: ]& _; T! D
  40.     //{) U; s& F- H) Z5 W# |9 C3 h
  41.     //    v16 = 100;* H- G9 c+ h# n' O* \; j7 j- I
  42.     //}7 ?$ T- I9 v; A! c0 f2 w& G
  43.     //else if (a4 == 4)
    * G/ G8 H6 e/ `' R/ F* [' z* G
  44.     //{) i9 e# L. c' |" M" l& J
  45.     //    v16 = 700;
    & v- j( a8 V/ e) e+ N
  46.     //}
    % @& I' a; H# c
  47.     //else
    9 m2 T* ]7 `4 V& \6 _& n3 G+ }
  48.     //{- f$ k- [! [) j/ u/ \
  49.     //    v16 = 400;4 j6 J  }8 p% E9 l
  50.     //}
    / ]( z+ j# ?0 g5 J
  51.     v10 = 1;
    3 z8 l" n. N0 z7 E# K% c$ _8 r
  52.     //switch (dword_4AA490)9 M; J1 F- P# b3 Q* @
  53.     //{: N6 O& R* ~6 ], [" I8 o0 M& m2 \
  54.     //case 1250:/ H0 r/ `2 r5 U  F0 ~2 O
  55.     //    v10 = 238;! b/ u0 T6 u' s" F, u" V) ]
  56.     //    break;
      C6 @. G. V. c' S
  57.     //case 1251:& I  |' e8 c: g1 A/ L5 a
  58.     //    v10 = 204;6 j& x, H+ j3 A% B0 w6 L
  59.     //    break;
    3 h7 ~. d! M- r
  60.     //case 1252:
    1 u: Y4 Y/ \+ c; v! @1 C) E
  61.     //    v10 = 0;3 g. Q% k% ]/ q
  62.     //    break;
    7 ]+ I: L, m8 F" y" P4 _
  63.     //}
    ) V4 C7 R8 m! }" P3 x
  64.     v15 = glGenLists(256);
    7 I6 m) k( t1 {4 k
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");' `9 @7 z, ?8 K; O
  66.     //if (!v14)( q9 T& J8 {6 P) m' C% w, j
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);% C- I; q" i- [, L/ L/ e) S/ \
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    4 c7 O& t* g; @" X3 E( f; x+ X1 `
  69.     SelectObject(currentHdc, v14);
    9 A- Z$ O( T. j) R! y4 D7 Q
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    & Q1 B( p1 P8 m/ e6 @
  71. ; x: h* C" z! B0 t" R" v2 |
  72.     //v12 这次出错
    8 W% t1 F( G, @; {( u
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);* }' J: u* }2 r1 `( a+ o' @& c; m
  74.     - j! i& `( L; s4 V) x2 |& j* r
  75.     //*(_DWORD*)a2 = v12;
    * p$ U& i* S, c
  76.     //*(_DWORD*)a3 = v13;
      j1 T, a3 G3 P# T
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);4 o8 A% {, ~; s# r
  78.     //if (!a9)
    ( N$ Y7 Z& |7 g& \
  79.     //    RemoveFontResourceA(lpFileName);
    6 z# \" e. M9 }
  80.     return v15;0 k7 Z% T' b9 O& K& x
  81. }
    ) L2 r6 R( \  @* ~) Z' u: K
  82. : K9 V0 F9 z' Z& T. A5 C
  83. //使用到
    & P6 }. ~- D& U) y" y7 h3 q: m' u
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
      H' D2 _% h7 C/ A
  85. {1 ~3 [+ ]4 N4 z/ r0 Q
  86.     HFONT h; // [esp+4h] [ebp-8h]
    8 P8 r; e; I/ Q/ F0 f7 {( I
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]) y  i) W, }) e/ o8 E
  88. 2 K0 L  K) j- @& c$ |# ?& U% h- C
  89. $ f' |" b2 L6 \2 }: c
  90.     __asm pushad;2 H: M3 U7 [5 i( A5 P
  91.     FILE* trace = fopen("font_trace.txt", "at");1 a. V( i6 |0 x! b
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    * d: |0 |! S: n1 [; H$ E
  93.     fclose(trace);$ b! U! u0 }( L' F$ `: n$ s9 n
  94.     __asm popad;
    8 Y9 s6 F* t, E8 b  G  G( E) w' l8 a/ r

  95.   @% L" ?2 e6 V: x6 K: q
  96.     currentHdc = hdc;
    4 k8 a. ?1 y5 C8 w
  97.     iCharSet = 1;6 Z/ |  X  D2 `; i- y1 j  _
  98.     GLuint base = glGenLists(256);
    $ l: L  @7 h) Q. E6 f
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    ! C7 u; y3 _: S: L7 [/ ~% W
  100.     //if (!h)* K6 U) b: m6 `9 ]- A- K/ `
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    4 Z! C' Q% K9 ^% T/ q
  102.     SelectObject(hdc, h);, Y. V, m' C9 B) _+ @1 e5 p- u
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    , O/ c2 w+ m. }: Q: i
  104. }
    ( q# x# w$ Z7 s+ O. a$ A' E- a
  105. + g, s6 }& A$ }: Q0 M$ x# A
  106. void __cdecl
    7 Z: t0 k% K$ g% D6 [3 I
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    2 p3 z0 B; |( S
  108. {6 S. Q3 ]' d0 X, l
  109.     __asm pushad;
    - Q% E* z; m1 c* x/ N
  110.     FILE* trace = fopen("sub_trace.txt", "at");* ?6 I( P3 X- I* n2 o9 d/ A) _* m
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);) S( H3 T+ Q* k5 S
  112.     fclose(trace);- _' E. [8 @/ ]. q& [" c
  113.     __asm popad;$ ~3 d/ U  J7 a; j5 N
  114. ' k0 h) Q6 B# [- ?. h0 D
  115.     //return a1;) z  A" r4 z6 X
  116. }0 t0 K9 @$ {6 [4 U

  117. ! f8 r9 L! B1 J2 s8 N$ p. X  b
  118. bool1 j$ C4 K" Y) b3 o& Y* A
  119. ApplyPatchNibiru()' P: ~- d/ N1 Q7 B
  120. {
    * A" H* N* E# g# d% Y9 v. P2 C& B" e6 y
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    + j; L: k* j4 @# x, N: U! w2 ]0 E2 H
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    * m6 i1 R. p3 E& P8 N3 V
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    : ~7 s9 N1 d5 c2 z9 i& s: K

  124. 6 V; J8 r$ n+ F) M1 E& f+ _
  125. 9 q& q4 K8 e- T3 Q* N

  126. 6 }: w) W) ~- {9 q, L( N1 \! v3 M
  127.   return true;9 v% O0 g& {  Y4 A
  128. }
    9 T5 f: K; X! U7 M1 b
复制代码
: X* n) \8 k( M0 ]3 s7 V* Q

, L" v6 a: \  N9 F" w* O2 g" r/ x& W; u

6 M+ n; m" [  v1 p  T! D7 k% {; b
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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