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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
5 a/ v) t# e  D' ?* l1 Z1 v# b0 M
; l: l1 a' ?6 ~% l4 L$ B* G(nibiru.exe 772 KB (790,528 字节)); L) z5 F0 @. o/ j+ ^2 J# q
$ N6 [& N, x" q9 z1 m) W
将sub_451390,sub_451599 这2个显示函数进行了hook.+ o$ v9 x! Z5 G. P. k& `
确认这2个显示函数都被调用了。8 h5 K0 t8 I6 T0 R
第1个可能显示的是调试字符串,第2个显示游戏字幕。
2 o$ _% s) r% F' o' p# o( `- ?- E
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。& ~( v- z3 \+ ^6 R2 L( j+ @

, N9 @* Q) D% ?+ f' `% i    //v12 这里出错
- o" r$ ?* p1 F/ G7 m    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
+ Q& j! C+ E9 N. l5 s3 G7 J* L8 n2 m, U4 w
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
, j: Q2 |9 M1 N; d& J" q# ~这种方式显然是有问题的,会影响性能。: m6 T: F  A( R' f2 p, u3 k2 X/ S
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
/ f  }3 G5 d" M4 J6 g
9 s1 P: l% U& _9 m; z
  1. sub_451390_Font1_hk# Q; F5 T9 Y& C2 d$ n: G/ {
  2. sub_451390_Font1_hk
    % I$ X' U" \; P
  3. sub_451599_Font2_hk% b7 w1 ]' I( L/ p" T
  4. sub_451390_Font1_hk5 Y3 F/ S. i# n, x! m
  5. sub_451599_Font2_hk
    5 \6 z' P: U( |+ c' M* j- n
  6. sub_451599_Font2_hk
    ( A# _# r+ j) G0 N4 m) o
  7. sub_451599_Font2_hk) @% z  X4 Z5 f! h) g
  8. sub_451599_Font2_hk' P" y: T! U9 y+ J$ n1 G" W
  9. sub_451599_Font2_hk
    : [' N3 }' N. S6 ~" G/ c
  10. sub_451599_Font2_hk
    4 p& H% |7 T: W. i
  11. sub_451599_Font2_hk
    2 A# {1 Z4 G( Q
  12. sub_451599_Font2_hk; k+ Z) |$ y9 @" P% d% c. `$ a! f
  13. sub_451599_Font2_hk
复制代码

