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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 + d# ?$ f( o4 e: w

2 [* O7 I% L& T0 R(nibiru.exe 772 KB (790,528 字节))
6 a: \- h0 Y' g
5 J- o& {3 V2 r0 i$ ~将sub_451390,sub_451599 这2个显示函数进行了hook.
6 b' d! y5 z& s4 H) k" z: t确认这2个显示函数都被调用了。, t2 G, v$ `$ Y  [2 v0 x2 s
第1个可能显示的是调试字符串,第2个显示游戏字幕。
2 V* S% U; M, \6 ~0 H/ k) C( q5 d: N# R0 B% c9 _2 V
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。: ~  r3 W$ m9 @4 F* A# y1 N  o

" ^# r' F/ W2 L/ s  s) A5 c    //v12 这里出错
  ~2 G# d: H! e# [3 D/ [    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
# O5 f" x5 f2 d5 r5 q
3 `& F6 ^- R  Y: `% T输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
: w' H; c$ k. I这种方式显然是有问题的,会影响性能。
' M% }  O: N$ k7 B在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
; {/ Z$ o/ X& g1 v
  _. t, J1 S$ c# |! ]! a
  1. sub_451390_Font1_hk
    9 }) L5 v9 |  U& A& r- X
  2. sub_451390_Font1_hk
    8 G  e6 m- L1 t, _
  3. sub_451599_Font2_hk8 d3 T9 T* A! U) ^
  4. sub_451390_Font1_hk
    7 M: E3 J: ?' P$ S' B  q0 j
  5. sub_451599_Font2_hk
    7 s1 E7 S7 p8 t+ K  R$ U" v) c; U
  6. sub_451599_Font2_hk
    7 W$ M% p! A. X6 W; f2 C4 v
  7. sub_451599_Font2_hk7 u6 ^" a  r) ~+ c, {! B4 Q% _
  8. sub_451599_Font2_hk( p1 p! I# t) L, {
  9. sub_451599_Font2_hk
    . w3 q7 I! J4 x7 R% R. H7 S
  10. sub_451599_Font2_hk7 Z& a& Z8 q" ]
  11. sub_451599_Font2_hk3 j: U3 ^" x3 |; u# i
  12. sub_451599_Font2_hk* z$ E5 X% W; j* J
  13. sub_451599_Font2_hk
复制代码

4 d2 A+ h' J! ]% o' N代码
. k* m0 W& [5 I% |. D
  1. #include <windows.h>' H" S6 _* d  q) \0 c
  2. #include <stdio.h>1 N- A: v* {& [3 h1 _" ^6 O9 \

  3. # m3 k) i# B: _3 J" {+ z
  4. #include "patch.h"& g* w6 f8 L8 a1 a2 [. @
  5. #include "patchNibiru.h"0 R9 U& Z' B8 A9 I/ }" G! r( ?0 K: F
  6. #include <GL/gl.h>
    # W' m. ?1 l) D7 R  F
  7. / c, U  K8 i, a* K4 X' |

  8. 9 s( ~0 z7 t9 p/ e" \5 {
  9. DWORD SUB_451810 = 0x00451810;
    9 X, _( T2 a5 X$ m, r
  10. DWORD SUB_451390 = 0x00451390;- E6 U1 Y. ^* H/ @! _7 l& f- u" S( g
  11. DWORD SUB_451599 = 0x00451599;
    # O, }" m: g: Y# \2 ]! J6 F2 K
  12. 1 M. j- A( h# O
  13. HDC currentHdc;
    + V/ Y; t  b' ]
  14. $ X6 g7 K5 O; M' k. ?
  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)1 ]$ m* R' L& b6 |  `
  16. {" N7 i) b& `* ]/ r
  17.     DWORD v10; // [esp-450h] [ebp-450h]/ o1 j7 N/ m& u) u5 w
  18.     int v11; // [esp-44Ch] [ebp-44Ch]! M1 A# C8 U* w8 u
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    . x# B" g0 c- t6 {" H
  20.     int v13; // [esp-44h] [ebp-44h]: v  t$ I( M  q% p5 E5 ?  N
  21.     HFONT v14; // [esp-14h] [ebp-14h]9 U2 g( T/ V1 d9 K
  22.     DWORD v15; // [esp-10h] [ebp-10h]
      r% a+ c/ f: G; d& T
  23.     int v16; // [esp-Ch] [ebp-Ch]; {9 u3 [: X" o/ P$ [. T
  24.     int* i; // [esp-8h] [ebp-8h]
      x4 [% K: W) c- `* F
  25. 6 N* O- f' [" V* Y2 {5 Q# p) j9 i
  26.     __asm pushad;
    / |! ^! i7 n6 P8 ]' _% s0 |
  27.     FILE* trace = fopen("font_trace.txt", "at");) u2 ~% S& N* b  F- `) D
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    " j6 J* q- n1 g7 d) M: p( ^
  29.     fclose(trace);+ |9 P/ ]2 ?$ S$ `8 a
  30.     __asm popad;  S1 K9 G1 D2 I# ~& [0 @
  31.     7 T; h9 k9 u6 ]; V
  32.     //if (!a9)( l. S" _& \/ i6 ~& X; c, z6 M. J2 v" i
  33.     //{& H6 h4 D2 A8 {5 t! ~' {
  34.     //    AddFontResourceA(lpFileName);+ s/ P; w$ i! T' J$ r+ q& j
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))% C# ~, y: b( _! f4 \
  36.     //        ;
    + W! Y; E# [/ ~: U0 E% |; I
  37.     //    *(_BYTE*)i = 0;
    , M( X6 i2 k& I0 e/ Q& \
  38.     //}
    3 D; ?2 v" }6 O, w; S* G: l
  39.     //if (a4 == 1)
    . `+ q9 I0 [8 y2 q& P
  40.     //{, ~; t# L2 w) L% z
  41.     //    v16 = 100;
    ; u: m9 r7 J9 @, Q2 b$ @
  42.     //}
    * F3 a" k: Q" ^" w
  43.     //else if (a4 == 4); p+ v7 S* o& I0 {) U0 z' S8 ?8 i
  44.     //{7 H7 N/ S* N( X( i2 @! V: x4 V9 s' a
  45.     //    v16 = 700;
    ) y$ @6 K0 @  A) j9 h1 e9 Y0 s; H
  46.     //}
    " i5 e6 x/ {# ~: T% k- ^: G# s
  47.     //else8 h7 o$ b. v. J' }% ?/ D
  48.     //{1 l, U/ K6 k9 g; s; G" J/ L
  49.     //    v16 = 400;
    1 Q3 s5 ^, @6 B) g$ k$ D
  50.     //}9 T& L3 ?0 r. J
  51.     v10 = 1;
    : W3 z* p& z( a
  52.     //switch (dword_4AA490)
    ( o3 p) e# ]" G- T+ U  F9 t
  53.     //{+ S/ E3 z. U0 k! e5 ]
  54.     //case 1250:4 @' H: |. o* q5 k) `/ O
  55.     //    v10 = 238;
    ( h# }) a0 F7 u1 d6 S
  56.     //    break;3 _* F( a% F. {0 d
  57.     //case 1251:. U: d7 I3 l+ S5 R6 E
  58.     //    v10 = 204;
    0 e- Z7 B% U* z8 O# V: n
  59.     //    break;
    / [! u6 r3 u& }/ Z% j' i
  60.     //case 1252:. C' k+ R# V2 o9 n  \/ ~
  61.     //    v10 = 0;  A) z5 a! b9 T$ P7 c% D
  62.     //    break;
    ; _1 C) Z$ b, @  e2 _$ j
  63.     //}
    ! _3 ~: K$ ]5 S8 H5 W; t
  64.     v15 = glGenLists(256);
    $ w, ^6 W" k0 H- F- T0 T. Y
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");7 N9 Q4 x( s, J6 I( B$ I; @
  66.     //if (!v14)
    ! G2 W/ S" r+ p5 \, R1 Q
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);) ~; y  Q: V4 c* @, m; k1 K
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    / i4 T  M6 }  Y0 K6 y! K0 u8 y
  69.     SelectObject(currentHdc, v14);
    2 p6 ^% T! ~' |6 p9 \/ f
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    + _! A8 V. }& K& t4 s

  71. & \8 W% }' @/ H6 S
  72.     //v12 这次出错( T( ]+ {% d, i1 d4 A
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);; ]& K- {0 R; ]5 w7 j
  74.     ( o+ O( e8 {/ L
  75.     //*(_DWORD*)a2 = v12;
    0 _; W* U$ i: k0 `! i7 i
  76.     //*(_DWORD*)a3 = v13;: P  y- Z# c* V
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);, S" v. U8 P  I- T/ |
  78.     //if (!a9)
    , Z4 G9 @; t3 D$ K0 ]( D
  79.     //    RemoveFontResourceA(lpFileName);3 V" M) Y$ z9 H8 U2 ^! I- e
  80.     return v15;. l% v5 T$ ~  W" d: G. ~
  81. }
    ! i3 y8 Y- V3 M  ~
  82. / D+ Q2 K1 ~2 X& U1 L
  83. //使用到
    4 [$ o8 {& W6 H, v
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)4 F) `8 w( {3 ?2 h
  85. {7 a9 E7 E+ D$ r2 n
  86.     HFONT h; // [esp+4h] [ebp-8h]% F4 Q- Y) H. r' m# ]4 [
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h], h* \! L* }$ v2 o. ]( Q6 G) o" o

  88. / Y, a- l# u2 j, Q4 M; P

  89. : P2 I0 j5 t6 j! J
  90.     __asm pushad;
    , H! Z) a8 D1 b5 [4 k' o
  91.     FILE* trace = fopen("font_trace.txt", "at");
    + U& V8 C  v% k  ]$ _+ T% V/ w
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    . Q/ Y6 m8 ^) T* C2 S6 p" A7 A5 h/ M, ?
  93.     fclose(trace);' L& b) Y7 o9 C; ]' E" k
  94.     __asm popad;6 z# n, i9 V- T' a9 _/ ]

  95. $ Y" j( C3 ~. N4 G7 s; T
  96.     currentHdc = hdc;0 ?; R. M" P% b+ Z. U* O! ]
  97.     iCharSet = 1;
    9 A1 ^& z/ y7 B- ^0 z+ G7 l
  98.     GLuint base = glGenLists(256);6 O' |  l/ ?- O" m/ E, A" ~
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");) g- p, Q5 |# D3 b6 e
  100.     //if (!h); E2 Y9 j5 T0 \* B% I
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);+ C- U; P- X$ g9 \0 O6 |
  102.     SelectObject(hdc, h);* v3 }, Q- V7 Z& u
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);) ]* i6 b  s7 i/ r/ U) a" @
  104. }) ~6 h( ?  n! \5 `; e
  105. 1 j* @5 Y6 O' t9 n- n/ S
  106. void __cdecl+ `! [* p; W* C/ W5 d2 b' \
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)5 M# k$ B/ H6 ^# I+ Z
  108. {
    7 E9 j' {% @3 a2 R, N6 L4 L. @; i
  109.     __asm pushad;
    3 k( j5 W7 H; A% T
  110.     FILE* trace = fopen("sub_trace.txt", "at");2 n0 E  V( c( k- x# C
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    1 ^6 b( Q: |# z2 H0 R' F
  112.     fclose(trace);/ t6 k/ ]' _1 p( N) B$ r
  113.     __asm popad;( q) ?" M' x2 f. f* F

  114. # V3 M2 }" L7 A, J' I$ a; U0 H# p
  115.     //return a1;
    & u3 o) r: S$ I, {9 |5 _9 Q
  116. }
    # d  e: {/ L, G2 y0 J, I
  117. 8 J. m, M/ ?) E  i' F
  118. bool) T3 W' L+ E  ?( }
  119. ApplyPatchNibiru()+ K+ Y: _+ t# q9 i8 O% a+ B
  120. {7 g# h6 E# E" G8 ?# D) L5 H3 ^
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);: t% y8 [3 k5 f6 A4 \* M
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);3 l6 C3 S- B! K8 V7 \
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);" e9 B3 ~' p8 _

  124.   b* b0 i3 R% e  \

  125. ' K8 B) ?8 |+ |' ^( m& R

  126. - ?; r( Z2 j# ?. R% l4 |2 {0 K, l
  127.   return true;
    ' x+ G. q9 v; n
  128. }% v2 j! m$ y  k' Z; O+ u
复制代码

: q8 m/ k! U1 I/ q
9 y/ c( ]5 I7 }- g
/ h% E: M" w6 I; H4 U
% X+ G' V; v: j, l2 b* R: x
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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