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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
- ~, B4 r- a* ?# F2 W0 H6 j* ]/ i1 |
  v- S% o! X$ w- d1 F8 W(nibiru.exe 772 KB (790,528 字节))
; Y7 F, {& y- C' u+ _  H& h% e
0 z7 k* C8 S6 f; x, H  d( A% f将sub_451390,sub_451599 这2个显示函数进行了hook.
9 w) I6 d; _4 d1 `7 [5 ^" s" V确认这2个显示函数都被调用了。
, u* D+ y/ R( Y9 {# o! Z! P2 c; q第1个可能显示的是调试字符串,第2个显示游戏字幕。
5 @# K; ~9 n, M4 Q3 y5 N" c0 W
* G0 B( `$ W. }( r& d以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。' u+ C; t' `. J" D# M- Y# W8 v
4 q# Z! L# Q& D" N& R
    //v12 这里出错4 Y7 h3 J, M$ O5 Z% F8 X) f# q
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);/ @. ^" `- l! K- v

! i, h9 c- A4 z7 {输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。5 H" A$ ~, y% W8 z( H
这种方式显然是有问题的,会影响性能。
4 H. r; k- ?3 n8 T  a0 M! t! X4 a在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
$ X/ W& D0 l, F0 t, K: N: s6 R/ S& _# U' P6 }" @
  1. sub_451390_Font1_hk
    9 [$ R$ J2 b. b7 C
  2. sub_451390_Font1_hk- }$ G* Y7 y2 f0 R/ |
  3. sub_451599_Font2_hk
    9 Y7 W7 X$ g9 G
  4. sub_451390_Font1_hk, F6 B/ M( @3 S; k7 s2 f; Q; m
  5. sub_451599_Font2_hk1 c, e. ^) d9 A4 @7 P% r" A; ^9 c2 p
  6. sub_451599_Font2_hk! d4 ]* ]. b1 K* w. x6 C5 g- w/ \
  7. sub_451599_Font2_hk
    4 p( l" |. ]; d2 o) J
  8. sub_451599_Font2_hk4 U) ^; ?: J9 @$ E6 H
  9. sub_451599_Font2_hk
    0 E" @. x+ ~, i8 e
  10. sub_451599_Font2_hk
    ; K( ~& S6 S6 l* p* M5 M0 `
  11. sub_451599_Font2_hk; X# ?4 ^3 ~% G$ E8 l
  12. sub_451599_Font2_hk2 n% z% e) w" [, o* J: X
  13. sub_451599_Font2_hk
复制代码
" S8 C; l1 s' Y7 ~  ?
代码- B* q, ?# z! f7 t
  1. #include <windows.h>
    4 m/ W' c. q# T$ k# v8 S
  2. #include <stdio.h># g& T1 a6 {& {8 O5 w6 I. X

  3. 5 H' l, y) W1 r, y( t7 x6 I# b$ Q
  4. #include "patch.h"
    " }% Y! i, s6 j+ X& _
  5. #include "patchNibiru.h"
    % w, l" ?) _+ y& A3 c
  6. #include <GL/gl.h>
    : ?& K% B$ O% \9 p1 \) m( C

  7. . J' D' l$ }2 q4 f

  8. 4 ~! J2 f( q. E6 D* \, l" J, b
  9. DWORD SUB_451810 = 0x00451810;1 P( e/ Z- O/ r
  10. DWORD SUB_451390 = 0x00451390;9 @6 y6 V7 `" @+ O- Z
  11. DWORD SUB_451599 = 0x00451599;
    % f, J$ P% _9 B

  12. 1 f1 @1 g* Z2 _* ?% o; ~3 T
  13. HDC currentHdc;
    ; w1 r& `  t1 B0 {- e! Q

  14. $ e1 i% m0 v6 z% \
  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)* E1 I3 Z. A4 e
  16. {
    7 u( z! q: g0 o) {9 r/ X$ I
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    / a/ N; z( I' `) Y% [3 f* |; I
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    % t: f  N, Z2 R  x5 y
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    2 s/ s: ~4 G8 o  `4 l  E( i
  20.     int v13; // [esp-44h] [ebp-44h]
    8 m2 B1 d& z; X
  21.     HFONT v14; // [esp-14h] [ebp-14h]5 }* ^* b7 c7 O6 E
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    / X! H- n$ P3 R+ H( _  [6 {# M8 c
  23.     int v16; // [esp-Ch] [ebp-Ch]
    8 i4 N# K3 s- E* v4 w
  24.     int* i; // [esp-8h] [ebp-8h]
    1 w: [6 @  a7 D- @
  25. 5 A8 |' h1 P* S$ c6 A( d
  26.     __asm pushad;0 h# Q" c$ W- _
  27.     FILE* trace = fopen("font_trace.txt", "at");! A+ L* q" I. f7 f1 _
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    7 P! v& r* R/ [9 a+ D5 O
  29.     fclose(trace);
    ) A  y2 `  E5 w$ x7 V
  30.     __asm popad;
    * S* D: b1 ?8 }" s3 T
  31.    
    ) c4 L1 a( A$ W  \% ^
  32.     //if (!a9)8 K' x( p( J. R' M2 _
  33.     //{7 A5 M* D+ ]  D, ~" r
  34.     //    AddFontResourceA(lpFileName);7 q* ]' ?) _; i8 E3 {
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    - I; ^  Z4 s& l: r. x
  36.     //        ;& h3 n, B; h/ Z% N' u, ?
  37.     //    *(_BYTE*)i = 0;
    , s( H) i# O# b8 L
  38.     //}
    % z/ N2 w  G# C" n" T9 _( @! K* G
  39.     //if (a4 == 1)6 X- A4 v8 v/ [9 D* A2 `
  40.     //{& W& U/ @% x! ^
  41.     //    v16 = 100;
    ) j/ ]5 X5 C9 }( X7 V
  42.     //}8 [* K, n1 S" Y. `$ F* O1 V# O
  43.     //else if (a4 == 4)
    : E! Z8 q- K! g' j: q
  44.     //{! D3 m3 I0 u; U* e
  45.     //    v16 = 700;# \8 d  U) j! x
  46.     //}
    9 Z7 k- X: m6 U
  47.     //else  a) o/ \# ?* O1 n, r( X
  48.     //{
    , Q: ?/ S5 _, f) ~0 @
  49.     //    v16 = 400;
    : n  p- f3 ?+ A( T1 f+ d$ y
  50.     //}
    2 F# L1 I! w( _5 d7 r. |! C5 B
  51.     v10 = 1;/ P/ o5 B& i4 ?0 r8 H
  52.     //switch (dword_4AA490); e; b9 L' a) G* t8 v( i" b
  53.     //{0 P. u8 Q+ h+ Y% ]5 E! m
  54.     //case 1250:
    4 v+ g, ?! U" x
  55.     //    v10 = 238;  d; I* Y! V8 M( b1 p/ v
  56.     //    break;5 h( Z3 r9 ~) t4 i! {4 A8 T
  57.     //case 1251:: D" R% Z( {" q* {( s& b2 ^
  58.     //    v10 = 204;5 Z! L3 B% Q; K% J4 T0 `! u& x
  59.     //    break;, n. B! u6 W& S
  60.     //case 1252:$ a2 H- ]2 ]# W' Q
  61.     //    v10 = 0;
    + k: q) S& i) U- A
  62.     //    break;" m- Z: F6 ^. N5 v0 |
  63.     //}
    % F2 r: @  K' A. `0 u6 t
  64.     v15 = glGenLists(256);
    2 t0 d7 C" e& s; h( U! U
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    & S3 l  `- I8 L
  66.     //if (!v14)% l7 W; f% e2 U. z( ~6 S
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);  N7 k6 ~) l! T; H5 l# a9 _
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    ) u& m6 ]/ U9 @
  69.     SelectObject(currentHdc, v14);
    ! V- L6 N+ ^" x+ o( y9 F7 Z: n
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);0 J# y2 [) c5 y7 c

  71. ) I' \1 w2 i" Y8 K! ?8 ]  x* s; C5 ~
  72.     //v12 这次出错6 H7 B( P, F( z1 W# ]+ T9 S7 S4 f
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);- P! w% D  X. C7 p( F
  74.    
    + U6 j, ^. v" f# ^0 d) I
  75.     //*(_DWORD*)a2 = v12;" f0 a' P, z  l; a
  76.     //*(_DWORD*)a3 = v13;
      Z  g; K( B8 u5 L; J+ u
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);8 u/ q" n8 S6 @$ h) l
  78.     //if (!a9): s- L' _4 h8 m( [
  79.     //    RemoveFontResourceA(lpFileName);* C$ I" Y+ T( \) S) Q3 Q1 a  w
  80.     return v15;1 z8 x" Y( {' V. c
  81. }
    / m4 O. M. g& N. w; ~4 s

  82. ; B- O, a: R& J# k
  83. //使用到
    ! g1 F6 d/ N6 w4 R9 d/ b  C' o
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    / y. z& \- s1 t& U5 ~8 W
  85. {
      g* O' @0 {6 T9 c$ M. o2 L
  86.     HFONT h; // [esp+4h] [ebp-8h]. X9 S0 l) ~0 ~( M! W$ {6 C
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]# Q% [& b! P% D- @# Q7 q+ J, |. `
  88. 8 z/ E+ e: X/ n  y) v

  89. 6 L+ D% V) k# W8 T7 @
  90.     __asm pushad;8 K7 X" d! s% E# K
  91.     FILE* trace = fopen("font_trace.txt", "at");
    3 F1 V) f4 ^5 v- F/ M
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    7 H& S+ x: _, V1 H
  93.     fclose(trace);6 v6 t1 \  t# k4 w# R/ Q% ~7 f
  94.     __asm popad;! K) E2 U( @! \9 ^$ U  f. l% k
  95. * S! E2 \' ]2 L0 n) u9 ^! B
  96.     currentHdc = hdc;
    9 M& Y/ m% b; L# E: w! L7 Q! l
  97.     iCharSet = 1;& n1 a1 E( L2 g+ d# X; O
  98.     GLuint base = glGenLists(256);3 d1 [+ I# ^2 a7 ?) L
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    & @" J, s! @4 v  @
  100.     //if (!h)
    - s5 ~2 K, u8 |) r: p) G* V% Y
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);/ Z0 O, l$ Y7 j2 p" g0 a9 ?
  102.     SelectObject(hdc, h);
    ' p( m# y0 `6 v5 J! u. X
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);- k; D0 I" U$ X( E6 \
  104. }
    3 K, d2 k( I- }$ _/ }- F- B" ?

  105. ) I. E6 z( W: o4 B0 K
  106. void __cdecl* x  f6 s# i" h, R  |
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
      |7 K! s! t# L
  108. {
    4 [# Y8 A( W$ w3 j4 h
  109.     __asm pushad;
    ! c. @  B+ ?2 O/ E, [
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    - F7 h/ N( `7 O+ q( g
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);% a/ ?+ @% Z1 f+ W  z  U
  112.     fclose(trace);
    / q- a- f( \9 |( a9 k  L4 @- h
  113.     __asm popad;
    , G. r: }% p, T/ d
  114. + _. [2 \- e% r; x
  115.     //return a1;# t2 C" ]3 }4 r# \( M
  116. }
      V0 z+ ]6 `7 q' i- S  N0 d

  117. : T, G: D, R* C! o+ t6 X6 L+ C
  118. bool
    4 F0 J, T. S& B2 ]/ ^
  119. ApplyPatchNibiru()
    % p, x: M, p1 q! z
  120. {
    " P4 l! |- Z9 e1 A* I7 u% ^, C5 a
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    6 h. e1 i0 W4 V# t3 `
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);( x  ]0 ?7 y0 E- C
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);  H; D3 P+ L8 U
  124. " o) W5 n& d$ w
  125. 8 M& R4 c, U7 b. \2 \' ^
  126. 2 z# q) U* d) N: }: @* Z6 E
  127.   return true;# f* l. Q& t4 j1 J, M
  128. }) \7 {7 I7 R  U* C5 g7 e) f/ B
复制代码
3 @" o2 V9 o( H+ N

7 |* {$ i' M& Z6 z+ p1 |
7 f: W+ ?) Y! ~- J" Z& b8 f' O3 b& s; c$ n) A, 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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