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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑   j1 B! L1 f4 I1 E/ |3 Q& D
; N) c8 j$ U. H) E: J- O
(nibiru.exe 772 KB (790,528 字节))
! x$ i! G" G% `. v4 u6 V
2 _3 a. ?$ T1 |) C* C& [将sub_451390,sub_451599 这2个显示函数进行了hook.$ _3 G/ j, ]$ c+ O' R" p
确认这2个显示函数都被调用了。
' P) }) A- }6 ^: D8 V# i第1个可能显示的是调试字符串,第2个显示游戏字幕。( N5 e* g- R. @7 o9 T

4 V' d5 e9 ^' s以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。" f! t; y: P# c* V9 I, O
$ R) r, X4 P, e# [
    //v12 这里出错
; }, T* U& k+ S1 Q    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
: b' T# n  u7 t3 t
$ e$ v. s2 z9 R: _输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
- X5 J% b; w: t: q" T" c这种方式显然是有问题的,会影响性能。& `5 |* c! g/ @) \! U1 W+ ^8 b
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
& O1 K' a+ \0 Q, x
- C3 f+ p3 T7 P* @4 [' v
  1. sub_451390_Font1_hk  K2 w% t( V1 h3 S  n$ u( C
  2. sub_451390_Font1_hk3 \* r* q4 r7 u2 @; f3 C0 w  w( W
  3. sub_451599_Font2_hk& d) D  k9 F5 G- A  y6 N
  4. sub_451390_Font1_hk+ E2 ?5 v8 D2 W" C( @6 o1 x
  5. sub_451599_Font2_hk
    5 D1 m9 W$ Q+ z- ~
  6. sub_451599_Font2_hk2 ]4 T4 U9 H0 A4 S5 I
  7. sub_451599_Font2_hk
    * N1 g3 v2 `3 p: q
  8. sub_451599_Font2_hk
    1 B+ l8 j& |, d. }/ C* ]
  9. sub_451599_Font2_hk6 d1 E5 e- R, W9 H8 U! b6 d- @
  10. sub_451599_Font2_hk
    . e9 M2 u! o* g
  11. sub_451599_Font2_hk% f  _9 x- S9 ^! e+ J% d
  12. sub_451599_Font2_hk
    1 V9 ]# K% r) u1 m- p
  13. sub_451599_Font2_hk
复制代码