: |" m) O1 a6 A& Q) J代码0 P# s9 F1 r7 A( y8 r3 u
  1. #include <windows.h>9 E2 |- ~9 L" l- ]9 r) \
  2. #include <stdio.h>
    . C- S. O/ l: l% y: s" x
  3. ( b* Z5 L( v( D, t& n
  4. #include "patch.h"
    7 G7 Z" F3 ?& b( ^6 h
  5. #include "patchNibiru.h"
    , Z) h& t2 i) B3 m7 `" p
  6. #include <GL/gl.h>. {$ X) ?# V) m
  7. 6 M9 J! ~- v0 \/ V. g

  8. " G, p# N# j# P. a# g
  9. DWORD SUB_451810 = 0x00451810;
    ' S" ~7 Q! Q: ?3 N. |  B
  10. DWORD SUB_451390 = 0x00451390;
    * W& a! a% Y) r: J  U
  11. DWORD SUB_451599 = 0x00451599;- u7 e& b6 e, `# C( ?7 k7 t

  12. ; x" K) b6 B- j* z
  13. HDC currentHdc;; K/ [$ w( q1 K& C2 J2 u( a

  14. - g; t2 f5 R5 @- H
  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)7 M: ]8 \$ R* K2 g
  16. {
    + Z  u: s0 g7 ~5 ~8 m
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    3 Z2 a; a+ H* J. `! R- i
  18.     int v11; // [esp-44Ch] [ebp-44Ch]. u3 L* U, A# @5 X8 C: o" t
  19.     int v12; // [esp-4Ch] [ebp-4Ch]( i7 D  o9 v7 }* G, ]
  20.     int v13; // [esp-44h] [ebp-44h]
    ; x0 f; b* K1 H8 q& R. x
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    # q; q  P9 w  O6 \  F
  22.     DWORD v15; // [esp-10h] [ebp-10h]. Y1 N6 U7 l/ e5 f9 g+ I" h3 W
  23.     int v16; // [esp-Ch] [ebp-Ch]. g3 ?5 o2 ]7 ~$ m" J
  24.     int* i; // [esp-8h] [ebp-8h]
    , z& e. f' _- b, U
  25. $ [- }6 f' I, E( b
  26.     __asm pushad;
    7 V% C4 ]! p8 {- F
  27.     FILE* trace = fopen("font_trace.txt", "at");# @5 v7 F1 I0 C
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    7 _" a  w9 t+ s* O
  29.     fclose(trace);
    7 h. V7 i, b& o+ D; e+ L
  30.     __asm popad;
    $ ]. U5 T2 T2 J# l/ A0 G
  31.    
    ( F$ G( r4 v0 _0 @. v
  32.     //if (!a9)
      E8 K# m4 Q2 J% S1 B# I' N. e
  33.     //{
    ! ^7 z. t/ f7 _4 ]
  34.     //    AddFontResourceA(lpFileName);& d/ l8 P9 A/ f! W! O
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    # b- \5 Z' K1 _' t4 Q& w! C2 G' I
  36.     //        ;' Z3 R' j9 v+ n$ k/ i: A0 Q2 a
  37.     //    *(_BYTE*)i = 0;
    3 G4 Y5 m7 s- G) W% ]
  38.     //}
    * [0 z7 W6 P! s: ~) G
  39.     //if (a4 == 1)& I& O1 A8 M! l. c) O, _
  40.     //{$ @9 k: B' r0 E. i! @- a9 Q
  41.     //    v16 = 100;+ i  a* @0 r% [- o
  42.     //}
      Z6 L( h6 A$ r! n
  43.     //else if (a4 == 4)
    1 H) R7 G0 N( @( y
  44.     //{: [) @  t! Z; B! I$ ]
  45.     //    v16 = 700;
    2 U5 v! a" F4 C
  46.     //}: C: d" Z3 S9 {& w- y2 U' j( f& T
  47.     //else8 C  a5 s8 }# }7 W
  48.     //{6 K3 \5 L6 t/ f4 ?5 W
  49.     //    v16 = 400;
    0 ?% R% _: t8 q% r9 q1 x
  50.     //}4 Q  G' |1 `" I5 d% U, [: E5 ^
  51.     v10 = 1;3 |+ Q: e( s( J4 P4 Q' M) G
  52.     //switch (dword_4AA490)
    $ e! \7 l0 O7 b
  53.     //{9 Q5 p' ~6 X' x' L3 d
  54.     //case 1250:
    4 [( A: I% v  E4 W) W0 z
  55.     //    v10 = 238;
    $ f% D7 ?, r6 }. O# a" a$ Z+ s
  56.     //    break;3 F0 ^" f. S, t% p4 r, l
  57.     //case 1251:
    % Y3 s( q- X) N
  58.     //    v10 = 204;- C* k3 A0 B' N; O4 X. k
  59.     //    break;0 j/ n% U( N& T' I
  60.     //case 1252:) j. g# G* X1 g. I
  61.     //    v10 = 0;# R! n$ b( O7 w- ^2 ~0 Z) ?% t* [
  62.     //    break;
    6 \9 y) A# ~  I7 G, R8 H8 {$ r% A
  63.     //}1 ~' Y7 K- Q) K/ T6 Q
  64.     v15 = glGenLists(256);4 Y3 Z+ z6 f& s/ @" n5 ~8 F
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    ; |$ P' D2 T8 G/ X  c' s* K
  66.     //if (!v14)
    . A; f5 [4 f+ P, p  r
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    ( C; R: Y- c- B& _
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    3 M4 z: }' g4 n! X9 k
  69.     SelectObject(currentHdc, v14);
    6 s7 O% @6 ?3 g& U$ {
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    * ~4 D# a5 F4 N, S
  71. 6 @, M7 v$ N, i; l0 ?) S9 D
  72.     //v12 这次出错
    ) O! _7 u# R( |- b
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);7 M0 E" i/ i; U! D' n4 ?/ H  r4 C
  74.     5 k4 n0 l0 Z8 C' I& s  q
  75.     //*(_DWORD*)a2 = v12;
    2 B$ t4 y' A& N/ r- j# m, Q3 V0 N, x& W
  76.     //*(_DWORD*)a3 = v13;0 L( y& d( b6 U% p, w) ^; ]( R
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    ( d0 B1 P- {0 J1 Z
  78.     //if (!a9)
    8 q& }- m$ M" H& O
  79.     //    RemoveFontResourceA(lpFileName);
    * s" j. b0 u' o3 P6 G
  80.     return v15;2 M& c& n2 Q/ C5 s
  81. }; I! G% ], i% u! J* W8 H
  82. + a4 U3 h& u7 b: N3 H+ m2 a
  83. //使用到
    3 |0 o/ r$ d( Q1 o' e
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    ' O1 j# }  N  m6 W6 V
  85. {7 R. @6 X+ R# C3 r
  86.     HFONT h; // [esp+4h] [ebp-8h]5 i# S  B9 `6 `2 A) H
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]8 b+ C' N) [2 D2 D; p! `( J- |0 n. F

  88. / P, y5 y% e0 |% q3 B: F. S# O
  89. ) P- ?  I6 q( }% J  x) L
  90.     __asm pushad;$ C" k$ v0 p9 F2 k4 r) ^, v4 v
  91.     FILE* trace = fopen("font_trace.txt", "at");
    0 Y7 I" r# b1 s7 G3 u
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
      u+ L) Y: f# I- R) I: _. p
  93.     fclose(trace);9 }# a$ Z4 G8 Q- M# a1 m! C" m9 z5 r% U  O3 b
  94.     __asm popad;
    7 [8 i! g4 d) F! O1 l; ^! I8 t
  95.   r2 W# v1 h7 B0 V: ^+ y$ ]
  96.     currentHdc = hdc;
    ; W- E! U, B3 n
  97.     iCharSet = 1;6 `3 f; `% b7 f# \" F& t* [
  98.     GLuint base = glGenLists(256);
    : f1 V, |8 G1 f( \+ F; b* ]
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");2 ]' ^% Y- |+ [; i& U9 T
  100.     //if (!h)
    1 i$ m: }' m& [) p/ \' y
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);7 j+ x+ \5 f6 w& ?5 x6 Q% P6 }
  102.     SelectObject(hdc, h);
    . b, c( p6 p  P# t& C2 X
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    % e' l. M2 v- V8 C) s) a. ^
  104. }
    ; ~  H3 k2 [! A( [- s

  105. 7 P' [9 |% U# W) l9 ?8 r3 x- d) y
  106. void __cdecl+ b  O1 V9 W; C6 {+ K  ]' X& O
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)  \6 Y" g# j7 X# I+ R
  108. {8 t# j; Y6 k' y) J1 }3 @
  109.     __asm pushad;' u. _: s+ ]! @' u/ ~" i5 E9 `
  110.     FILE* trace = fopen("sub_trace.txt", "at");$ S1 {+ [+ ?. k; a- @9 N6 m
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);1 E6 {, c5 m  V! K! ]# p
  112.     fclose(trace);
    ) _& ~# u( F# {" B  o
  113.     __asm popad;, d2 W+ |) G/ ^. a

  114. 5 k2 X9 E) W' |+ ^* G: o! C
  115.     //return a1;/ X0 }# q" x! x4 g) d
  116. }1 x" P# ~& w. A) \, e

  117. 6 e3 I) G2 Z6 v2 C  B
  118. bool! ?# y, h1 A2 X: W9 w. h
  119. ApplyPatchNibiru()
      q% @! U# y' s. e) o% v! V
  120. {3 i8 j1 n8 A0 t7 R* D! a& H1 a0 S0 @" Y9 f
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);4 K8 d6 `, l3 l4 V3 H
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);4 n( ^: O, L: ^' l( T/ W
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    5 `2 N7 A& Q' N, `

  124. % Q& c, Z3 K2 v7 e  E9 N7 I
  125. , L8 Q* n- J% f" ]

  126. ; ^. R) v( L/ t
  127.   return true;% L4 `- T" l$ i9 G/ N1 G
  128. }
    " k7 [% f7 H; W* i+ m5 I! D3 y
复制代码

1 |1 k& E* u- A" M" q7 e- P* `- V! R( V, Z, L
: \3 U/ a' v( v9 R3 Z. @. @$ o  V

/ l5 \+ j1 b$ I0 I4 P/ |$ ^
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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