0 v. Q$ N  u$ Q! V' `/ j3 A8 F/ \. h代码8 A* P* K% }  T; \" K
  1. #include <windows.h>
    + x! x5 E( d9 a9 r, b7 x, n# y
  2. #include <stdio.h>
    % S0 H9 M' f$ H
  3. ) E' {  |5 S$ B# g& o$ F6 {
  4. #include "patch.h"
    ! C$ L( C0 s5 k- M
  5. #include "patchNibiru.h"
    + T* i2 j& }, z: X& A$ z
  6. #include <GL/gl.h>: E- b. g- f/ P

  7. 0 |" _) N7 E) n( `9 e
  8. , i5 ?% B% E% ?, z% Q
  9. DWORD SUB_451810 = 0x00451810;
    7 N: f  ]/ N4 }  f, [0 R: W# ~
  10. DWORD SUB_451390 = 0x00451390;
    9 c" |1 s0 [& U! f( W9 ]5 k4 u
  11. DWORD SUB_451599 = 0x00451599;
    % L" v6 j: _5 Y( F- H" i
  12. 1 Y0 f/ y5 m; U+ v% q! a4 r
  13. HDC currentHdc;
    7 ~7 Z; \$ V+ J; j6 M5 _+ Y
  14. ; z" j3 o1 E7 u% W" Z& p
  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)0 G4 b7 v- }' K' M  q# k
  16. {
    # f; }) a/ n7 d3 I& g, X
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    / v6 h! i; |! b) l
  18.     int v11; // [esp-44Ch] [ebp-44Ch]" V1 d. U9 E2 ^
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    * N, Z  G9 Y! g# m% b
  20.     int v13; // [esp-44h] [ebp-44h]! K) G5 C% H! y2 l
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    7 Z% Q& j4 i6 n: @- e% y
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    . I/ e' C* O2 q* u
  23.     int v16; // [esp-Ch] [ebp-Ch]
    5 T% z4 A2 i9 w) J6 @# M5 c6 H( i
  24.     int* i; // [esp-8h] [ebp-8h]
    . u0 D% w& a5 r- R" F' u

  25. # x+ W: T# L+ i. \
  26.     __asm pushad;
    . M) ~  \5 h  }) V
  27.     FILE* trace = fopen("font_trace.txt", "at");
    9 |9 d% D& Z% y9 ?2 U$ x( D
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");! g/ h$ a5 k1 w% I$ T& q
  29.     fclose(trace);% ~- X: \8 _/ D; V8 L
  30.     __asm popad;+ u, ~3 z% M% W2 T- D7 r7 n# f8 v
  31.     : Q" V* W3 O$ ?( F" x7 u
  32.     //if (!a9)5 b8 P: t0 G  n: d1 c
  33.     //{7 t/ P3 I8 |) h
  34.     //    AddFontResourceA(lpFileName);, C/ w9 o! [1 I, |$ w' _
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    . D5 v' D( q3 A( t
  36.     //        ;/ w- w2 m& {! K  @+ J6 l
  37.     //    *(_BYTE*)i = 0;
    5 i9 V  J7 Q- Q) N9 v
  38.     //}0 w5 ?9 ^" r4 W& v, @8 ]7 C6 [
  39.     //if (a4 == 1)+ m6 {) K- ]4 c0 y3 k' D9 A
  40.     //{/ Q( S: r5 v2 P  O
  41.     //    v16 = 100;
    ' o0 M# u( P+ N! ^8 o# ?9 o
  42.     //}
      q7 C" H. a) m( j5 A% p
  43.     //else if (a4 == 4)7 y( n, i& Q, \- s, i. T$ f
  44.     //{
      \6 Z, G% d1 S
  45.     //    v16 = 700;
    9 ^* z. p+ J$ s' i6 @
  46.     //}2 U9 i9 |2 G, N8 P6 v) O
  47.     //else/ m. h& I# S2 e9 X: W: g" J- g8 g/ M; Q
  48.     //{
    3 _. E& u' b5 S7 ~6 B
  49.     //    v16 = 400;
    8 j* Q  o; \* L1 y
  50.     //}
      a- [* N& @3 S( E) p+ s
  51.     v10 = 1;
    8 P/ B6 W! ?& o& E8 F" T/ s
  52.     //switch (dword_4AA490)# _, ]' ?* n$ |
  53.     //{8 x6 h+ x# Z# Q: Q- ]) R- O
  54.     //case 1250:% _1 F& Y0 L1 n' ~! I
  55.     //    v10 = 238;: e0 Q5 R0 M' E: B. r. K3 R
  56.     //    break;
    : ]9 S' h; J3 D* |+ n8 o! B+ @
  57.     //case 1251:
    , {2 p- \# A0 }9 a' E3 w3 S
  58.     //    v10 = 204;( F. B3 H: E- n2 v' A3 z! d! \
  59.     //    break;! K" o- O1 p1 `& w* p; ?
  60.     //case 1252:
    - d' m- K7 ~8 \7 ~3 X" J
  61.     //    v10 = 0;
    ! E0 Z( s  ^2 B- ^2 h
  62.     //    break;' g7 f: v! d/ q2 l; s0 w" F
  63.     //}
    0 E. h) ^& G* ^! ]
  64.     v15 = glGenLists(256);1 N3 T1 b. g% r+ B
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    + G4 p1 p' o1 l) J
  66.     //if (!v14)" k; H, T9 V. h, E# y" E2 f- \
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);" p7 e$ h" E4 |
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; - k; S' m. A: G% p! Z4 a
  69.     SelectObject(currentHdc, v14);! j. V) c( [  N+ _& x
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);" ~/ ^# W2 F) O$ e( N
  71. $ \  k6 r( ?$ P7 z% z( J
  72.     //v12 这次出错
    * H. g5 {9 u$ R0 m
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    + j* ]$ S7 Y1 c+ y$ z: V6 C+ g
  74.     ( o7 Z# f' b! ?, S- H5 z
  75.     //*(_DWORD*)a2 = v12;
    ( G9 Y: @6 R9 G. l# b. c" }: M
  76.     //*(_DWORD*)a3 = v13;3 }$ ]) R! C  O9 Z7 p  _
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);1 [- k3 R+ _, Q# v8 ^9 ?
  78.     //if (!a9)9 z9 I# ~: M+ n2 J7 F& y# ~
  79.     //    RemoveFontResourceA(lpFileName);
    * G6 p  s* U( ]! f
  80.     return v15;
    ! J7 B. h- H' u, k4 u9 l; n' J
  81. }$ ]' V& X; p  o

  82. - V1 C* Q+ G3 X8 P/ D( P! d% S- I
  83. //使用到
    : v2 a1 H: S& C* w4 h* A5 T
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    5 m, t$ s, {6 K
  85. {5 O9 q4 J- v, A  Q! W
  86.     HFONT h; // [esp+4h] [ebp-8h], \) a( p) _/ ~) i- g% a" v
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    2 @$ e* F' A7 s$ l4 H  v" i+ e

  88. ) n( D1 m( P% B: P3 u& O

  89.   I. K8 g8 e- p( w4 S2 t
  90.     __asm pushad;
    * f5 J$ q' g/ B
  91.     FILE* trace = fopen("font_trace.txt", "at");& V3 {* I2 E( E: X& y! q
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
      ~7 o- U4 l( w* D4 R" z5 _5 ?
  93.     fclose(trace);
    9 r- i& S9 r$ b, o. d
  94.     __asm popad;2 T. c) j7 s1 S# i6 [

  95. ) l' \& ^" B* D6 O) a) A
  96.     currentHdc = hdc;8 ?6 m* g! u( X# p7 |4 m* S
  97.     iCharSet = 1;
    " H$ G5 n8 c5 M: O* I0 ]- l5 {+ z
  98.     GLuint base = glGenLists(256);
    * d# g7 S. Z$ @  ?- E
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");2 a- y. S4 ~, M% r* a
  100.     //if (!h)3 O  V0 q8 K. Z! U& L
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);5 W3 `! f* g  g& X5 m; t
  102.     SelectObject(hdc, h);
    7 K9 U- s# V8 `5 @% E( d7 O$ J
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);+ ~$ E/ O! t( X' M. M8 x3 S3 C
  104. }
    ( j6 O: Y* ]- F3 d  j

  105. " _( y& P8 q9 r/ Y5 g
  106. void __cdecl/ v1 R6 {+ O# t
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    * x- J% s) H# p+ T: t
  108. {
    9 l$ d$ b2 a0 A
  109.     __asm pushad;7 m" z# _/ `; z$ n2 m8 F9 G
  110.     FILE* trace = fopen("sub_trace.txt", "at");0 p" ]0 o) Q" O* W1 t6 `
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    0 Z4 H( C3 w2 ]
  112.     fclose(trace);9 v1 v  @4 b6 E7 p% I
  113.     __asm popad;' B3 A0 C0 X% q' V" c

  114. ( w& _9 Z& z) m& X& g! D
  115.     //return a1;5 H- \* s7 @1 y7 M( U
  116. }
    / u% {3 e. A5 W& {8 o; q8 U
  117. , A7 N) d8 G* w; @
  118. bool
    2 D8 D6 \' X8 J8 ?
  119. ApplyPatchNibiru()
    4 Y: f: M% {% q6 u
  120. {7 _& h8 K; C; C5 O& |
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);6 D* S- J+ X( u
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);* H3 p  J2 L. C/ A/ c
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    % F, H; j3 a! c7 i/ D
  124. " d1 o' A  `. Q1 Z9 {7 U2 B
  125. ! N7 G5 w5 o' ]% _' _! i5 F

  126. " E0 z5 H  I- K  m- b7 @7 g" k
  127.   return true;
    ( F" w7 T% o' q' Q0 K1 [' ^$ n2 L
  128. }( s7 J7 v4 ^( X4 [' X
复制代码

3 y: _! K4 h; P* a7 P) m! I
, d, B) G9 d; M3 w! J* z5 f# o6 ^$ S' v, h
8 O% n' n& ]$ O. S% j7 f, u2 C3 l
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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